Loading core/java/com/android/internal/app/ChooserListAdapter.java +1 −1 Original line number Diff line number Diff line Loading @@ -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 = Loading core/java/com/android/internal/app/ResolverActivity.java +10 −1 Original line number Diff line number Diff line Loading @@ -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. Loading Loading @@ -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 Loading core/java/com/android/internal/app/ResolverListAdapter.java +28 −1 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading @@ -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(); } Loading Loading @@ -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() Loading core/res/res/layout/resolve_list_item.xml +4 −2 Original line number Diff line number Diff line Loading @@ -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" Loading @@ -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> Loading core/res/res/values/strings.xml +2 −0 Original line number Diff line number Diff line Loading @@ -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> Loading
core/java/com/android/internal/app/ChooserListAdapter.java +1 −1 Original line number Diff line number Diff line Loading @@ -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 = Loading
core/java/com/android/internal/app/ResolverActivity.java +10 −1 Original line number Diff line number Diff line Loading @@ -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. Loading Loading @@ -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 Loading
core/java/com/android/internal/app/ResolverListAdapter.java +28 −1 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading @@ -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(); } Loading Loading @@ -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() Loading
core/res/res/layout/resolve_list_item.xml +4 −2 Original line number Diff line number Diff line Loading @@ -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" Loading @@ -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> Loading
core/res/res/values/strings.xml +2 −0 Original line number Diff line number Diff line Loading @@ -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>