OSDN Git Service

Extract TOGGLE_START_MENU string to TaskbarIntent.ACTION_TOGGLE_START_MENU
[android-x86/packages-apps-Taskbar.git] / app / src / main / java / com / farmerbb / taskbar / activity / ContextMenuActivity.java
index 4a02d27..3aba1c9 100644 (file)
@@ -38,32 +38,37 @@ import android.os.UserManager;
 import android.preference.Preference;
 import android.preference.PreferenceActivity;
 import android.provider.Settings;
-import android.support.v4.content.LocalBroadcastManager;
-import android.util.DisplayMetrics;
+import androidx.localbroadcastmanager.content.LocalBroadcastManager;
 import android.view.Gravity;
 import android.view.View;
 import android.view.WindowManager;
 
 import com.farmerbb.taskbar.BuildConfig;
-import com.farmerbb.taskbar.MainActivity;
 import com.farmerbb.taskbar.R;
+import com.farmerbb.taskbar.activity.dark.DesktopIconSelectAppActivityDark;
 import com.farmerbb.taskbar.activity.dark.SelectAppActivityDark;
+import com.farmerbb.taskbar.content.TaskbarIntent;
 import com.farmerbb.taskbar.util.AppEntry;
+import com.farmerbb.taskbar.util.ApplicationType;
+import com.farmerbb.taskbar.util.DesktopIconInfo;
+import com.farmerbb.taskbar.util.DisplayInfo;
 import com.farmerbb.taskbar.util.FreeformHackHelper;
 import com.farmerbb.taskbar.util.IconCache;
+import com.farmerbb.taskbar.util.LauncherHelper;
 import com.farmerbb.taskbar.util.MenuHelper;
 import com.farmerbb.taskbar.util.PinnedBlockedApps;
 import com.farmerbb.taskbar.util.SavedWindowSizes;
 import com.farmerbb.taskbar.util.U;
 
+import org.json.JSONArray;
+import org.json.JSONException;
+
 import java.util.List;
 
 public class ContextMenuActivity extends PreferenceActivity implements Preference.OnPreferenceClickListener {
 
-    String packageName;
-    String componentName;
-    String appName;
-    long userId = 0;
+    private AppEntry entry;
+    private DesktopIconInfo desktopIcon;
 
     boolean showStartMenu = false;
     boolean shouldHideTaskbar = false;
@@ -72,10 +77,11 @@ public class ContextMenuActivity extends PreferenceActivity implements Preferenc
     boolean secondaryMenu = false;
     boolean dashboardOrStartMenuAppearing = false;
     boolean contextMenuFix = false;
+    boolean showQuitOption = false;
 
     List<ShortcutInfo> shortcuts;
 
-    private BroadcastReceiver finishReceiver = new BroadcastReceiver() {
+    private BroadcastReceiver dashboardOrStartMenuAppearingReceiver = new BroadcastReceiver() {
         @Override
         public void onReceive(Context context, Intent intent) {
             dashboardOrStartMenuAppearing = true;
@@ -83,8 +89,15 @@ public class ContextMenuActivity extends PreferenceActivity implements Preferenc
         }
     };
 
+    private BroadcastReceiver finishReceiver = new BroadcastReceiver() {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            finish();
+        }
+    };
+
+
     @SuppressLint("RtlHardcoded")
-    @SuppressWarnings("deprecation")
     @Override
     protected void onPostCreate(Bundle savedInstanceState) {
         super.onPostCreate(savedInstanceState);
@@ -92,38 +105,46 @@ public class ContextMenuActivity extends PreferenceActivity implements Preferenc
         LocalBroadcastManager.getInstance(this).sendBroadcast(new Intent("com.farmerbb.taskbar.CONTEXT_MENU_APPEARING"));
         MenuHelper.getInstance().setContextMenuOpen(true);
 
-        boolean isNonAppMenu = !getIntent().hasExtra("package_name") && !getIntent().hasExtra("app_name");
-        showStartMenu = getIntent().getBooleanExtra("launched_from_start_menu", false);
-        isStartButton = isNonAppMenu && getIntent().getBooleanExtra("is_start_button", false);
-        isOverflowMenu = isNonAppMenu && getIntent().getBooleanExtra("is_overflow_menu", false);
-        contextMenuFix = getIntent().hasExtra("context_menu_fix");
+        Bundle args = getIntent().getBundleExtra("args");
+        entry = (AppEntry) args.getSerializable("app_entry");
+        desktopIcon = (DesktopIconInfo) args.getSerializable("desktop_icon");
+
+        showStartMenu = args.getBoolean("launched_from_start_menu", false);
+        isStartButton = entry == null && args.getBoolean("is_start_button", false);
+        isOverflowMenu = entry == null && args.getBoolean("is_overflow_menu", false);
+        contextMenuFix = args.containsKey("context_menu_fix");
+        showQuitOption = !args.getBoolean("dont_show_quit", false);
 
         // Determine where to position the dialog on screen
         WindowManager.LayoutParams params = getWindow().getAttributes();
-        DisplayMetrics metrics = U.getRealDisplayMetrics(this);
+        
+        if(args.containsKey("x") && args.containsKey("y"))
+            U.applyDisplayCutoutModeTo(params);
+
+        DisplayInfo display = U.getDisplayInfo(this);
 
         int statusBarHeight = 0;
         int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
         if(resourceId > 0)
             statusBarHeight = getResources().getDimensionPixelSize(resourceId);
 
-        if(showStartMenu) {
-            int x = getIntent().getIntExtra("x", 0);
-            int y = getIntent().getIntExtra("y", 0);
-            int offset = getResources().getDimensionPixelSize(isOverflowMenu ? R.dimen.context_menu_offset_overflow : R.dimen.context_menu_offset);
+        if(showStartMenu || desktopIcon != null) {
+            int x = args.getInt("x", 0);
+            int y = args.getInt("y", 0);
+            int offset = getResources().getDimensionPixelSize(isOverflowMenu ? R.dimen.tb_context_menu_offset_overflow : R.dimen.tb_context_menu_offset);
 
             switch(U.getTaskbarPosition(this)) {
                 case "bottom_left":
                 case "bottom_vertical_left":
                     params.gravity = Gravity.BOTTOM | Gravity.LEFT;
                     params.x = x;
-                    params.y = metrics.heightPixels - y - offset;
+                    params.y = display.height - y - offset;
                     break;
                 case "bottom_right":
                 case "bottom_vertical_right":
                     params.gravity = Gravity.BOTTOM | Gravity.LEFT;
-                    params.x = x - getResources().getDimensionPixelSize(R.dimen.context_menu_width) + offset + offset;
-                    params.y = metrics.heightPixels - y - offset;
+                    params.x = x - getResources().getDimensionPixelSize(R.dimen.tb_context_menu_width) + offset + offset;
+                    params.y = display.height - y - offset;
                     break;
                 case "top_left":
                 case "top_vertical_left":
@@ -134,16 +155,18 @@ public class ContextMenuActivity extends PreferenceActivity implements Preferenc
                 case "top_right":
                 case "top_vertical_right":
                     params.gravity = Gravity.TOP | Gravity.LEFT;
-                    params.x = x - getResources().getDimensionPixelSize(R.dimen.context_menu_width) + offset + offset;
+                    params.x = x - getResources().getDimensionPixelSize(R.dimen.tb_context_menu_width) + offset + offset;
                     params.y = y - offset + statusBarHeight;
                     break;
             }
         } else {
-            LocalBroadcastManager.getInstance(this).sendBroadcast(new Intent("com.farmerbb.taskbar.HIDE_START_MENU"));
+            LocalBroadcastManager
+                    .getInstance(this)
+                    .sendBroadcast(new Intent(TaskbarIntent.ACTION_HIDE_START_MENU));
 
-            int x = getIntent().getIntExtra("x", metrics.widthPixels);
-            int y = getIntent().getIntExtra("y", metrics.heightPixels);
-            int offset = getResources().getDimensionPixelSize(R.dimen.icon_size);
+            int x = args.getInt("x", display.width);
+            int y = args.getInt("y", display.height);
+            int offset = getResources().getDimensionPixelSize(R.dimen.tb_icon_size);
 
             switch(U.getTaskbarPosition(this)) {
                 case "bottom_left":
@@ -154,17 +177,17 @@ public class ContextMenuActivity extends PreferenceActivity implements Preferenc
                 case "bottom_vertical_left":
                     params.gravity = Gravity.BOTTOM | Gravity.LEFT;
                     params.x = offset;
-                    params.y = metrics.heightPixels - y - (isStartButton ? 0 : offset);
+                    params.y = display.height - y - (isStartButton ? 0 : offset);
                     break;
                 case "bottom_right":
                     params.gravity = Gravity.BOTTOM | Gravity.RIGHT;
-                    params.x = metrics.widthPixels - x;
+                    params.x = display.width - x;
                     params.y = offset;
                     break;
                 case "bottom_vertical_right":
                     params.gravity = Gravity.BOTTOM | Gravity.RIGHT;
                     params.x = offset;
-                    params.y = metrics.heightPixels - y - (isStartButton ? 0 : offset);
+                    params.y = display.height - y - (isStartButton ? 0 : offset);
                     break;
                 case "top_left":
                     params.gravity = Gravity.TOP | Gravity.LEFT;
@@ -178,7 +201,7 @@ public class ContextMenuActivity extends PreferenceActivity implements Preferenc
                     break;
                 case "top_right":
                     params.gravity = Gravity.TOP | Gravity.RIGHT;
-                    params.x = metrics.widthPixels - x;
+                    params.x = display.width - x;
                     params.y = offset;
                     break;
                 case "top_vertical_right":
@@ -188,13 +211,21 @@ public class ContextMenuActivity extends PreferenceActivity implements Preferenc
                     break;
             }
 
-            if(!U.getTaskbarPosition(this).contains("vertical") && (params.x > metrics.widthPixels / 2))
-                params.x = params.x - getResources().getDimensionPixelSize(R.dimen.context_menu_width) + offset;
+            if(!U.getTaskbarPosition(this).contains("vertical") && (params.x > display.width / 2))
+                params.x = params.x - getResources().getDimensionPixelSize(R.dimen.tb_context_menu_width) + offset;
         }
 
-        params.width = getResources().getDimensionPixelSize(R.dimen.context_menu_width);
+        params.width = getResources().getDimensionPixelSize(R.dimen.tb_context_menu_width);
         params.dimAmount = 0;
 
+        if(U.isChromeOs(this) && U.getTaskbarPosition(this).contains("bottom")) {
+            SharedPreferences pref = U.getSharedPreferences(this);
+
+            if(pref.getBoolean("chrome_os_context_menu_fix", true)
+                    && !pref.getBoolean("has_caption", false))
+                params.y = params.y - getResources().getDimensionPixelSize(R.dimen.tb_caption_offset);
+        }
+
         getWindow().setAttributes(params);
 
         if(U.isChromeOs(this) && Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1)
@@ -209,63 +240,80 @@ public class ContextMenuActivity extends PreferenceActivity implements Preferenc
         intentFilter.addAction("com.farmerbb.taskbar.START_MENU_APPEARING");
         intentFilter.addAction("com.farmerbb.taskbar.DASHBOARD_APPEARING");
 
-        LocalBroadcastManager.getInstance(this).registerReceiver(finishReceiver, intentFilter);
+        LocalBroadcastManager.getInstance(this).registerReceiver(dashboardOrStartMenuAppearingReceiver, intentFilter);
+        LocalBroadcastManager.getInstance(this).registerReceiver(finishReceiver, new IntentFilter("com.farmerbb.taskbar.HIDE_CONTEXT_MENU"));
     }
 
     @SuppressWarnings("deprecation")
     private void generateMenu() {
+        SharedPreferences pref = U.getSharedPreferences(this);
+
         if(isStartButton) {
-            addPreferencesFromResource(R.xml.pref_context_menu_open_settings);
+            addPreferencesFromResource(R.xml.tb_pref_context_menu_open_settings);
             findPreference("open_taskbar_settings").setOnPreferenceClickListener(this);
             findPreference("start_menu_apps").setOnPreferenceClickListener(this);
 
-            if(U.launcherIsDefault(this) && FreeformHackHelper.getInstance().isInFreeformWorkspace()) {
-                addPreferencesFromResource(R.xml.pref_context_menu_change_wallpaper);
+            if(pref.getBoolean("freeform_hack", false)
+                    && !U.isDesktopIconsEnabled(this)
+                    && ((U.launcherIsDefault(this)
+                    && !U.isOverridingFreeformHack(this, false)
+                    && FreeformHackHelper.getInstance().isInFreeformWorkspace())
+                    || (U.isOverridingFreeformHack(this, false)
+                    && LauncherHelper.getInstance().isOnHomeScreen()))) {
+                addPreferencesFromResource(R.xml.tb_pref_context_menu_change_wallpaper);
                 findPreference("change_wallpaper").setOnPreferenceClickListener(this);
             }
 
-            if(!getIntent().getBooleanExtra("dont_show_quit", false)) {
-                addPreferencesFromResource(R.xml.pref_context_menu_quit);
+            if(showQuitOption) {
+                addPreferencesFromResource(R.xml.tb_pref_context_menu_quit);
                 findPreference("quit_taskbar").setOnPreferenceClickListener(this);
             }
         } else if(isOverflowMenu) {
             if(getResources().getConfiguration().screenWidthDp >= 600
                     && Build.VERSION.SDK_INT <= Build.VERSION_CODES.M)
-                setTitle(R.string.tools);
+                setTitle(R.string.tb_tools);
             else {
-                addPreferencesFromResource(R.xml.pref_context_menu_header);
-                findPreference("header").setTitle(R.string.tools);
+                addPreferencesFromResource(R.xml.tb_pref_context_menu_header);
+                findPreference("header").setTitle(R.string.tb_tools);
             }
 
-            addPreferencesFromResource(R.xml.pref_context_menu_overflow);
+            addPreferencesFromResource(R.xml.tb_pref_context_menu_overflow);
             findPreference("volume").setOnPreferenceClickListener(this);
             findPreference("system_settings").setOnPreferenceClickListener(this);
-            findPreference("lock_device").setOnPreferenceClickListener(this);
-            findPreference("power_menu").setOnPreferenceClickListener(this);
+
+            if(!U.isLibrary(this))
+                findPreference("power_menu").setOnPreferenceClickListener(this);
+            else
+                getPreferenceScreen().removePreference(findPreference("power_menu"));
+
+            if(!U.isLibrary(this) && Build.VERSION.SDK_INT >= Build.VERSION_CODES.P)
+                findPreference("lock_device").setOnPreferenceClickListener(this);
+            else
+                getPreferenceScreen().removePreference(findPreference("lock_device"));
 
             if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
                 findPreference("file_manager").setOnPreferenceClickListener(this);
             else
                 getPreferenceScreen().removePreference(findPreference("file_manager"));
+        } else if(desktopIcon != null && entry == null) {
+            addPreferencesFromResource(R.xml.tb_pref_context_menu_desktop_icons);
+            findPreference("add_icon_to_desktop").setOnPreferenceClickListener(this);
+            findPreference("arrange_icons").setOnPreferenceClickListener(this);
+            findPreference("sort_by_name").setOnPreferenceClickListener(this);
+            findPreference("change_wallpaper").setOnPreferenceClickListener(this);
         } else {
-            appName = getIntent().getStringExtra("app_name");
-            packageName = getIntent().getStringExtra("package_name");
-            componentName = getIntent().getStringExtra("component_name");
-            userId = getIntent().getLongExtra("user_id", 0);
-
             if(getResources().getConfiguration().screenWidthDp >= 600
                     && Build.VERSION.SDK_INT <= Build.VERSION_CODES.M)
-                setTitle(appName);
+                setTitle(entry.getLabel());
             else {
-                addPreferencesFromResource(R.xml.pref_context_menu_header);
-                findPreference("header").setTitle(appName);
+                addPreferencesFromResource(R.xml.tb_pref_context_menu_header);
+                findPreference("header").setTitle(entry.getLabel());
             }
 
-            SharedPreferences pref = U.getSharedPreferences(this);
-            if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.N
+            if(U.hasFreeformSupport(this)
                     && pref.getBoolean("freeform_hack", false)
-                    && !U.isGame(this, packageName)) {
-                addPreferencesFromResource(R.xml.pref_context_menu_show_window_sizes);
+                    && !U.isGame(this, entry.getPackageName())) {
+                addPreferencesFromResource(R.xml.tb_pref_context_menu_show_window_sizes);
                 findPreference("show_window_sizes").setOnPreferenceClickListener(this);
             }
 
@@ -273,7 +321,7 @@ public class ContextMenuActivity extends PreferenceActivity implements Preferenc
                 int shortcutCount = getLauncherShortcuts();
 
                 if(shortcutCount > 1) {
-                    addPreferencesFromResource(R.xml.pref_context_menu_shortcuts);
+                    addPreferencesFromResource(R.xml.tb_pref_context_menu_shortcuts);
                     findPreference("app_shortcuts").setOnPreferenceClickListener(this);
                 } else if(shortcutCount == 1)
                     generateShortcuts();
@@ -284,34 +332,38 @@ public class ContextMenuActivity extends PreferenceActivity implements Preferenc
             homeIntent.addCategory(Intent.CATEGORY_HOME);
             ResolveInfo defaultLauncher = pm.resolveActivity(homeIntent, PackageManager.MATCH_DEFAULT_ONLY);
 
-            if(!packageName.contains(BuildConfig.BASE_APPLICATION_ID)
-                    && !packageName.equals(defaultLauncher.activityInfo.packageName)) {
+            if(desktopIcon != null) {
+                addPreferencesFromResource(R.xml.tb_pref_context_menu_remove_desktop_icon);
+                findPreference("arrange_icons").setOnPreferenceClickListener(this);
+                findPreference("remove_desktop_icon").setOnPreferenceClickListener(this);
+            } else if(!entry.getPackageName().contains(BuildConfig.BASE_APPLICATION_ID)
+                    && !entry.getPackageName().equals(defaultLauncher.activityInfo.packageName)) {
                 PinnedBlockedApps pba = PinnedBlockedApps.getInstance(this);
 
-                if(pba.isPinned(componentName)) {
-                    addPreferencesFromResource(R.xml.pref_context_menu_pin);
+                if(pba.isPinned(entry.getComponentName())) {
+                    addPreferencesFromResource(R.xml.tb_pref_context_menu_pin);
                     findPreference("pin_app").setOnPreferenceClickListener(this);
-                    findPreference("pin_app").setTitle(R.string.unpin_app);
-                } else if(pba.isBlocked(componentName)) {
-                    addPreferencesFromResource(R.xml.pref_context_menu_block);
+                    findPreference("pin_app").setTitle(R.string.tb_unpin_app);
+                } else if(pba.isBlocked(entry.getComponentName())) {
+                    addPreferencesFromResource(R.xml.tb_pref_context_menu_block);
                     findPreference("block_app").setOnPreferenceClickListener(this);
-                    findPreference("block_app").setTitle(R.string.unblock_app);
+                    findPreference("block_app").setTitle(R.string.tb_unblock_app);
                 } else {
                     final int MAX_NUM_OF_COLUMNS = U.getMaxNumOfEntries(this);
 
                     if(pba.getPinnedApps().size() < MAX_NUM_OF_COLUMNS) {
-                        addPreferencesFromResource(R.xml.pref_context_menu_pin);
+                        addPreferencesFromResource(R.xml.tb_pref_context_menu_pin);
                         findPreference("pin_app").setOnPreferenceClickListener(this);
-                        findPreference("pin_app").setTitle(R.string.pin_app);
+                        findPreference("pin_app").setTitle(R.string.tb_pin_app);
                     }
 
-                    addPreferencesFromResource(R.xml.pref_context_menu_block);
+                    addPreferencesFromResource(R.xml.tb_pref_context_menu_block);
                     findPreference("block_app").setOnPreferenceClickListener(this);
-                    findPreference("block_app").setTitle(R.string.block_app);
+                    findPreference("block_app").setTitle(R.string.tb_block_app);
                 }
             }
 
-            addPreferencesFromResource(R.xml.pref_context_menu);
+            addPreferencesFromResource(R.xml.tb_pref_context_menu);
 
             findPreference("app_info").setOnPreferenceClickListener(this);
             findPreference("uninstall").setOnPreferenceClickListener(this);
@@ -320,7 +372,7 @@ public class ContextMenuActivity extends PreferenceActivity implements Preferenc
 
     @SuppressWarnings("deprecation")
     private void generateShortcuts() {
-        addPreferencesFromResource(R.xml.pref_context_menu_shortcut_list);
+        addPreferencesFromResource(R.xml.tb_pref_context_menu_shortcut_list);
         switch(shortcuts.size()) {
             case 5:
                 findPreference("shortcut_5").setTitle(getShortcutTitle(shortcuts.get(4)));
@@ -357,7 +409,7 @@ public class ContextMenuActivity extends PreferenceActivity implements Preferenc
     private void generateWindowSizes() {
         getPreferenceScreen().removeAll();
 
-        addPreferencesFromResource(R.xml.pref_context_menu_window_size_list);
+        addPreferencesFromResource(R.xml.tb_pref_context_menu_window_size_list);
         findPreference("window_size_standard").setOnPreferenceClickListener(this);
         findPreference("window_size_large").setOnPreferenceClickListener(this);
         findPreference("window_size_fullscreen").setOnPreferenceClickListener(this);
@@ -365,7 +417,7 @@ public class ContextMenuActivity extends PreferenceActivity implements Preferenc
         findPreference("window_size_half_right").setOnPreferenceClickListener(this);
         findPreference("window_size_phone_size").setOnPreferenceClickListener(this);
 
-        String windowSizePref = SavedWindowSizes.getInstance(this).getWindowSize(this, packageName);
+        String windowSizePref = SavedWindowSizes.getInstance(this).getWindowSize(this, entry.getPackageName());
         CharSequence title = findPreference("window_size_" + windowSizePref).getTitle();
         findPreference("window_size_" + windowSizePref).setTitle('\u2713' + " " + title);
     }
@@ -376,32 +428,40 @@ public class ContextMenuActivity extends PreferenceActivity implements Preferenc
     public boolean onPreferenceClick(Preference p) {
         UserManager userManager = (UserManager) getSystemService(USER_SERVICE);
         LauncherApps launcherApps = (LauncherApps) getSystemService(LAUNCHER_APPS_SERVICE);
-        boolean appIsValid = isStartButton || isOverflowMenu ||
-                !launcherApps.getActivityList(getIntent().getStringExtra("package_name"),
-                        userManager.getUserForSerialNumber(userId)).isEmpty();
+        boolean appIsValid = isStartButton || isOverflowMenu || desktopIcon != null ||
+                (entry != null && !launcherApps.getActivityList(entry.getPackageName(),
+                        userManager.getUserForSerialNumber(entry.getUserId(this))).isEmpty());
+        secondaryMenu = false;
 
         if(appIsValid) switch(p.getKey()) {
             case "app_info":
-                U.launchApp(this, () -> launcherApps.startAppDetailsActivity(ComponentName.unflattenFromString(componentName), userManager.getUserForSerialNumber(userId), null, null));
+                U.launchApp(this, () ->
+                        launcherApps.startAppDetailsActivity(
+                                ComponentName.unflattenFromString(entry.getComponentName()),
+                                userManager.getUserForSerialNumber(entry.getUserId(this)),
+                                null,
+                                U.getActivityOptionsBundle(this, ApplicationType.APP_PORTRAIT, getListView().getChildAt(p.getOrder()))));
 
                 showStartMenu = false;
                 shouldHideTaskbar = true;
                 contextMenuFix = false;
                 break;
             case "uninstall":
-                if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.N && isInMultiWindowMode()) {
-                    Intent intent2 = new Intent(ContextMenuActivity.this, DummyActivity.class);
-                    intent2.putExtra("uninstall", packageName);
-                    intent2.putExtra("user_id", userId);
+                if(U.hasFreeformSupport(this) && isInMultiWindowMode()) {
+                    Intent intent2 = new Intent(this, DummyActivity.class);
+                    intent2.putExtra("uninstall", entry.getPackageName());
+                    intent2.putExtra("user_id", entry.getUserId(this));
 
-                    startActivity(intent2);
+                    try {
+                        startActivity(intent2);
+                    } catch (IllegalArgumentException e) { /* Gracefully fail */ }
                 } else {
-                    Intent intent2 = new Intent(Intent.ACTION_DELETE, Uri.parse("package:" + packageName));
-                    intent2.putExtra(Intent.EXTRA_USER, userManager.getUserForSerialNumber(userId));
+                    Intent intent2 = new Intent(Intent.ACTION_DELETE, Uri.parse("package:" + entry.getPackageName()));
+                    intent2.putExtra(Intent.EXTRA_USER, userManager.getUserForSerialNumber(entry.getUserId(this)));
 
                     try {
                         startActivity(intent2);
-                    } catch (ActivityNotFoundException e) { /* Gracefully fail */ }
+                    } catch (ActivityNotFoundException | IllegalArgumentException e) { /* Gracefully fail */ }
                 }
 
                 showStartMenu = false;
@@ -412,7 +472,11 @@ public class ContextMenuActivity extends PreferenceActivity implements Preferenc
                 U.launchApp(this, () -> {
                     Intent intent2 = new Intent(this, MainActivity.class);
                     intent2.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
-                    startActivity(intent2);
+
+                    try {
+                        startActivity(intent2,
+                                U.getActivityOptionsBundle(this, ApplicationType.APP_PORTRAIT, getListView().getChildAt(p.getOrder())));
+                    } catch (IllegalArgumentException e) { /* Gracefully fail */ }
                 });
 
                 showStartMenu = false;
@@ -430,50 +494,43 @@ public class ContextMenuActivity extends PreferenceActivity implements Preferenc
                 break;
             case "pin_app":
                 PinnedBlockedApps pba = PinnedBlockedApps.getInstance(this);
-                if(pba.isPinned(componentName))
-                    pba.removePinnedApp(this, componentName);
+                if(pba.isPinned(entry.getComponentName()))
+                    pba.removePinnedApp(this, entry.getComponentName());
                 else {
                     Intent intent = new Intent();
-                    intent.setComponent(ComponentName.unflattenFromString(componentName));
+                    intent.setComponent(ComponentName.unflattenFromString(entry.getComponentName()));
 
-                    LauncherActivityInfo appInfo = launcherApps.resolveActivity(intent, userManager.getUserForSerialNumber(userId));
+                    LauncherActivityInfo appInfo = launcherApps.resolveActivity(intent, userManager.getUserForSerialNumber(entry.getUserId(this)));
                     if(appInfo != null) {
                         AppEntry newEntry = new AppEntry(
-                                packageName,
-                                componentName,
-                                appName,
-                                IconCache.getInstance(this).getIcon(this, getPackageManager(), appInfo),
+                                entry.getPackageName(),
+                                entry.getComponentName(),
+                                entry.getLabel(),
+                                IconCache.getInstance(this).getIcon(this, appInfo),
                                 true);
 
-                        newEntry.setUserId(userId);
+                        newEntry.setUserId(entry.getUserId(this));
                         pba.addPinnedApp(this, newEntry);
                     }
                 }
                 break;
             case "block_app":
                 PinnedBlockedApps pba2 = PinnedBlockedApps.getInstance(this);
-                if(pba2.isBlocked(componentName))
-                    pba2.removeBlockedApp(this, componentName);
-                else {
-                    pba2.addBlockedApp(this, new AppEntry(
-                            packageName,
-                            componentName,
-                            appName,
-                            null,
-                            false));
-                }
+                if(pba2.isBlocked(entry.getComponentName()))
+                    pba2.removeBlockedApp(this, entry.getComponentName());
+                else
+                    pba2.addBlockedApp(this, entry);
                 break;
             case "show_window_sizes":
                 generateWindowSizes();
 
-                if(U.isOPreview()) {
-                    U.showToast(this, R.string.window_sizes_not_available);
-                }
+                if(U.hasBrokenSetLaunchBoundsApi())
+                    U.showToastLong(this, R.string.tb_window_sizes_not_available);
 
                 getListView().setOnItemLongClickListener((parent, view, position, id) -> {
                     String[] windowSizes = { "standard", "large", "fullscreen", "half_left", "half_right", "phone_size" };
 
-                    SavedWindowSizes.getInstance(ContextMenuActivity.this).setWindowSize(ContextMenuActivity.this, packageName, windowSizes[position]);
+                    SavedWindowSizes.getInstance(this).setWindowSize(this, entry.getPackageName(), windowSizes[position]);
 
                     generateWindowSizes();
                     return true;
@@ -491,10 +548,19 @@ public class ContextMenuActivity extends PreferenceActivity implements Preferenc
 
                 SharedPreferences pref2 = U.getSharedPreferences(this);
                 if(pref2.getBoolean("save_window_sizes", true)) {
-                    SavedWindowSizes.getInstance(this).setWindowSize(this, packageName, windowSize);
+                    SavedWindowSizes.getInstance(this).setWindowSize(this, entry.getPackageName(), windowSize);
                 }
 
-                U.launchApp(getApplicationContext(), packageName, componentName, userId, windowSize, false, true);
+                U.launchApp(
+                        getApplicationContext(),
+                        entry,
+                        windowSize,
+                        false,
+                        true,
+                        getListView().getChildAt(p.getOrder()));
+
+                if(U.hasBrokenSetLaunchBoundsApi())
+                    U.cancelToast();
 
                 showStartMenu = false;
                 shouldHideTaskbar = true;
@@ -511,7 +577,11 @@ public class ContextMenuActivity extends PreferenceActivity implements Preferenc
             case "shortcut_3":
             case "shortcut_4":
             case "shortcut_5":
-                U.startShortcut(getApplicationContext(), packageName, componentName, shortcuts.get(Integer.parseInt(p.getKey().replace("shortcut_", "")) - 1));
+                U.startShortcut(
+                        getApplicationContext(),
+                        entry,
+                        shortcuts.get(Integer.parseInt(p.getKey().replace("shortcut_", "")) - 1),
+                        getListView().getChildAt(p.getOrder()));
 
                 showStartMenu = false;
                 shouldHideTaskbar = true;
@@ -530,15 +600,18 @@ public class ContextMenuActivity extends PreferenceActivity implements Preferenc
                         break;
                 }
 
-                if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.N
+                if(U.hasFreeformSupport(this)
                         && pref3.getBoolean("freeform_hack", false)
                         && intent != null && isInMultiWindowMode()) {
                     intent.putExtra("no_shadow", true);
                     intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT);
 
-                    U.launchAppMaximized(getApplicationContext(), intent);
-                } else
-                    startActivity(intent);
+                    U.startActivityMaximized(getApplicationContext(), intent);
+                } else {
+                    try {
+                        startActivity(intent);
+                    } catch (IllegalArgumentException e) { /* Gracefully fail */ }
+                }
 
                 showStartMenu = false;
                 shouldHideTaskbar = true;
@@ -556,7 +629,9 @@ public class ContextMenuActivity extends PreferenceActivity implements Preferenc
                 U.launchApp(this, () -> {
                     Intent fileManagerIntent;
 
-                    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.N)
+                    if(Build.VERSION.SDK_INT > Build.VERSION_CODES.N_MR1)
+                        fileManagerIntent = new Intent(Intent.ACTION_VIEW);
+                    else if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.N)
                         fileManagerIntent = new Intent("android.provider.action.BROWSE");
                     else {
                         fileManagerIntent = new Intent("android.provider.action.BROWSE_DOCUMENT_ROOT");
@@ -568,10 +643,11 @@ public class ContextMenuActivity extends PreferenceActivity implements Preferenc
                     fileManagerIntent.setData(Uri.parse("content://com.android.externalstorage.documents/root/primary"));
 
                     try {
-                        startActivity(fileManagerIntent);
+                        startActivity(fileManagerIntent,
+                                U.getActivityOptionsBundle(this, ApplicationType.APP_PORTRAIT, getListView().getChildAt(p.getOrder())));
                     } catch (ActivityNotFoundException e) {
-                        U.showToast(this, R.string.lock_device_not_supported);
-                    }
+                        U.showToast(this, R.string.tb_lock_device_not_supported);
+                    } catch (IllegalArgumentException e) { /* Gracefully fail */ }
                 });
 
                 showStartMenu = false;
@@ -584,10 +660,11 @@ public class ContextMenuActivity extends PreferenceActivity implements Preferenc
                     settingsIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
 
                     try {
-                        startActivity(settingsIntent);
+                        startActivity(settingsIntent,
+                                U.getActivityOptionsBundle(this, ApplicationType.APP_PORTRAIT, getListView().getChildAt(p.getOrder())));
                     } catch (ActivityNotFoundException e) {
-                        U.showToast(this, R.string.lock_device_not_supported);
-                    }
+                        U.showToast(this, R.string.tb_lock_device_not_supported);
+                    } catch (IllegalArgumentException e) { /* Gracefully fail */ }
                 });
 
                 showStartMenu = false;
@@ -608,15 +685,79 @@ public class ContextMenuActivity extends PreferenceActivity implements Preferenc
                 shouldHideTaskbar = true;
                 contextMenuFix = false;
                 break;
+            case "add_icon_to_desktop":
+                Intent intent2 = null;
+
+                SharedPreferences pref4 = U.getSharedPreferences(this);
+                switch(pref4.getString("theme", "light")) {
+                    case "light":
+                        intent2 = new Intent(this, DesktopIconSelectAppActivity.class);
+                        break;
+                    case "dark":
+                        intent2 = new Intent(this, DesktopIconSelectAppActivityDark.class);
+                        break;
+                }
+
+                if(intent2 != null)
+                    intent2.putExtra("desktop_icon", desktopIcon);
+
+                if(U.hasFreeformSupport(this)
+                        && pref4.getBoolean("freeform_hack", false)
+                        && intent2 != null && isInMultiWindowMode()) {
+                    intent2.putExtra("no_shadow", true);
+                    intent2.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT);
+
+                    U.startActivityMaximized(getApplicationContext(), intent2);
+                } else {
+                    try {
+                        startActivity(intent2);
+                    } catch (IllegalArgumentException e) { /* Gracefully fail */ }
+                }
+
+                showStartMenu = false;
+                shouldHideTaskbar = true;
+                contextMenuFix = false;
+                break;
+            case "arrange_icons":
+                LocalBroadcastManager.getInstance(this).sendBroadcast(new Intent("com.farmerbb.taskbar.ENTER_ICON_ARRANGE_MODE"));
+                break;
+            case "sort_by_name":
+                LocalBroadcastManager.getInstance(this).sendBroadcast(new Intent("com.farmerbb.taskbar.SORT_DESKTOP_ICONS"));
+                break;
             case "change_wallpaper":
-                Intent intent3 = Intent.createChooser(new Intent(Intent.ACTION_SET_WALLPAPER), getString(R.string.set_wallpaper));
+                if(LauncherHelper.getInstance().isOnHomeScreen())
+                    LocalBroadcastManager.getInstance(this).sendBroadcast(new Intent("com.farmerbb.taskbar.TEMP_HIDE_TASKBAR"));
+
+                Intent intent3 = Intent.createChooser(new Intent(Intent.ACTION_SET_WALLPAPER), getString(R.string.tb_set_wallpaper));
                 intent3.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
-                U.launchAppMaximized(getApplicationContext(), intent3);
+                U.startActivityMaximized(getApplicationContext(), intent3);
 
                 showStartMenu = false;
                 shouldHideTaskbar = true;
                 contextMenuFix = false;
                 break;
+            case "remove_desktop_icon":
+                try {
+                    SharedPreferences pref5 = U.getSharedPreferences(this);
+                    JSONArray jsonIcons = new JSONArray(pref5.getString("desktop_icons", "[]"));
+                    int iconToRemove = -1;
+
+                    for(int i = 0; i < jsonIcons.length(); i++) {
+                        DesktopIconInfo info = DesktopIconInfo.fromJson(jsonIcons.getJSONObject(i));
+                        if(info != null && info.column == desktopIcon.column && info.row == desktopIcon.row) {
+                            iconToRemove = i;
+                            break;
+                        }
+                    }
+
+                    if(iconToRemove > -1) {
+                        jsonIcons.remove(iconToRemove);
+
+                        pref5.edit().putString("desktop_icons", jsonIcons.toString()).apply();
+                        LocalBroadcastManager.getInstance(this).sendBroadcast(new Intent("com.farmerbb.taskbar.REFRESH_DESKTOP_ICONS"));
+                    }
+                } catch (JSONException e) { /* Gracefully fail */ }
+                break;
         }
 
         if(!secondaryMenu) finish();
@@ -635,17 +776,25 @@ public class ContextMenuActivity extends PreferenceActivity implements Preferenc
         MenuHelper.getInstance().setContextMenuOpen(false);
 
         if(!dashboardOrStartMenuAppearing) {
-            if(showStartMenu)
-                LocalBroadcastManager.getInstance(this).sendBroadcast(new Intent("com.farmerbb.taskbar.TOGGLE_START_MENU_ALT"));
-            else if(shouldHideTaskbar) {
-                SharedPreferences pref = U.getSharedPreferences(this);
-                if(pref.getBoolean("hide_taskbar", true) && !FreeformHackHelper.getInstance().isInFreeformWorkspace())
-                    LocalBroadcastManager.getInstance(this).sendBroadcast(new Intent("com.farmerbb.taskbar.HIDE_TASKBAR"));
+            if (showStartMenu) {
+                LocalBroadcastManager
+                        .getInstance(this)
+                        .sendBroadcast(new Intent(TaskbarIntent.ACTION_TOGGLE_START_MENU));
+            } else {
+                LocalBroadcastManager.getInstance(this).sendBroadcast(new Intent("com.farmerbb.taskbar.RESET_START_MENU"));
+
+                if(shouldHideTaskbar && U.shouldCollapse(this, true)) {
+                    LocalBroadcastManager
+                            .getInstance(this)
+                            .sendBroadcast(new Intent(TaskbarIntent.ACTION_HIDE_TASKBAR));
+                }
             }
         }
 
+        SharedPreferences pref = U.getSharedPreferences(this);
+
         super.finish();
-        if(showStartMenu)
+        if(showStartMenu || pref.getBoolean("disable_animations", false))
             overridePendingTransition(0, 0);
     }
 
@@ -656,12 +805,12 @@ public class ContextMenuActivity extends PreferenceActivity implements Preferenc
             UserManager userManager = (UserManager) getSystemService(USER_SERVICE);
 
             LauncherApps.ShortcutQuery query = new LauncherApps.ShortcutQuery();
-            query.setActivity(ComponentName.unflattenFromString(componentName));
+            query.setActivity(ComponentName.unflattenFromString(entry.getComponentName()));
             query.setQueryFlags(LauncherApps.ShortcutQuery.FLAG_MATCH_DYNAMIC
                     | LauncherApps.ShortcutQuery.FLAG_MATCH_MANIFEST
                     | LauncherApps.ShortcutQuery.FLAG_MATCH_PINNED);
 
-            shortcuts = launcherApps.getShortcuts(query, userManager.getUserForSerialNumber(userId));
+            shortcuts = launcherApps.getShortcuts(query, userManager.getUserForSerialNumber(entry.getUserId(this)));
             if(shortcuts != null)
                 return shortcuts.size();
         }
@@ -688,9 +837,12 @@ public class ContextMenuActivity extends PreferenceActivity implements Preferenc
             generateMenu();
 
             getListView().setOnItemLongClickListener(null);
+
+            if(U.hasBrokenSetLaunchBoundsApi())
+                U.cancelToast();
         } else {
             if(contextMenuFix && !showStartMenu)
-                U.startFreeformHack(this, false, false);
+                U.startFreeformHack(this);
 
             super.onBackPressed();
             if(FreeformHackHelper.getInstance().isInFreeformWorkspace())
@@ -702,6 +854,7 @@ public class ContextMenuActivity extends PreferenceActivity implements Preferenc
     protected void onDestroy() {
         super.onDestroy();
 
+        LocalBroadcastManager.getInstance(this).unregisterReceiver(dashboardOrStartMenuAppearingReceiver);
         LocalBroadcastManager.getInstance(this).unregisterReceiver(finishReceiver);
     }
-}
\ No newline at end of file
+}