0

I am trying to make an application uninstaller using recyclerview. Everything is working fine but the broadcast receiver doesn't stop receiving even after going to a different application.

I want to unregister when the activity is not visible and register when activity is visible but cannot access activity class from another class (AppsAdapater).

AppsAdapter.java

public class AppsAdapter extends RecyclerView.Adapter<AppsAdapter.ViewHolder>{

Context context1;
List<String> stringList;
IntentFilter intentFilter;
int index;

public AppsAdapter(Context context, List<String> list){

    context1 = context;

    stringList = list;
}

public static class ViewHolder extends RecyclerView.ViewHolder{

    public CardView cardView;
    public ImageView imageView;
    public TextView textView_App_Name;
    public TextView textView_App_Package_Name;

    public ViewHolder (View view){

        super(view);

        cardView = (CardView) view.findViewById(R.id.card_view);
        imageView = (ImageView) view.findViewById(R.id.imageview);
        textView_App_Name = (TextView) view.findViewById(R.id.Apk_Name);
        textView_App_Package_Name = (TextView) view.findViewById(R.id.Apk_Package_Name);
    }
}

@Override
public AppsAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType){

    View view2 = LayoutInflater.from(context1).inflate(R.layout.cardview_layout,parent,false);

    ViewHolder viewHolder = new ViewHolder(view2);

    intentFilter = new IntentFilter();
    intentFilter.addAction(Intent.ACTION_PACKAGE_ADDED);
    intentFilter.addAction(Intent.ACTION_PACKAGE_REMOVED);
    intentFilter.addAction(Intent.ACTION_PACKAGE_REPLACED);
    intentFilter.addDataScheme("package");
    start();

    return viewHolder;
}

BroadcastReceiver br = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {

        if (intent.getAction().equals("android.intent.action.PACKAGE_REMOVED")) {
            Log.e(" BroadcastReceiver ", "onReceive called "
                    + " PACKAGE_REMOVED ");
            Toast.makeText(context, " onReceive !!!! PACKAGE_REMOVED",
                    Toast.LENGTH_LONG).show();
            stringList.remove(index);
            notifyItemRemoved(index);
            notifyItemRangeChanged(index, getItemCount());
        }
    }
};


public void destroyer(){
    context1.unregisterReceiver(br);
}

public void start(){
    context1.registerReceiver(br, intentFilter);
}

@Override
public void onBindViewHolder(ViewHolder viewHolder, final int position){

    ApkInfoExtractor apkInfoExtractor = new ApkInfoExtractor(context1);

    final String ApplicationPackageName = (String) stringList.get(position);

    double ApplicationSize= apkInfoExtractor.GetAppSize(ApplicationPackageName);

    final String ApplicationLabelName = apkInfoExtractor.GetAppName(ApplicationPackageName);
    Drawable drawable = apkInfoExtractor.getAppIconByPackageName(ApplicationPackageName);

    viewHolder.textView_App_Name.setText(ApplicationLabelName);

    viewHolder.textView_App_Package_Name.setText(String.format("%.2f MB", ApplicationSize));

    viewHolder.imageView.setImageDrawable(drawable);

    viewHolder.cardView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            Intent intent = new Intent(Intent.ACTION_DELETE);
            intent.setData(Uri.parse("package:"+ApplicationPackageName));
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            index = position;
            context1.startActivity(intent);

        }
    });
}



@Override
public int getItemCount(){
    return stringList.size();
}
}

ResultActivity.java

enter code herepublic class ResultActivity extends AppCompatActivity {

RecyclerView recyclerView;
RecyclerView.Adapter adapter;
RecyclerView.LayoutManager recyclerViewLayoutManager;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_result);

    recyclerView = (RecyclerView) findViewById(R.id.recycler_view);

    recyclerViewLayoutManager = new GridLayoutManager(ResultActivity.this, 1);

    recyclerView.setLayoutManager(recyclerViewLayoutManager);

    adapter = new AppsAdapter(ResultActivity.this, new ApkInfoExtractor(ResultActivity.this).GetAllInstalledApkInfo());

    recyclerView.setAdapter(adapter);

}

@Override
public void onPause() {
    super.onPause();
    Toast.makeText(this, "onPause", Toast.LENGTH_SHORT).show();
    adapter.destroy();//this line give me a error cannot resolve destroy
}

@Override
protected void onResume() {
    super.onResume();
    Toast.makeText(this, "onResume", Toast.LENGTH_SHORT).show();
    adapter.start();//this line give me a error cannot resolve start
}}

I cannot make those methods static as context must be in non-static. How to access the start() and destroy() methods of AppsAdapter from ResultActivity to register and unregister broadcast? Is there any other way to do it?

I tried to use onResume() and onPaused() in AppsAdapter.java class but it gives me an error.

  • 1
    You need to declare `adapter` as an `AppsAdapter`, rather than plain `RecyclerView.Adapter`, which does not have your methods in it. – Mike M. Jun 14 '20 at 08:33
  • I tried this now, I can access all methods but my app is crashing for some reason. – Akhil Anand Sirra Jun 14 '20 at 08:40
  • 1
    Well, that's a different issue. You'll need to look at [the stack trace](https://stackoverflow.com/a/23353174) to determine the cause of the crash. Lemme know what it says, and I can possibly help you here real quick. If it's something major, though, you might need to post a new question for it. – Mike M. Jun 14 '20 at 08:42
  • 1
    It was a minor error, It is working now. – Akhil Anand Sirra Jun 14 '20 at 08:45

0 Answers0