summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJeff Sharkey <jsharkey@android.com>2014-08-07 17:40:20 -0700
committerJeff Sharkey <jsharkey@android.com>2014-08-07 17:40:22 -0700
commit3aeb50560ee8c383b7dfa65fd8c46642d2a6ef5c (patch)
treed3554c9412f3e7dc17c7adc41976a65365f7c444 /src
parent8538fde237709464ec899a402fee29c0169f6bfa (diff)
downloadandroid_packages_apps_PackageInstaller-3aeb50560ee8c383b7dfa65fd8c46642d2a6ef5c.tar.gz
android_packages_apps_PackageInstaller-3aeb50560ee8c383b7dfa65fd8c46642d2a6ef5c.tar.bz2
android_packages_apps_PackageInstaller-3aeb50560ee8c383b7dfa65fd8c46642d2a6ef5c.zip
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
Diffstat (limited to 'src')
-rwxr-xr-xsrc/com/android/packageinstaller/UninstallAppProgress.java35
-rwxr-xr-xsrc/com/android/packageinstaller/UninstallerActivity.java72
2 files changed, 65 insertions, 42 deletions
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) {
+ }
+ }
}
}