private void startApp(ApplicationIcon ai, Context context) {
   try {
     Intent appLaunch = new Intent();
     appLaunch.setClassName(ai.getPackageName(), ai.getActivityName());
     appLaunch.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
     context.startActivity(appLaunch);
     if (ctx instanceof HomeActivity) {
       ((HomeActivity) ctx).resetState(); // Self explanatory
     }
   } catch (Exception e) {
     Toast.makeText(context, "Couldn't start this app!", Toast.LENGTH_SHORT).show();
   }
 }
  // Set up specific customIcon with data
  @Override
  public void onBindViewHolder(AppIconHolder viewHolder, int i) {
    final ApplicationIcon ai = apps.get(i);

    // Set title
    viewHolder.title.setText(ai.getName());

    // Set customIcon
    RelativeLayout.LayoutParams rllp =
        new RelativeLayout.LayoutParams((int) iconSize, (int) iconSize);
    rllp.addRule(RelativeLayout.CENTER_HORIZONTAL);
    viewHolder.icon.setLayoutParams(rllp);
    viewHolder.icon.setTag(ai);
    viewHolder.icon.setImageDrawable(null);

    if (!drawableMap.containsKey(ai)) {
      cacheEntry(ai, viewHolder.icon);
    } else {
      viewHolder.icon.setImageDrawable(drawableMap.get(ai));
    }

    // Set launch
    viewHolder.mainView.setOnClickListener(
        new View.OnClickListener() {
          @Override
          public void onClick(View v) {
            startApp(ai, v.getContext());
          }
        });

    // Set drag option
    viewHolder.mainView.setOnLongClickListener(
        new View.OnLongClickListener() {
          @Override
          public boolean onLongClick(View v) {
            // Start drag
            ClipData cd = ClipData.newPlainText("description", "Passing app customIcon");
            v.startDrag(cd, new View.DragShadowBuilder(v.findViewById(R.id.appIconImage)), ai, 0);
            return true;
          }
        });
  }