From 1648d68d492b3a58c9dae2de83d3ac810108e95f Mon Sep 17 00:00:00 2001 From: Himanshu Gupta Date: Tue, 29 Nov 2022 10:31:14 +0000 Subject: [PATCH] Adding "Delete all App Clones" option on Cloned Apps page. This option is seen by clicking the '3-dot' menu on Settings->Cloned Apps page and requires: 1. Flag 'remove_all_cloned_apps' to be turned on. 2. Cloned UserId to be present in system. Test: Manually setting the flag, creating clones. Change-Id: I83ff40923f7932ed6b23cb831bdcd2cb9252d295 --- res/menu/manage_apps.xml | 4 +++ res/values/strings.xml | 4 +++ src/com/android/settings/Utils.java | 7 +++++ .../ManageApplications.java | 27 +++++++++++++++++++ 4 files changed, 42 insertions(+) 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; }