Adds the Clear App dialog for Instant Apps
Adds a confirmation dialog for the user when tapping clear app. From this dialog the user can either cancel, or confirm they want to clear the app. Test: make RunSettingsRoboTests Bug: 36536695 Change-Id: Idffcf5ef318578ae2e075ea2cbb35323d41acade
This commit is contained in:
@@ -37,7 +37,7 @@ public interface ApplicationFeatureProvider {
|
||||
* only relevant to instant apps.
|
||||
*/
|
||||
InstantAppButtonsController newInstantAppButtonsController(Fragment fragment,
|
||||
View view);
|
||||
View view, InstantAppButtonsController.ShowDialogDelegate showDialogDelegate);
|
||||
|
||||
/**
|
||||
* Calculates the total number of apps installed on the device via policy in the current user
|
||||
|
@@ -58,8 +58,8 @@ public class ApplicationFeatureProviderImpl implements ApplicationFeatureProvide
|
||||
|
||||
@Override
|
||||
public InstantAppButtonsController newInstantAppButtonsController(Fragment fragment,
|
||||
View view) {
|
||||
return new InstantAppButtonsController(mContext, fragment, view);
|
||||
View view, InstantAppButtonsController.ShowDialogDelegate showDialogDelegate) {
|
||||
return new InstantAppButtonsController(mContext, fragment, view, showDialogDelegate);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@@ -85,6 +85,7 @@ import com.android.settings.applications.defaultapps.DefaultEmergencyPreferenceC
|
||||
import com.android.settings.applications.defaultapps.DefaultHomePreferenceController;
|
||||
import com.android.settings.applications.defaultapps.DefaultPhonePreferenceController;
|
||||
import com.android.settings.applications.defaultapps.DefaultSmsPreferenceController;
|
||||
import com.android.settings.applications.instantapps.InstantAppButtonsController;
|
||||
import com.android.settings.datausage.AppDataUsage;
|
||||
import com.android.settings.datausage.DataUsageList;
|
||||
import com.android.settings.datausage.DataUsageSummary;
|
||||
@@ -190,6 +191,8 @@ public class InstalledAppDetails extends AppInfoBase
|
||||
protected ProcStatsData mStatsManager;
|
||||
protected ProcStatsPackageEntry mStats;
|
||||
|
||||
private InstantAppButtonsController mInstantAppButtonsController;
|
||||
|
||||
private AppStorageStats mLastResult;
|
||||
|
||||
private boolean handleDisableable(Button button) {
|
||||
@@ -771,6 +774,9 @@ public class InstalledAppDetails extends AppInfoBase
|
||||
.setNegativeButton(R.string.dlg_cancel, null)
|
||||
.create();
|
||||
}
|
||||
if (mInstantAppButtonsController != null) {
|
||||
return mInstantAppButtonsController.createDialog(id);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -1120,10 +1126,11 @@ public class InstalledAppDetails extends AppInfoBase
|
||||
if (AppUtils.isInstant(mPackageInfo.applicationInfo)) {
|
||||
LayoutPreference buttons = (LayoutPreference) findPreference(KEY_INSTANT_APP_BUTTONS);
|
||||
final Activity activity = getActivity();
|
||||
FeatureFactory.getFactory(activity)
|
||||
mInstantAppButtonsController = FeatureFactory.getFactory(activity)
|
||||
.getApplicationFeatureProvider(activity)
|
||||
.newInstantAppButtonsController(this,
|
||||
buttons.findViewById(R.id.instant_app_button_container))
|
||||
buttons.findViewById(R.id.instant_app_button_container),
|
||||
id -> showDialogInner(id, 0))
|
||||
.setPackageName(mPackageName)
|
||||
.show();
|
||||
}
|
||||
|
@@ -20,6 +20,7 @@ import android.content.ComponentName;
|
||||
import android.content.Intent;
|
||||
import android.content.IntentFilter;
|
||||
import android.content.pm.ApplicationInfo;
|
||||
import android.content.pm.IPackageDeleteObserver;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.content.pm.ResolveInfo;
|
||||
import android.os.UserHandle;
|
||||
@@ -98,4 +99,10 @@ public interface PackageManagerWrapper {
|
||||
*/
|
||||
void replacePreferredActivity(IntentFilter homeFilter, int matchCategoryEmpty,
|
||||
ComponentName[] componentNames, ComponentName component);
|
||||
|
||||
/**
|
||||
* Calls {@code PackageManager.deletePackageAsUser}
|
||||
*/
|
||||
void deletePackageAsUser(String packageName, IPackageDeleteObserver observer, int flags,
|
||||
int userId);
|
||||
}
|
||||
|
@@ -20,6 +20,7 @@ import android.content.ComponentName;
|
||||
import android.content.Intent;
|
||||
import android.content.IntentFilter;
|
||||
import android.content.pm.ApplicationInfo;
|
||||
import android.content.pm.IPackageDeleteObserver;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.content.pm.ResolveInfo;
|
||||
import android.os.UserHandle;
|
||||
@@ -90,4 +91,10 @@ public class PackageManagerWrapperImpl implements PackageManagerWrapper {
|
||||
ComponentName[] componentNames, ComponentName component) {
|
||||
mPm.replacePreferredActivity(homeFilter, matchCategoryEmpty, componentNames, component);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void deletePackageAsUser(String packageName, IPackageDeleteObserver observer, int flags,
|
||||
int userId) {
|
||||
mPm.deletePackageAsUser(packageName, observer, flags, userId);
|
||||
}
|
||||
}
|
||||
|
@@ -16,31 +16,53 @@
|
||||
|
||||
package com.android.settings.applications.instantapps;
|
||||
|
||||
import android.app.AlertDialog;
|
||||
import android.app.Fragment;
|
||||
import android.content.Context;
|
||||
import android.content.DialogInterface;
|
||||
import android.content.Intent;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.os.UserHandle;
|
||||
import android.view.View;
|
||||
import android.widget.Button;
|
||||
|
||||
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
|
||||
import com.android.settings.R;
|
||||
import com.android.settings.applications.AppStoreUtil;
|
||||
import com.android.settings.applications.PackageManagerWrapper;
|
||||
import com.android.settings.applications.PackageManagerWrapperImpl;
|
||||
import com.android.settings.overlay.FeatureFactory;
|
||||
|
||||
import android.app.Fragment;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.view.View;
|
||||
import android.view.View.OnClickListener;
|
||||
import android.widget.Button;
|
||||
|
||||
/** Encapsulates a container for buttons relevant to instant apps */
|
||||
public class InstantAppButtonsController {
|
||||
public class InstantAppButtonsController implements DialogInterface.OnClickListener {
|
||||
|
||||
public interface ShowDialogDelegate {
|
||||
/**
|
||||
* Delegate that should be called when this controller wants to show a dialog.
|
||||
*/
|
||||
void showDialog(int id);
|
||||
}
|
||||
|
||||
private final Context mContext;
|
||||
private final Fragment mFragment;
|
||||
private final View mView;
|
||||
private final PackageManagerWrapper mPackageManagerWrapper;
|
||||
private final ShowDialogDelegate mShowDialogDelegate;
|
||||
private String mPackageName;
|
||||
|
||||
public InstantAppButtonsController(Context context, Fragment fragment, View view) {
|
||||
public static final int DLG_BASE = 0x5032;
|
||||
public static final int DLG_CLEAR_APP = DLG_BASE + 1;
|
||||
|
||||
public InstantAppButtonsController(
|
||||
Context context,
|
||||
Fragment fragment,
|
||||
View view,
|
||||
ShowDialogDelegate showDialogDelegate) {
|
||||
mContext = context;
|
||||
mFragment = fragment;
|
||||
mView = view;
|
||||
mShowDialogDelegate = showDialogDelegate;
|
||||
mPackageManagerWrapper = new PackageManagerWrapperImpl(context.getPackageManager());
|
||||
}
|
||||
|
||||
public InstantAppButtonsController setPackageName(String packageName) {
|
||||
@@ -51,17 +73,38 @@ public class InstantAppButtonsController {
|
||||
public void bindButtons() {
|
||||
Button installButton = (Button)mView.findViewById(R.id.install);
|
||||
Button clearDataButton = (Button)mView.findViewById(R.id.clear_data);
|
||||
Intent installIntent = AppStoreUtil.getAppStoreLink(mContext, mPackageName);
|
||||
if (installIntent != null) {
|
||||
Intent appStoreIntent = AppStoreUtil.getAppStoreLink(mContext, mPackageName);
|
||||
if (appStoreIntent != null) {
|
||||
installButton.setEnabled(true);
|
||||
installButton.setOnClickListener(v -> mFragment.startActivity(installIntent));
|
||||
installButton.setOnClickListener(v -> mFragment.startActivity(appStoreIntent));
|
||||
}
|
||||
|
||||
clearDataButton.setOnClickListener(v -> mShowDialogDelegate.showDialog(DLG_CLEAR_APP));
|
||||
}
|
||||
|
||||
public AlertDialog createDialog(int id) {
|
||||
if (id == DLG_CLEAR_APP) {
|
||||
AlertDialog dialog = new AlertDialog.Builder(mFragment.getActivity())
|
||||
.setPositiveButton(R.string.clear_instant_app_data, this)
|
||||
.setNegativeButton(R.string.cancel, null)
|
||||
.setTitle(R.string.clear_instant_app_data)
|
||||
.setMessage(mContext.getString(R.string.clear_instant_app_confirmation))
|
||||
.create();
|
||||
return dialog;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public void onClick(DialogInterface dialog, int which) {
|
||||
if (which == DialogInterface.BUTTON_POSITIVE) {
|
||||
FeatureFactory.getFactory(mContext)
|
||||
.getMetricsFeatureProvider()
|
||||
.action(mContext,
|
||||
MetricsEvent.ACTION_SETTINGS_CLEAR_INSTANT_APP,
|
||||
mPackageName);
|
||||
mPackageManagerWrapper.deletePackageAsUser(
|
||||
mPackageName, null, 0, UserHandle.myUserId());
|
||||
}
|
||||
clearDataButton.setOnClickListener(v -> {
|
||||
FeatureFactory.getFactory(mContext).getMetricsFeatureProvider().action(mContext,
|
||||
MetricsEvent.ACTION_SETTINGS_CLEAR_INSTANT_APP, mPackageName);
|
||||
PackageManager pm = mContext.getPackageManager();
|
||||
pm.clearApplicationUserData(mPackageName, null);
|
||||
});
|
||||
}
|
||||
|
||||
public InstantAppButtonsController show() {
|
||||
|
Reference in New Issue
Block a user