diff options
| author | 2019-11-04 21:06:41 +0000 | |
|---|---|---|
| committer | 2019-11-04 21:06:41 +0000 | |
| commit | be78503554bcabd5378358c6b66a51925c8c0854 (patch) | |
| tree | 4397ae76be0e4889f19acf9a7bd7ae71b2645b71 | |
| parent | 2b041061e38df1afedfd72d28eae896bd3c833b0 (diff) | |
| parent | 07425c8c00b8c3050e6e4c54a3735a437304bfe8 (diff) | |
Merge "Adding USB Recording warning message to UsbResolverActivity."
8 files changed, 52 insertions, 6 deletions
diff --git a/core/java/com/android/internal/app/ChooserListAdapter.java b/core/java/com/android/internal/app/ChooserListAdapter.java index 6eb470fef2bc..38f4c64768db 100644 --- a/core/java/com/android/internal/app/ChooserListAdapter.java +++ b/core/java/com/android/internal/app/ChooserListAdapter.java @@ -95,7 +95,7 @@ public class ChooserListAdapter extends ResolverListAdapter { // we want to separate them into a different section. super(context, payloadIntents, null, rList, filterLastUsed, resolverListController, useLayoutForBrowsables, - chooserListCommunicator); + chooserListCommunicator, false); createPlaceHolders(); mMaxShortcutTargetsPerApp = diff --git a/core/java/com/android/internal/app/ResolverActivity.java b/core/java/com/android/internal/app/ResolverActivity.java index c1c6ac9dfa89..1beb1c5e912a 100644 --- a/core/java/com/android/internal/app/ResolverActivity.java +++ b/core/java/com/android/internal/app/ResolverActivity.java @@ -140,6 +140,9 @@ public class ResolverActivity extends Activity implements private final PackageMonitor mPackageMonitor = createPackageMonitor(); + // Intent extra for connected audio devices + public static final String EXTRA_IS_AUDIO_CAPTURE_DEVICE = "is_audio_capture_device"; + /** * Get the string resource to be used as a label for the link to the resolver activity for an * action. @@ -1038,8 +1041,14 @@ public class ResolverActivity extends Activity implements public ResolverListAdapter createAdapter(Context context, List<Intent> payloadIntents, Intent[] initialIntents, List<ResolveInfo> rList, boolean filterLastUsed, boolean useLayoutForBrowsables) { + + Intent startIntent = getIntent(); + boolean isAudioCaptureDevice = + startIntent.getBooleanExtra(EXTRA_IS_AUDIO_CAPTURE_DEVICE, false); + return new ResolverListAdapter(context, payloadIntents, initialIntents, rList, - filterLastUsed, createListController(), useLayoutForBrowsables, this); + filterLastUsed, createListController(), useLayoutForBrowsables, this, + isAudioCaptureDevice); } @VisibleForTesting diff --git a/core/java/com/android/internal/app/ResolverListAdapter.java b/core/java/com/android/internal/app/ResolverListAdapter.java index 4076ddaa71b0..a587936ee571 100644 --- a/core/java/com/android/internal/app/ResolverListAdapter.java +++ b/core/java/com/android/internal/app/ResolverListAdapter.java @@ -24,6 +24,7 @@ import android.app.ActivityManager; import android.content.ComponentName; import android.content.Context; import android.content.Intent; +import android.content.PermissionChecker; import android.content.pm.ActivityInfo; import android.content.pm.ApplicationInfo; import android.content.pm.LabeledIntent; @@ -86,13 +87,15 @@ public class ResolverListAdapter extends BaseAdapter { private boolean mFilterLastUsed; private final ResolverListCommunicator mResolverListCommunicator; private Runnable mPostListReadyRunnable; + private final boolean mIsAudioCaptureDevice; public ResolverListAdapter(Context context, List<Intent> payloadIntents, Intent[] initialIntents, List<ResolveInfo> rList, boolean filterLastUsed, ResolverListController resolverListController, boolean useLayoutForBrowsables, - ResolverListCommunicator resolverListCommunicator) { + ResolverListCommunicator resolverListCommunicator, + boolean isAudioCaptureDevice) { mContext = context; mIntents = payloadIntents; mInitialIntents = initialIntents; @@ -105,6 +108,7 @@ public class ResolverListAdapter extends BaseAdapter { mSuspendedMatrixColorFilter = createSuspendedColorMatrix(); mUseLayoutForBrowsables = useLayoutForBrowsables; mResolverListCommunicator = resolverListCommunicator; + mIsAudioCaptureDevice = isAudioCaptureDevice; final ActivityManager am = (ActivityManager) mContext.getSystemService(ACTIVITY_SERVICE); mIconDpi = am.getLauncherLargeIconDensity(); } @@ -651,6 +655,29 @@ public class ResolverListAdapter extends BaseAdapter { protected CharSequence[] doInBackground(Void... voids) { ResolveInfoPresentationGetter pg = makePresentationGetter(mDisplayResolveInfo.getResolveInfo()); + + if (mIsAudioCaptureDevice) { + // This is an audio capture device, so check record permissions + ActivityInfo activityInfo = mDisplayResolveInfo.getResolveInfo().activityInfo; + String packageName = activityInfo.packageName; + + int uid = activityInfo.applicationInfo.uid; + boolean hasRecordPermission = + PermissionChecker.checkPermissionForPreflight( + mContext, + android.Manifest.permission.RECORD_AUDIO, -1, uid, + packageName) + == android.content.pm.PackageManager.PERMISSION_GRANTED; + + if (!hasRecordPermission) { + // Doesn't have record permission, so warn the user + return new CharSequence[] { + pg.getLabel(), + mContext.getString(R.string.usb_device_resolve_prompt_warn) + }; + } + } + return new CharSequence[] { pg.getLabel(), pg.getSubLabel() diff --git a/core/res/res/layout/resolve_list_item.xml b/core/res/res/layout/resolve_list_item.xml index 485709523e66..86f028c174fe 100644 --- a/core/res/res/layout/resolve_list_item.xml +++ b/core/res/res/layout/resolve_list_item.xml @@ -54,7 +54,9 @@ android:minLines="1" android:maxLines="1" android:ellipsize="marquee" /> - <!-- Extended activity info to distinguish between duplicate activity names --> + <!-- Extended activity info to distinguish between duplicate activity names + or provide record w/o permission warnings. + --> <TextView android:id="@android:id/text2" android:textColor="?android:attr/textColorSecondary" android:fontFamily="@android:string/config_bodyFontFamily" @@ -64,7 +66,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:minLines="1" - android:maxLines="1" + android:maxLines="2" android:ellipsize="marquee" /> </LinearLayout> </LinearLayout> diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml index d39d50739e1d..585c4bba4ba9 100644 --- a/core/res/res/values/strings.xml +++ b/core/res/res/values/strings.xml @@ -5440,4 +5440,6 @@ <!-- ChooserActivity - Alphabetically sorted apps list label. [CHAR LIMIT=NONE] --> <string name="chooser_all_apps_button_label">Apps list</string> + <!-- Prompt for the USB device resolver dialog with warning text for USB device dialogs. [CHAR LIMIT=200] --> + <string name="usb_device_resolve_prompt_warn">This app has not been granted record permission but could capture audio through this USB device.</string> </resources> diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index 8d96c79ed3d8..13139123fe55 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -3876,4 +3876,6 @@ <java-symbol type="bool" name="config_showBuiltinWirelessChargingAnim" /> + <java-symbol type="string" name="usb_device_resolve_prompt_warn" /> + </resources> diff --git a/core/tests/coretests/src/com/android/internal/app/ResolverWrapperAdapter.java b/core/tests/coretests/src/com/android/internal/app/ResolverWrapperAdapter.java index e41df4186a12..a2191b5fac80 100644 --- a/core/tests/coretests/src/com/android/internal/app/ResolverWrapperAdapter.java +++ b/core/tests/coretests/src/com/android/internal/app/ResolverWrapperAdapter.java @@ -39,7 +39,7 @@ public class ResolverWrapperAdapter extends ResolverListAdapter { ResolverListCommunicator resolverListCommunicator) { super(context, payloadIntents, initialIntents, rList, filterLastUsed, resolverListController, - useLayoutForBrowsables, resolverListCommunicator); + useLayoutForBrowsables, resolverListCommunicator, false); } public CountingIdlingResource getLabelIdlingResource() { diff --git a/packages/SystemUI/src/com/android/systemui/usb/UsbResolverActivity.java b/packages/SystemUI/src/com/android/systemui/usb/UsbResolverActivity.java index 0b273274f86d..2e30d32440ab 100644 --- a/packages/SystemUI/src/com/android/systemui/usb/UsbResolverActivity.java +++ b/packages/SystemUI/src/com/android/systemui/usb/UsbResolverActivity.java @@ -87,8 +87,10 @@ public class UsbResolverActivity extends ResolverActivity { } mDevice = (UsbDevice)target.getParcelableExtra(UsbManager.EXTRA_DEVICE); + boolean hasAudioCapture = false; if (mDevice != null) { mDisconnectedReceiver = new UsbDisconnectedReceiver(this, mDevice); + hasAudioCapture = mDevice.getHasAudioCapture(); } else { mAccessory = (UsbAccessory)target.getParcelableExtra(UsbManager.EXTRA_ACCESSORY); if (mAccessory == null) { @@ -119,6 +121,8 @@ public class UsbResolverActivity extends ResolverActivity { } } } + getIntent().putExtra( + ResolverActivity.EXTRA_IS_AUDIO_CAPTURE_DEVICE, hasAudioCapture); CharSequence title = getResources().getText(com.android.internal.R.string.chooseUsbActivity); super.onCreate(savedInstanceState, target, title, null, rList, true); |