diff --git a/res/menu/manage_apps.xml b/res/menu/manage_apps.xml
index 51189a0722d..21a2a16b5e4 100644
--- a/res/menu/manage_apps.xml
+++ b/res/menu/manage_apps.xml
@@ -56,4 +56,8 @@
android:id="@+id/reset_app_preferences"
android:title="@string/reset_app_preferences"
android:showAsAction="never" />
+
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 59b3f2000da..98940fe4e2d 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -6581,6 +6581,10 @@
Create a second instance of an app so that you can use two accounts at the same time.
%1$s cloned, %2$d available to clone
+
+ Delete all App clones
+
+ Delete all App clones failed
Creating…
diff --git a/src/com/android/settings/Utils.java b/src/com/android/settings/Utils.java
index 86222519a98..7b1e353bf36 100644
--- a/src/com/android/settings/Utils.java
+++ b/src/com/android/settings/Utils.java
@@ -169,6 +169,13 @@ public final class Utils extends com.android.settingslib.Utils {
*/
public static final String PROPERTY_CLONED_APPS_ENABLED = "cloned_apps_enabled";
+ /**
+ * Whether or not Delete All App Clones sub-menu is available in the Cloned Apps page.
+ * Default is false.
+ */
+ public static final String PROPERTY_DELETE_ALL_APP_CLONES_ENABLED =
+ "delete_all_app_clones_enabled";
+
/**
* Finds a matching activity for a preference's intent. If a matching
* activity is not found, it will remove the preference.
diff --git a/src/com/android/settings/applications/manageapplications/ManageApplications.java b/src/com/android/settings/applications/manageapplications/ManageApplications.java
index e6c174c3dba..a04cb618206 100644
--- a/src/com/android/settings/applications/manageapplications/ManageApplications.java
+++ b/src/com/android/settings/applications/manageapplications/ManageApplications.java
@@ -21,6 +21,7 @@ import static androidx.recyclerview.widget.RecyclerView.SCROLL_STATE_IDLE;
import static com.android.internal.jank.InteractionJankMonitor.CUJ_SETTINGS_PAGE_SCROLL;
import static com.android.settings.ChangeIds.CHANGE_RESTRICT_SAW_INTENT;
+import static com.android.settings.Utils.PROPERTY_DELETE_ALL_APP_CLONES_ENABLED;
import static com.android.settings.applications.manageapplications.AppFilterRegistry.FILTER_APPS_ALL;
import static com.android.settings.applications.manageapplications.AppFilterRegistry.FILTER_APPS_BATTERY_OPTIMIZED;
import static com.android.settings.applications.manageapplications.AppFilterRegistry.FILTER_APPS_BATTERY_RESTRICTED;
@@ -53,11 +54,13 @@ import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.os.IBinder;
+import android.os.IUserManager;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.UserHandle;
import android.os.UserManager;
import android.preference.PreferenceFrameLayout;
+import android.provider.DeviceConfig;
import android.provider.Settings;
import android.text.TextUtils;
import android.util.ArraySet;
@@ -76,6 +79,7 @@ import android.widget.Filter;
import android.widget.FrameLayout;
import android.widget.SearchView;
import android.widget.Spinner;
+import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
@@ -831,6 +835,11 @@ public class ManageApplications extends InstrumentedFragment
if (searchItem != null) {
searchItem.setVisible(false);
}
+
+ mOptionsMenu.findItem(R.id.delete_all_app_clones)
+ .setVisible(mListType == LIST_TYPE_CLONED_APPS && DeviceConfig.getBoolean(
+ DeviceConfig.NAMESPACE_APP_CLONING, PROPERTY_DELETE_ALL_APP_CLONES_ENABLED,
+ false) && Utils.getCloneUserId(getContext()) != -1);
}
@Override
@@ -871,6 +880,24 @@ public class ManageApplications extends InstrumentedFragment
startActivityForResult(intent, ADVANCED_SETTINGS);
}
return true;
+ } else if (i == R.id.delete_all_app_clones) {
+ int clonedUserId = Utils.getCloneUserId(getContext());
+ if (clonedUserId == -1) {
+ // No Apps Cloned Till now. Do Nothing.
+ return false;
+ }
+ IUserManager um = IUserManager.Stub.asInterface(
+ ServiceManager.getService(Context.USER_SERVICE));
+ try {
+ // Warning: This removes all the data, media & images present in cloned user.
+ um.removeUser(clonedUserId);
+ mApplications.rebuild();
+ } catch (RemoteException e) {
+ Log.e(TAG, "Failed to remove cloned apps", e);
+ Toast.makeText(getContext(),
+ getContext().getString(R.string.delete_all_app_clones_failure),
+ Toast.LENGTH_LONG).show();
+ }
} else {// Handle the home button
return false;
}