Merge "Add show/hide launcher icon menu for debug"
diff --git a/res/menu/activity.xml b/res/menu/activity.xml
index 5a729f2..9e2fdd6 100644
--- a/res/menu/activity.xml
+++ b/res/menu/activity.xml
@@ -80,5 +80,9 @@
            android:title="@string/menu_inspect"
            android:visible="false"
            app:showAsAction="never"/>
+        <item
+            android:id="@+id/option_menu_launcher"
+            android:visible="false"
+            app:showAsAction="never"/>
     </group>
 </menu>
diff --git a/src/com/android/documentsui/AbstractActionHandler.java b/src/com/android/documentsui/AbstractActionHandler.java
index 5b97099..a20e3e7 100644
--- a/src/com/android/documentsui/AbstractActionHandler.java
+++ b/src/com/android/documentsui/AbstractActionHandler.java
@@ -21,9 +21,11 @@
 import static com.android.documentsui.base.SharedMinimal.DEBUG;
 
 import android.app.PendingIntent;
+import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentSender;
+import android.content.pm.PackageManager;
 import android.content.pm.ResolveInfo;
 import android.database.Cursor;
 import android.net.Uri;
@@ -453,6 +455,20 @@
     }
 
     @Override
+    public void switchLauncherIcon() {
+        PackageManager pm = mActivity.getPackageManager();
+        if (pm != null) {
+            final boolean enalbled = Shared.isLauncherEnabled(mActivity);
+            ComponentName component = new ComponentName(
+                    mActivity.getPackageName(), Shared.LAUNCHER_TARGET_CLASS);
+            pm.setComponentEnabledSetting(component, enalbled
+                    ? PackageManager.COMPONENT_ENABLED_STATE_DISABLED
+                    : PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
+                    PackageManager.DONT_KILL_APP);
+        }
+    }
+
+    @Override
     public void cutToClipboard() {
         throw new UnsupportedOperationException("Cut not supported!");
     }
diff --git a/src/com/android/documentsui/ActionHandler.java b/src/com/android/documentsui/ActionHandler.java
index a6b5349..a428df8 100644
--- a/src/com/android/documentsui/ActionHandler.java
+++ b/src/com/android/documentsui/ActionHandler.java
@@ -174,6 +174,11 @@
     void showSortDialog();
 
     /**
+     * Switch launch icon show/hide status.
+     */
+    void switchLauncherIcon();
+
+    /**
      * Allow action handler to be initialized in a new scope.
      * @return this
      */
diff --git a/src/com/android/documentsui/BaseActivity.java b/src/com/android/documentsui/BaseActivity.java
index e8fe2bf..dc39db0 100644
--- a/src/com/android/documentsui/BaseActivity.java
+++ b/src/com/android/documentsui/BaseActivity.java
@@ -477,6 +477,10 @@
                 getInjector().actions.showSortDialog();
                 return true;
 
+            case R.id.option_menu_launcher:
+                getInjector().actions.switchLauncherIcon();
+                return true;
+
             case R.id.sub_menu_grid:
                 setViewMode(State.MODE_GRID);
                 return true;
diff --git a/src/com/android/documentsui/MenuManager.java b/src/com/android/documentsui/MenuManager.java
index 2c12e5f..505cb37 100644
--- a/src/com/android/documentsui/MenuManager.java
+++ b/src/com/android/documentsui/MenuManager.java
@@ -96,6 +96,7 @@
         updateDebug(mOptionMenu.findItem(R.id.option_menu_debug));
         updateInspect(mOptionMenu.findItem(R.id.option_menu_inspect));
         updateSort(mOptionMenu.findItem(R.id.option_menu_sort));
+        updateLauncher(mOptionMenu.findItem(R.id.option_menu_launcher));
 
         Menus.disableHiddenItems(mOptionMenu);
         mSearchManager.updateMenu();
@@ -364,6 +365,10 @@
         open.setVisible(false);
     }
 
+    protected void updateLauncher(MenuItem launcher) {
+        launcher.setVisible(false);
+    }
+
     protected abstract void updateSelectAll(MenuItem selectAll);
     protected abstract void updateSelectAll(MenuItem selectAll, SelectionDetails selectionDetails);
     protected abstract void updateDeselectAll(
diff --git a/src/com/android/documentsui/PreBootReceiver.java b/src/com/android/documentsui/PreBootReceiver.java
index a983adc..c476316 100644
--- a/src/com/android/documentsui/PreBootReceiver.java
+++ b/src/com/android/documentsui/PreBootReceiver.java
@@ -16,6 +16,7 @@
 
 package com.android.documentsui;
 
+import static com.android.documentsui.base.Shared.LAUNCHER_TARGET_CLASS;
 import static com.android.documentsui.base.SharedMinimal.DEBUG;
 
 import android.content.BroadcastReceiver;
@@ -40,7 +41,6 @@
     private static final String TAG = "PreBootReceiver";
     private static final String CONFIG_IS_LAUNCHER_ENABLED = "is_launcher_enabled";
     private static final String CONFIG_HANDLE_VIEW_DOWNLOADS = "handle_view_downloads_intent";
-    private static final String LAUNCHER_TARGET_CLASS = "com.android.documentsui.LauncherActivity";
     private static final String DOWNLOADS_TARGET_CLASS =
             "com.android.documentsui.ViewDownloadsActivity";
 
diff --git a/src/com/android/documentsui/base/Shared.java b/src/com/android/documentsui/base/Shared.java
index ff13aff..3b4d2e9 100644
--- a/src/com/android/documentsui/base/Shared.java
+++ b/src/com/android/documentsui/base/Shared.java
@@ -19,10 +19,12 @@
 import static com.android.documentsui.base.SharedMinimal.TAG;
 
 import android.app.Activity;
+import android.content.ComponentName;
 import android.content.ContentResolver;
 import android.content.Context;
 import android.content.Intent;
 import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
 import android.content.pm.PackageManager.NameNotFoundException;
 import android.content.res.Configuration;
 import android.net.Uri;
@@ -35,6 +37,9 @@
 import android.view.View;
 import android.view.WindowManager;
 
+import androidx.annotation.PluralsRes;
+import androidx.appcompat.app.AlertDialog;
+
 import com.android.documentsui.R;
 import com.android.documentsui.ui.MessageBuilder;
 
@@ -47,9 +52,6 @@
 
 import javax.annotation.Nullable;
 
-import androidx.annotation.PluralsRes;
-import androidx.appcompat.app.AlertDialog;
-
 /** @hide */
 public final class Shared {
 
@@ -134,6 +136,11 @@
      */
     public static final int CHECK_ANIMATION_DURATION = 100;
 
+    /**
+     * Class name of launcher icon avtivity.
+     */
+    public static final String LAUNCHER_TARGET_CLASS = "com.android.documentsui.LauncherActivity";
+
     private static final Collator sCollator;
 
     static {
@@ -264,10 +271,18 @@
 
     /**
      * Check config whether DocumentsUI is launcher enabled or not.
-     * @return true if "is_launcher_enabled" is true.
+     * @return true if launcher icon is shown.
      */
     public static boolean isLauncherEnabled(Context context) {
-        return context.getResources().getBoolean(R.bool.is_launcher_enabled);
+        PackageManager pm = context.getPackageManager();
+        if (pm != null) {
+            final ComponentName component = new ComponentName(
+                    context.getPackageName(), LAUNCHER_TARGET_CLASS);
+            final int value = pm.getComponentEnabledSetting(component);
+            return value == PackageManager.COMPONENT_ENABLED_STATE_ENABLED;
+        }
+
+        return false;
     }
 
     /**
diff --git a/src/com/android/documentsui/files/MenuManager.java b/src/com/android/documentsui/files/MenuManager.java
index 73c58e5..64106a8 100644
--- a/src/com/android/documentsui/files/MenuManager.java
+++ b/src/com/android/documentsui/files/MenuManager.java
@@ -35,6 +35,7 @@
 import com.android.documentsui.base.Features;
 import com.android.documentsui.base.Lookup;
 import com.android.documentsui.base.RootInfo;
+import com.android.documentsui.base.Shared;
 import com.android.documentsui.base.State;
 import com.android.documentsui.queries.SearchViewManager;
 
@@ -299,4 +300,11 @@
             view.setVisible(false);
         }
     }
+
+    @Override
+    protected void updateLauncher(MenuItem launcher) {
+        launcher.setVisible(mState.debugMode);
+        launcher.setTitle(Shared.isLauncherEnabled(mContext)
+                ? "Hide launcher icon" : "Show launcher icon");
+    }
 }
diff --git a/tests/common/com/android/documentsui/testing/TestMenu.java b/tests/common/com/android/documentsui/testing/TestMenu.java
index 4ad8406..e55a9ae 100644
--- a/tests/common/com/android/documentsui/testing/TestMenu.java
+++ b/tests/common/com/android/documentsui/testing/TestMenu.java
@@ -81,6 +81,7 @@
                 R.id.option_menu_settings,
                 R.id.option_menu_inspect,
                 R.id.option_menu_sort,
+                R.id.option_menu_launcher,
                 R.id.sub_menu_grid,
                 R.id.sub_menu_list);
     }
diff --git a/tests/unit/com/android/documentsui/files/MenuManagerTest.java b/tests/unit/com/android/documentsui/files/MenuManagerTest.java
index 0f2ed3b..202880b 100644
--- a/tests/unit/com/android/documentsui/files/MenuManagerTest.java
+++ b/tests/unit/com/android/documentsui/files/MenuManagerTest.java
@@ -103,6 +103,7 @@
     private TestMenuItem optionSettings;
     private TestMenuItem optionInspector;
     private TestMenuItem optionSort;
+    private TestMenuItem mOptionLauncher;
 
     /* Sub Option Menu items */
     private TestMenuItem subOptionGrid;
@@ -173,6 +174,7 @@
         optionSettings = testMenu.findItem(R.id.option_menu_settings);
         optionInspector = testMenu.findItem(R.id.option_menu_inspect);
         optionSort = testMenu.findItem(R.id.option_menu_sort);
+        mOptionLauncher = testMenu.findItem(R.id.option_menu_launcher);
 
         // Menu actions on root title row.
         subOptionGrid = testMenu.findItem(R.id.sub_menu_grid);
@@ -452,6 +454,7 @@
         optionDebug.assertInvisible();
         optionSort.assertEnabled();
         optionSort.assertVisible();
+        mOptionLauncher.assertInvisible();
         assertTrue(testSearchManager.updateMenuCalled());
     }
 
diff --git a/tests/unit/com/android/documentsui/picker/MenuManagerTest.java b/tests/unit/com/android/documentsui/picker/MenuManagerTest.java
index 5e14cb9..3e13440 100644
--- a/tests/unit/com/android/documentsui/picker/MenuManagerTest.java
+++ b/tests/unit/com/android/documentsui/picker/MenuManagerTest.java
@@ -101,6 +101,7 @@
     private TestMenuItem optionAdvanced;
     private TestMenuItem optionSettings;
     private TestMenuItem optionSort;
+    private TestMenuItem mOptionLauncher;
 
     private TestMenuItem subOptionGrid;
     private TestMenuItem subOptionList;
@@ -160,6 +161,7 @@
         optionAdvanced = testMenu.findItem(R.id.option_menu_advanced);
         optionSettings = testMenu.findItem(R.id.option_menu_settings);
         optionSort = testMenu.findItem(R.id.option_menu_sort);
+        mOptionLauncher = testMenu.findItem(R.id.option_menu_launcher);
 
         // Menu actions on root title row.
         subOptionGrid = testMenu.findItem(R.id.sub_menu_grid);
@@ -265,8 +267,10 @@
         optionAdvanced.assertInvisible();
         optionAdvanced.assertTitle(R.string.menu_advanced_show);
         optionCreateDir.assertDisabled();
+        optionDebug.assertInvisible();
         optionSort.assertEnabled();
         optionSort.assertVisible();
+        mOptionLauncher.assertInvisible();
         assertTrue(testSearchManager.showMenuCalled());
     }