diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index 0b42588bb5aff..88deb398453bb 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -1332,10 +1332,10 @@ Example: com.google.android.myapp/.resolver.MyResolverActivity --> - - com.android.systemui/com.android.systemui.usb.UsbDebuggingActivity diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index 323494aa751e9..f88b8bbef9990 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -1625,7 +1625,7 @@ - + diff --git a/services/usb/java/com/android/server/usb/UsbDebuggingManager.java b/services/usb/java/com/android/server/usb/UsbDebuggingManager.java index f73d4259489ea..0946c5a053d18 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); + 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 { + 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); - try { - mContext.startActivity(intent); - } catch (ActivityNotFoundException e) { - Slog.e(TAG, "unable to start UsbDebuggingActivity"); - } + return intent; } private File getUserKeyFile() {