am 4980996b: Merge "Allowed custom secure-adb confirmation via Activity or Service. It used to only be available via an Activity." into klp-modular-dev

* commit '4980996bcc4e8065cf5dff1cf989d73face38281':
  Allowed custom secure-adb confirmation via Activity or Service. It used to only be available via an Activity.
This commit is contained in:
Aaron Whyte
2014-04-16 23:49:20 +00:00
committed by Android Git Automerger
3 changed files with 56 additions and 16 deletions

View File

@@ -1332,10 +1332,10 @@
Example: com.google.android.myapp/.resolver.MyResolverActivity --> Example: com.google.android.myapp/.resolver.MyResolverActivity -->
<string name="config_customResolverActivity"></string> <string name="config_customResolverActivity"></string>
<!-- Name of the activity that prompts the user to reject, accept, or whitelist <!-- Name of the activity or service that prompts the user to reject, accept, or whitelist
an adb host's public key, when an unwhitelisted host connects to the local adbd. an adb host's public key, when an unwhitelisted host connects to the local adbd.
Can be customized for other product types --> Can be customized for other product types -->
<string name="config_customAdbPublicKeyActivity" <string name="config_customAdbPublicKeyConfirmationComponent"
>com.android.systemui/com.android.systemui.usb.UsbDebuggingActivity</string> >com.android.systemui/com.android.systemui.usb.UsbDebuggingActivity</string>
<!-- Apps that are authorized to access shared accounts, overridden by product overlays --> <!-- Apps that are authorized to access shared accounts, overridden by product overlays -->

View File

@@ -1625,7 +1625,7 @@
<java-symbol type="string" name="enable_explore_by_touch_warning_message" /> <java-symbol type="string" name="enable_explore_by_touch_warning_message" />
<java-symbol type="bool" name="config_powerDecoupleAutoSuspendModeFromDisplay" /> <java-symbol type="bool" name="config_powerDecoupleAutoSuspendModeFromDisplay" />
<java-symbol type="bool" name="config_powerDecoupleInteractiveModeFromDisplay" /> <java-symbol type="bool" name="config_powerDecoupleInteractiveModeFromDisplay" />
<java-symbol type="string" name="config_customAdbPublicKeyActivity" /> <java-symbol type="string" name="config_customAdbPublicKeyConfirmationComponent" />
<java-symbol type="layout" name="resolver_list" /> <java-symbol type="layout" name="resolver_list" />
<java-symbol type="id" name="resolver_list" /> <java-symbol type="id" name="resolver_list" />

View File

@@ -20,6 +20,8 @@ import android.content.ActivityNotFoundException;
import android.content.ComponentName; import android.content.ComponentName;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.content.res.Resources; import android.content.res.Resources;
import android.net.LocalSocket; import android.net.LocalSocket;
import android.net.LocalSocketAddress; import android.net.LocalSocketAddress;
@@ -210,7 +212,7 @@ public class UsbDebuggingManager implements Runnable {
case MESSAGE_ADB_CONFIRM: { case MESSAGE_ADB_CONFIRM: {
String key = (String)msg.obj; String key = (String)msg.obj;
mFingerprints = getFingerprints(key); mFingerprints = getFingerprints(key);
showConfirmationDialog(key, mFingerprints); startConfirmation(key, mFingerprints);
break; break;
} }
@@ -245,22 +247,60 @@ public class UsbDebuggingManager implements Runnable {
return sb.toString(); return sb.toString();
} }
private void showConfirmationDialog(String key, String fingerprints) { private void startConfirmation(String key, String fingerprints) {
Intent intent = new Intent(); 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( * @returns true if the componentName led to an Activity that was started.
com.android.internal.R.string.config_customAdbPublicKeyActivity)); */
intent.setClassName(componentName.getPackageName(), private boolean startConfirmationActivity(ComponentName componentName, String key,
componentName.getClassName()); String fingerprints) {
PackageManager packageManager = mContext.getPackageManager();
Intent intent = createConfirmationIntent(componentName, key, fingerprints);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 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("key", key);
intent.putExtra("fingerprints", fingerprints); intent.putExtra("fingerprints", fingerprints);
try { return intent;
mContext.startActivity(intent);
} catch (ActivityNotFoundException e) {
Slog.e(TAG, "unable to start UsbDebuggingActivity");
}
} }
private File getUserKeyFile() { private File getUserKeyFile() {