From d1931ffc075f73d043616b7446f14a653609782e Mon Sep 17 00:00:00 2001 From: Aaron Whyte Date: Fri, 11 Apr 2014 10:53:58 -0700 Subject: Allowed custom secure-adb confirmation via Activity or Service. It used to only be available via an Activity. Change-Id: Id79a99a70e721f3b567e75d45ffeba779264ec1e --- .../android/server/usb/UsbDebuggingManager.java | 66 +++++++++++++++++----- 1 file changed, 53 insertions(+), 13 deletions(-) (limited to 'services/usb/java/com') diff --git a/services/usb/java/com/android/server/usb/UsbDebuggingManager.java b/services/usb/java/com/android/server/usb/UsbDebuggingManager.java index f73d425..0946c5a 100644 --- a/services/usb/java/com/android/server/usb/UsbDebuggingManager.java +++ b/services/usb/java/com/android/server/usb/UsbDebuggingManager.java @@ -20,6 +20,8 @@ import android.content.ActivityNotFoundException; import android.content.ComponentName; import android.content.Context; import android.content.Intent; +import android.content.pm.PackageManager; +import android.content.pm.ResolveInfo; import android.content.res.Resources; import android.net.LocalSocket; import android.net.LocalSocketAddress; @@ -210,7 +212,7 @@ public class UsbDebuggingManager implements Runnable { case MESSAGE_ADB_CONFIRM: { String key = (String)msg.obj; mFingerprints = getFingerprints(key); - showConfirmationDialog(key, mFingerprints); + startConfirmation(key, mFingerprints); break; } @@ -245,22 +247,60 @@ public class UsbDebuggingManager implements Runnable { return sb.toString(); } - private void showConfirmationDialog(String key, String fingerprints) { - Intent intent = new Intent(); + private void startConfirmation(String key, String fingerprints) { + String nameString = Resources.getSystem().getString( + com.android.internal.R.string.config_customAdbPublicKeyConfirmationComponent); + ComponentName componentName = ComponentName.unflattenFromString(nameString); + if (startConfirmationActivity(componentName, key, fingerprints) + || startConfirmationService(componentName, key, fingerprints)) { + return; + } + Slog.e(TAG, "unable to start customAdbPublicKeyConfirmationComponent " + + nameString + " as an Activity or a Service"); + } - ComponentName componentName = ComponentName.unflattenFromString( - Resources.getSystem().getString( - com.android.internal.R.string.config_customAdbPublicKeyActivity)); - intent.setClassName(componentName.getPackageName(), - componentName.getClassName()); + /** + * @returns true if the componentName led to an Activity that was started. + */ + private boolean startConfirmationActivity(ComponentName componentName, String key, + String fingerprints) { + PackageManager packageManager = mContext.getPackageManager(); + Intent intent = createConfirmationIntent(componentName, key, fingerprints); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - intent.putExtra("key", key); - intent.putExtra("fingerprints", fingerprints); + if (packageManager.resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY) != null) { + try { + mContext.startActivity(intent); + return true; + } catch (ActivityNotFoundException e) { + Slog.e(TAG, "unable to start adb whitelist activity: " + componentName, e); + } + } + return false; + } + + /** + * @returns true if the componentName led to a Service that was started. + */ + private boolean startConfirmationService(ComponentName componentName, String key, + String fingerprints) { + Intent intent = createConfirmationIntent(componentName, key, fingerprints); try { - mContext.startActivity(intent); - } catch (ActivityNotFoundException e) { - Slog.e(TAG, "unable to start UsbDebuggingActivity"); + if (mContext.startService(intent) != null) { + return true; + } + } catch (SecurityException e) { + Slog.e(TAG, "unable to start adb whitelist service: " + componentName, e); } + return false; + } + + private Intent createConfirmationIntent(ComponentName componentName, String key, + String fingerprints) { + Intent intent = new Intent(); + intent.setClassName(componentName.getPackageName(), componentName.getClassName()); + intent.putExtra("key", key); + intent.putExtra("fingerprints", fingerprints); + return intent; } private File getUserKeyFile() { -- cgit v1.1