diff options
7 files changed, 115 insertions, 30 deletions
diff --git a/packages/SystemUI/res/layout/screen_share_dialog_spinner_item_text.xml b/packages/SystemUI/res/layout/screen_share_dialog_spinner_item_text.xml index 66c215599949..1e5b249b5021 100644 --- a/packages/SystemUI/res/layout/screen_share_dialog_spinner_item_text.xml +++ b/packages/SystemUI/res/layout/screen_share_dialog_spinner_item_text.xml @@ -13,15 +13,32 @@ See the License for the specific language governing permissions and limitations under the License. --> -<TextView xmlns:android="http://schemas.android.com/apk/res/android" +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:androidprv="http://schemas.android.com/apk/prv/res/android" - android:id="@android:id/text1" - android:textAppearance="?android:attr/textAppearanceMedium" - android:textColor="?androidprv:attr/textColorOnAccent" - android:singleLine="true" android:layout_width="match_parent" - android:layout_height="@dimen/screenrecord_spinner_height" - android:gravity="center_vertical" - android:ellipsize="marquee" + android:layout_height="wrap_content" + android:minHeight="@dimen/screenrecord_spinner_height" + android:paddingEnd="@dimen/screenrecord_spinner_text_padding_end" android:paddingStart="@dimen/screenrecord_spinner_text_padding_start" - android:paddingEnd="@dimen/screenrecord_spinner_text_padding_end"/>
\ No newline at end of file + android:gravity="center_vertical" + android:orientation="vertical"> + + <TextView + android:id="@android:id/text1" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:ellipsize="marquee" + android:singleLine="true" + android:textAppearance="?android:attr/textAppearanceMedium" + android:textColor="?androidprv:attr/textColorOnAccent" /> + + <TextView + android:id="@android:id/text2" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:ellipsize="marquee" + android:singleLine="true" + android:textAppearance="?android:attr/textAppearanceSmall" + android:textColor="?androidprv:attr/colorError" /> + +</LinearLayout>
\ No newline at end of file diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml index cddfda2f9ce7..275e5d8db153 100644 --- a/packages/SystemUI/res/values/strings.xml +++ b/packages/SystemUI/res/values/strings.xml @@ -1102,6 +1102,8 @@ <string name="media_projection_entry_app_permission_dialog_warning_single_app">When you’re sharing, recording, or casting an app, <xliff:g id="app_seeking_permission" example="Meet">%s</xliff:g> has access to anything shown or played on that app. So be careful with things like passwords, payment details, messages, photos, and audio and video.</string> <!-- 1P/3P apps media projection permission button to continue with app selection or recording [CHAR LIMIT=60] --> <string name="media_projection_entry_app_permission_dialog_continue">Start</string> + <!-- 1P/3P apps disabled the single app projection option. [CHAR LIMIT=NONE] --> + <string name="media_projection_entry_app_permission_dialog_single_app_disabled"><xliff:g id="app_name" example="Meet">%1$s</xliff:g> has disabled this option</string> <!-- Casting that launched by SysUI (i.e. when there is no app name) --> <!-- System casting media projection permission dialog title. [CHAR LIMIT=100] --> diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaProjectionPermissionActivity.java b/packages/SystemUI/src/com/android/systemui/media/MediaProjectionPermissionActivity.java index cbd9a34e9a66..a9d2b30c2b6f 100644 --- a/packages/SystemUI/src/com/android/systemui/media/MediaProjectionPermissionActivity.java +++ b/packages/SystemUI/src/com/android/systemui/media/MediaProjectionPermissionActivity.java @@ -36,6 +36,7 @@ import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.graphics.Typeface; import android.media.projection.IMediaProjection; +import android.media.projection.MediaProjectionConfig; import android.media.projection.MediaProjectionManager; import android.media.projection.ReviewGrantedConsentResult; import android.os.Bundle; @@ -212,11 +213,13 @@ public class MediaProjectionPermissionActivity extends Activity // the correct screen width when in split screen. Context dialogContext = getApplicationContext(); if (isPartialScreenSharingEnabled()) { - mDialog = new MediaProjectionPermissionDialog(dialogContext, () -> { - ScreenShareOption selectedOption = - ((MediaProjectionPermissionDialog) mDialog).getSelectedScreenShareOption(); - grantMediaProjectionPermission(selectedOption.getMode()); - }, () -> finish(RECORD_CANCEL, /* projection= */ null), appName); + mDialog = new MediaProjectionPermissionDialog(dialogContext, getMediaProjectionConfig(), + () -> { + MediaProjectionPermissionDialog dialog = + (MediaProjectionPermissionDialog) mDialog; + ScreenShareOption selectedOption = dialog.getSelectedScreenShareOption(); + grantMediaProjectionPermission(selectedOption.getMode()); + }, () -> finish(RECORD_CANCEL, /* projection= */ null), appName); } else { AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(dialogContext, R.style.Theme_SystemUI_Dialog) @@ -360,6 +363,16 @@ public class MediaProjectionPermissionActivity extends Activity } } + @Nullable + private MediaProjectionConfig getMediaProjectionConfig() { + Intent intent = getIntent(); + if (intent == null) { + return null; + } + return intent.getParcelableExtra( + MediaProjectionManager.EXTRA_MEDIA_PROJECTION_CONFIG); + } + private boolean isPartialScreenSharingEnabled() { return mFeatureFlags.isEnabled(Flags.WM_ENABLE_PARTIAL_SCREEN_SHARING); } diff --git a/packages/SystemUI/src/com/android/systemui/screenrecord/BaseScreenSharePermissionDialog.kt b/packages/SystemUI/src/com/android/systemui/screenrecord/BaseScreenSharePermissionDialog.kt index 23894a3f7835..7859fa0b1d87 100644 --- a/packages/SystemUI/src/com/android/systemui/screenrecord/BaseScreenSharePermissionDialog.kt +++ b/packages/SystemUI/src/com/android/systemui/screenrecord/BaseScreenSharePermissionDialog.kt @@ -18,7 +18,9 @@ package com.android.systemui.screenrecord import android.content.Context import android.os.Bundle import android.view.Gravity +import android.view.LayoutInflater import android.view.View +import android.view.ViewGroup import android.view.ViewStub import android.view.WindowManager import android.widget.AdapterView @@ -35,7 +37,7 @@ import com.android.systemui.statusbar.phone.SystemUIDialog /** Base permission dialog for screen share and recording */ open class BaseScreenSharePermissionDialog( - context: Context?, + context: Context, private val screenShareOptions: List<ScreenShareOption>, private val appName: String?, @DrawableRes private val dialogIconDrawable: Int? = null, @@ -82,14 +84,7 @@ open class BaseScreenSharePermissionDialog( get() = context.getString(selectedScreenShareOption.warningText, appName) private fun initScreenShareSpinner() { - val options = screenShareOptions.map { context.getString(it.spinnerText) }.toTypedArray() - val adapter = - ArrayAdapter( - context.applicationContext, - R.layout.screen_share_dialog_spinner_text, - options - ) - adapter.setDropDownViewResource(R.layout.screen_share_dialog_spinner_item_text) + val adapter = OptionsAdapter(context.applicationContext, screenShareOptions) screenShareModeSpinner = requireViewById(R.id.screen_share_mode_spinner) screenShareModeSpinner.adapter = adapter screenShareModeSpinner.onItemSelectedListener = this @@ -131,3 +126,35 @@ open class BaseScreenSharePermissionDialog( stub.inflate() } } + +private class OptionsAdapter( + context: Context, + private val options: List<ScreenShareOption>, +) : + ArrayAdapter<String>( + context, + R.layout.screen_share_dialog_spinner_text, + options.map { context.getString(it.spinnerText) } + ) { + + override fun isEnabled(position: Int): Boolean { + return options[position].spinnerDisabledText == null + } + + override fun getDropDownView(position: Int, convertView: View?, parent: ViewGroup): View { + val inflater = LayoutInflater.from(parent.context) + val view = inflater.inflate(R.layout.screen_share_dialog_spinner_item_text, parent, false) + val titleTextView = view.findViewById<TextView>(android.R.id.text1) + val errorTextView = view.findViewById<TextView>(android.R.id.text2) + titleTextView.text = getItem(position) + errorTextView.text = options[position].spinnerDisabledText + if (isEnabled(position)) { + errorTextView.visibility = View.GONE + titleTextView.isEnabled = true + } else { + errorTextView.visibility = View.VISIBLE + titleTextView.isEnabled = false + } + return view + } +} diff --git a/packages/SystemUI/src/com/android/systemui/screenrecord/MediaProjectionPermissionDialog.kt b/packages/SystemUI/src/com/android/systemui/screenrecord/MediaProjectionPermissionDialog.kt index f4f5f66dfb09..8cbc4aab3bd3 100644 --- a/packages/SystemUI/src/com/android/systemui/screenrecord/MediaProjectionPermissionDialog.kt +++ b/packages/SystemUI/src/com/android/systemui/screenrecord/MediaProjectionPermissionDialog.kt @@ -16,16 +16,23 @@ package com.android.systemui.screenrecord import android.content.Context +import android.media.projection.MediaProjectionConfig import android.os.Bundle import com.android.systemui.R /** Dialog to select screen recording options */ class MediaProjectionPermissionDialog( - context: Context?, + context: Context, + mediaProjectionConfig: MediaProjectionConfig?, private val onStartRecordingClicked: Runnable, private val onCancelClicked: Runnable, private val appName: String? -) : BaseScreenSharePermissionDialog(context, createOptionList(appName), appName) { +) : + BaseScreenSharePermissionDialog( + context, + createOptionList(context, appName, mediaProjectionConfig), + appName + ) { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // TODO(b/270018943): Handle the case of System sharing (not recording nor casting) @@ -49,7 +56,11 @@ class MediaProjectionPermissionDialog( } companion object { - private fun createOptionList(appName: String?): List<ScreenShareOption> { + private fun createOptionList( + context: Context, + appName: String?, + mediaProjectionConfig: MediaProjectionConfig? + ): List<ScreenShareOption> { val singleAppWarningText = if (appName == null) { R.string.media_projection_entry_cast_permission_dialog_warning_single_app @@ -63,6 +74,19 @@ class MediaProjectionPermissionDialog( R.string.media_projection_entry_app_permission_dialog_warning_entire_screen } + val singleAppDisabledText = + if ( + appName != null && + mediaProjectionConfig?.regionToCapture == + MediaProjectionConfig.CAPTURE_REGION_FIXED_DISPLAY + ) { + context.getString( + R.string.media_projection_entry_app_permission_dialog_single_app_disabled, + appName + ) + } else { + null + } return listOf( ScreenShareOption( mode = ENTIRE_SCREEN, @@ -72,7 +96,8 @@ class MediaProjectionPermissionDialog( ScreenShareOption( mode = SINGLE_APP, spinnerText = R.string.screen_share_permission_dialog_option_single_app, - warningText = singleAppWarningText + warningText = singleAppWarningText, + spinnerDisabledText = singleAppDisabledText, ) ) } diff --git a/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenRecordPermissionDialog.kt b/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenRecordPermissionDialog.kt index fb99775b6549..9c5da1011bc0 100644 --- a/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenRecordPermissionDialog.kt +++ b/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenRecordPermissionDialog.kt @@ -41,7 +41,7 @@ import com.android.systemui.settings.UserContextProvider /** Dialog to select screen recording options */ class ScreenRecordPermissionDialog( - context: Context?, + context: Context, private val hostUserHandle: UserHandle, private val controller: RecordingController, private val activityStarter: ActivityStarter, @@ -52,7 +52,7 @@ class ScreenRecordPermissionDialog( BaseScreenSharePermissionDialog( context, createOptionList(), - null, + appName = null, R.drawable.ic_screenrecord, R.color.screenrecord_icon_color ) { diff --git a/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenShareOption.kt b/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenShareOption.kt index 3d39fd82ac63..ebf0dd28fbf4 100644 --- a/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenShareOption.kt +++ b/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenShareOption.kt @@ -29,5 +29,6 @@ const val SINGLE_APP = 1 class ScreenShareOption( @ScreenShareMode val mode: Int, @StringRes val spinnerText: Int, - @StringRes val warningText: Int + @StringRes val warningText: Int, + val spinnerDisabledText: String? = null, ) |