From 3aeb50560ee8c383b7dfa65fd8c46642d2a6ef5c Mon Sep 17 00:00:00 2001 From: Jeff Sharkey Date: Thu, 7 Aug 2014 17:40:20 -0700 Subject: Extend to support uninstall callbacks. The new PackageInstaller.uninstall() API in the framework currently shuttles through the callers IBinder, just to get this flow working for now. Bug: 16515814 Change-Id: Ib7b839b3fcc1c854f99af6eeae25172e900acb80 --- .../packageinstaller/UninstallAppProgress.java | 35 ++++++++--- .../packageinstaller/UninstallerActivity.java | 72 ++++++++++++---------- 2 files changed, 65 insertions(+), 42 deletions(-) (limited to 'src') diff --git a/src/com/android/packageinstaller/UninstallAppProgress.java b/src/com/android/packageinstaller/UninstallAppProgress.java index 397236a6..68d053ae 100755 --- a/src/com/android/packageinstaller/UninstallAppProgress.java +++ b/src/com/android/packageinstaller/UninstallAppProgress.java @@ -21,11 +21,14 @@ import android.content.Context; import android.content.Intent; import android.content.pm.ApplicationInfo; import android.content.pm.IPackageDeleteObserver; +import android.content.pm.IPackageDeleteObserver2; import android.content.pm.IPackageManager; +import android.content.pm.PackageInstaller; import android.content.pm.PackageManager; import android.content.pm.UserInfo; import android.os.Bundle; import android.os.Handler; +import android.os.IBinder; import android.os.Message; import android.os.RemoteException; import android.os.ServiceManager; @@ -52,35 +55,50 @@ import java.util.List; public class UninstallAppProgress extends Activity implements OnClickListener { private final String TAG="UninstallAppProgress"; private boolean localLOGV = false; + private ApplicationInfo mAppInfo; private boolean mAllUsers; private UserHandle mUser; + private IBinder mCallback; + private TextView mStatusTextView; private Button mOkButton; private Button mDeviceManagerButton; private ProgressBar mProgressBar; private View mOkPanel; private volatile int mResultCode = -1; - private final int UNINSTALL_COMPLETE = 1; - public final static int SUCCEEDED=1; - public final static int FAILED=0; + + private static final int UNINSTALL_COMPLETE = 1; + private Handler mHandler = new Handler() { public void handleMessage(Message msg) { switch (msg.what) { case UNINSTALL_COMPLETE: + mResultCode = msg.arg1; + final String packageName = (String) msg.obj; + + if (mCallback != null) { + final IPackageDeleteObserver2 observer = IPackageDeleteObserver2.Stub + .asInterface(mCallback); + try { + observer.onPackageDeleted(mAppInfo.packageName, mResultCode, + packageName); + } catch (RemoteException ignored) { + } + finish(); + return; + } + if (getIntent().getBooleanExtra(Intent.EXTRA_RETURN_RESULT, false)) { Intent result = new Intent(); - result.putExtra(Intent.EXTRA_INSTALL_RESULT, msg.arg1); - setResult(msg.arg1 == PackageManager.DELETE_SUCCEEDED + result.putExtra(Intent.EXTRA_INSTALL_RESULT, mResultCode); + setResult(mResultCode == PackageManager.DELETE_SUCCEEDED ? Activity.RESULT_OK : Activity.RESULT_FIRST_USER, result); finish(); return; } - mResultCode = msg.arg1; - final String packageName = (String) msg.obj; - // Update the status text final String statusText; switch (msg.arg1) { @@ -169,6 +187,7 @@ public class UninstallAppProgress extends Activity implements OnClickListener { + "request uninstall for user " + mUser); } } + mCallback = intent.getIBinderExtra(PackageInstaller.EXTRA_CALLBACK); initView(); } diff --git a/src/com/android/packageinstaller/UninstallerActivity.java b/src/com/android/packageinstaller/UninstallerActivity.java index b64ce6f4..71d21a64 100755 --- a/src/com/android/packageinstaller/UninstallerActivity.java +++ b/src/com/android/packageinstaller/UninstallerActivity.java @@ -25,10 +25,13 @@ import android.content.DialogInterface; import android.content.Intent; import android.content.pm.ActivityInfo; import android.content.pm.ApplicationInfo; +import android.content.pm.IPackageDeleteObserver2; import android.content.pm.IPackageManager; +import android.content.pm.PackageInstaller; import android.content.pm.PackageManager; import android.net.Uri; import android.os.Bundle; +import android.os.IBinder; import android.os.RemoteException; import android.os.ServiceManager; import android.os.UserHandle; @@ -44,22 +47,24 @@ import android.widget.TextView; * Intent.ACTION_UNINSTALL_PKG_COMMAND and attribute * com.android.packageinstaller.PackageName set to the application package name */ -public class UninstallerActivity extends Activity implements OnClickListener, - DialogInterface.OnCancelListener { +public class UninstallerActivity extends Activity implements OnClickListener { private static final String TAG = "UninstallerActivity"; private boolean localLOGV = false; - PackageManager mPm; + + private PackageManager mPm; private IPackageManager mIpm; + + private UserHandle mUserHandle; private ApplicationInfo mAppInfo; private boolean mAllUsers; + private IBinder mCallback; + private Button mOk; private Button mCancel; - private UserHandle mUserHandle; // Dialog identifiers used in showDialog private static final int DLG_BASE = 0; private static final int DLG_APP_NOT_FOUND = DLG_BASE + 1; - private static final int DLG_UNINSTALL_FAILED = DLG_BASE + 2; @Override public Dialog onCreateDialog(int id) { @@ -76,33 +81,16 @@ public class UninstallerActivity extends Activity implements OnClickListener, finish(); }}) .create(); - case DLG_UNINSTALL_FAILED : - // Guaranteed not to be null. will default to package name if not set by app - CharSequence appTitle = mPm.getApplicationLabel(mAppInfo); - String dlgText = getString(R.string.uninstall_failed_msg, - appTitle.toString()); - // Display uninstall failed dialog - return new AlertDialog.Builder(this) - .setTitle(R.string.uninstall_failed) - .setIcon(com.android.internal.R.drawable.ic_dialog_alert) - .setMessage(dlgText) - .setNeutralButton(getString(R.string.dlg_ok), - new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int which) { - setResult(Activity.RESULT_FIRST_USER); - finish(); - }}) - .create(); } return null; } private void startUninstallProgress() { Intent newIntent = new Intent(Intent.ACTION_VIEW); - newIntent.putExtra(PackageUtil.INTENT_ATTR_APPLICATION_INFO, - mAppInfo); - newIntent.putExtra(Intent.EXTRA_UNINSTALL_ALL_USERS, mAllUsers); newIntent.putExtra(Intent.EXTRA_USER, mUserHandle); + newIntent.putExtra(Intent.EXTRA_UNINSTALL_ALL_USERS, mAllUsers); + newIntent.putExtra(PackageInstaller.EXTRA_CALLBACK, mCallback); + newIntent.putExtra(PackageUtil.INTENT_ATTR_APPLICATION_INFO, mAppInfo); if (getIntent().getBooleanExtra(Intent.EXTRA_RETURN_RESULT, false)) { newIntent.putExtra(Intent.EXTRA_RETURN_RESULT, true); newIntent.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT); @@ -127,13 +115,15 @@ public class UninstallerActivity extends Activity implements OnClickListener, return; } + mPm = getPackageManager(); + mIpm = IPackageManager.Stub.asInterface(ServiceManager.getService("package")); + mUserHandle = intent.getParcelableExtra(Intent.EXTRA_USER); if (mUserHandle == null) { mUserHandle = android.os.Process.myUserHandle(); } - - mPm = getPackageManager(); - mIpm = IPackageManager.Stub.asInterface(ServiceManager.getService("package")); + mAllUsers = intent.getBooleanExtra(Intent.EXTRA_UNINSTALL_ALL_USERS, false); + mCallback = intent.getIBinderExtra(PackageInstaller.EXTRA_CALLBACK); boolean errFlag = false; try { @@ -143,8 +133,6 @@ public class UninstallerActivity extends Activity implements OnClickListener, errFlag = true; } - mAllUsers = intent.getBooleanExtra(Intent.EXTRA_UNINSTALL_ALL_USERS, false); - // The class name may have been specified (e.g. when deleting an app from all apps) String className = packageURI.getFragment(); ActivityInfo activityInfo = null; @@ -205,17 +193,33 @@ public class UninstallerActivity extends Activity implements OnClickListener, mCancel.setOnClickListener(this); } } - + + @Override + public void onBackPressed() { + dispatchAborted(); + super.onBackPressed(); + } + + @Override public void onClick(View v) { if(v == mOk) { //initiate next screen startUninstallProgress(); - } else if(v == mCancel) { + } else if (v == mCancel) { + dispatchAborted(); finish(); } } - public void onCancel(DialogInterface dialog) { - finish(); + private void dispatchAborted() { + if (mCallback != null) { + final IPackageDeleteObserver2 observer = IPackageDeleteObserver2.Stub.asInterface( + mCallback); + try { + observer.onPackageDeleted(mAppInfo.packageName, + PackageManager.DELETE_FAILED_ABORTED, "Cancelled by user"); + } catch (RemoteException ignored) { + } + } } } -- cgit v1.2.3