[Partial Screensharing] Update app selector (ChooserActivity) header

Updates title style (increases font size), adds an icon
and hides the drag handle for media projection app
selector activity which is based on ChooserActivity.

Bug: 235465652
Test: atest com.android.internal.app.ChooserActivityTest
Test: screenshot test in a follow-up CL
Change-Id: Ib717d3f7e6132d56e8344f4e06a12a64ee63457b
This commit is contained in:
Nick Chameyev
2022-08-05 16:36:46 +00:00
parent 4cce97fd2e
commit 2d2b24f09d
7 changed files with 160 additions and 10 deletions

View File

@@ -1619,6 +1619,8 @@ public class ChooserActivity extends ResolverActivity implements
if (mChooserMultiProfilePagerAdapter.getInactiveListAdapter() != null) { if (mChooserMultiProfilePagerAdapter.getInactiveListAdapter() != null) {
mChooserMultiProfilePagerAdapter.getInactiveListAdapter().destroyAppPredictor(); mChooserMultiProfilePagerAdapter.getInactiveListAdapter().destroyAppPredictor();
} }
mPersonalAppPredictor = null;
mWorkAppPredictor = null;
} }
@Override // ResolverListCommunicator @Override // ResolverListCommunicator

View File

@@ -79,6 +79,11 @@
<java-symbol type="id" name="deny_button" /> <java-symbol type="id" name="deny_button" />
<java-symbol type="id" name="description" /> <java-symbol type="id" name="description" />
<java-symbol type="id" name="divider" /> <java-symbol type="id" name="divider" />
<java-symbol type="id" name="drag" />
<java-symbol type="id" name="profile_pager" />
<java-symbol type="id" name="chooser_header" />
<java-symbol type="id" name="content_preview_container" />
<java-symbol type="id" name="profile_tabhost" />
<java-symbol type="id" name="edit_query" /> <java-symbol type="id" name="edit_query" />
<java-symbol type="id" name="edittext_container" /> <java-symbol type="id" name="edittext_container" />
<java-symbol type="id" name="expand_activities_button" /> <java-symbol type="id" name="expand_activities_button" />

View File

@@ -0,0 +1,25 @@
<!--
~ Copyright (C) 2022 The Android Open Source Project
~
~ Licensed under the Apache License, Version 2.0 (the "License");
~ you may not use this file except in compliance with the License.
~ You may obtain a copy of the License at
~
~ http://www.apache.org/licenses/LICENSE-2.0
~
~ Unless required by applicable law or agreed to in writing, software
~ distributed under the License is distributed on an "AS IS" BASIS,
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
~ See the License for the specific language governing permissions and
~ limitations under the License.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="?attr/colorControlNormal">
<path
android:fillColor="@android:color/white"
android:pathData="M21,3L3,3c-1.11,0 -2,0.89 -2,2v14c0,1.11 0.89,2 2,2h18c1.11,0 2,-0.89 2,-2L23,5c0,-1.11 -0.89,-2 -2,-2zM21,19.02L3,19.02L3,4.98h18v14.04zM8,12l4,-4 4,4 -1.41,1.41L13,11.83L13,16h-2v-4.17l-1.59,1.59L8,12z"/>
</vector>

View File

@@ -0,0 +1,92 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
~ Copyright (C) 2022 The Android Open Source Project
~
~ Licensed under the Apache License, Version 2.0 (the "License");
~ you may not use this file except in compliance with the License.
~ You may obtain a copy of the License at
~
~ http://www.apache.org/licenses/LICENSE-2.0
~
~ Unless required by applicable law or agreed to in writing, software
~ distributed under the License is distributed on an "AS IS" BASIS,
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
~ See the License for the specific language governing permissions and
~ limitations under the License.
-->
<com.android.internal.widget.ResolverDrawerLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center"
androidprv:maxCollapsedHeight="0dp"
androidprv:maxCollapsedHeightSmall="56dp"
androidprv:maxWidth="@*android:dimen/chooser_width"
android:id="@*android:id/contentPanel">
<LinearLayout
android:id="@*android:id/chooser_header"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
androidprv:layout_alwaysShow="true"
android:gravity="center"
android:elevation="0dp"
android:background="@*android:drawable/bottomsheet_background">
<ImageView
android:id="@*android:id/icon"
android:layout_width="@dimen/media_projection_app_selector_icon_size"
android:layout_height="@dimen/media_projection_app_selector_icon_size"
android:layout_marginTop="@*android:dimen/chooser_edge_margin_normal"
android:layout_marginBottom="@*android:dimen/chooser_edge_margin_normal"
android:importantForAccessibility="no"
android:tint="?android:attr/textColorPrimary"/>
<TextView android:id="@*android:id/title"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:textAppearance="?android:attr/textAppearanceLarge"
android:gravity="center"
android:paddingBottom="@*android:dimen/chooser_view_spacing"
android:paddingLeft="24dp"
android:paddingRight="24dp"/>
</LinearLayout>
<FrameLayout
android:id="@*android:id/content_preview_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:visibility="gone" />
<TabHost
android:id="@*android:id/profile_tabhost"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:background="?android:attr/colorBackground">
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TabWidget
android:id="@*android:id/tabs"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:visibility="gone">
</TabWidget>
<FrameLayout
android:id="@*android:id/tabcontent"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<com.android.internal.app.ResolverViewPager
android:id="@*android:id/profile_pager"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</FrameLayout>
</LinearLayout>
</TabHost>
</com.android.internal.widget.ResolverDrawerLayout>

View File

@@ -1446,6 +1446,8 @@
<dimen name="fgs_manager_list_top_spacing">12dp</dimen> <dimen name="fgs_manager_list_top_spacing">12dp</dimen>
<dimen name="media_projection_app_selector_icon_size">32dp</dimen>
<!-- Dream overlay related dimensions --> <!-- Dream overlay related dimensions -->
<dimen name="dream_overlay_status_bar_height">60dp</dimen> <dimen name="dream_overlay_status_bar_height">60dp</dimen>
<dimen name="dream_overlay_status_bar_margin">40dp</dimen> <dimen name="dream_overlay_status_bar_margin">40dp</dimen>

View File

@@ -23,35 +23,47 @@ import android.os.Binder
import android.os.Bundle import android.os.Bundle
import android.os.IBinder import android.os.IBinder
import android.os.ResultReceiver import android.os.ResultReceiver
import android.view.View import android.os.UserHandle
import android.widget.ImageView
import com.android.internal.app.ChooserActivity import com.android.internal.app.ChooserActivity
import com.android.internal.app.ResolverListController
import com.android.internal.app.chooser.NotSelectableTargetInfo import com.android.internal.app.chooser.NotSelectableTargetInfo
import com.android.internal.app.chooser.TargetInfo import com.android.internal.app.chooser.TargetInfo
import com.android.internal.annotations.VisibleForTesting;
import com.android.systemui.util.AsyncActivityLauncher import com.android.systemui.util.AsyncActivityLauncher
import com.android.systemui.R; import com.android.systemui.R
import javax.inject.Inject import com.android.internal.R as AndroidR
class MediaProjectionAppSelectorActivity @Inject constructor( class MediaProjectionAppSelectorActivity constructor(
private val activityLauncher: AsyncActivityLauncher private val activityLauncher: AsyncActivityLauncher,
/** This is used to override the dependency in a screenshot test */
@VisibleForTesting
private val listControllerFactory: ((userHandle: UserHandle) -> ResolverListController)? = null
) : ChooserActivity() { ) : ChooserActivity() {
override fun getLayoutResource() =
R.layout.media_projection_app_selector
public override fun onCreate(bundle: Bundle?) { public override fun onCreate(bundle: Bundle?) {
val queryIntent = Intent(Intent.ACTION_MAIN) val queryIntent = Intent(Intent.ACTION_MAIN)
.addCategory(Intent.CATEGORY_LAUNCHER) .addCategory(Intent.CATEGORY_LAUNCHER)
intent.putExtra(Intent.EXTRA_INTENT, queryIntent) intent.putExtra(Intent.EXTRA_INTENT, queryIntent)
// TODO(b/235465652) Use resource lexeme // TODO(b/240939253): update copies
intent.putExtra(Intent.EXTRA_TITLE, "Record or cast an app") val title = getString(R.string.media_projection_dialog_service_title)
intent.putExtra(Intent.EXTRA_TITLE, title)
super.onCreate(bundle) super.onCreate(bundle)
// TODO(b/235465652) we should update VisD of the title and add an icon requireViewById<ImageView>(AndroidR.id.icon).setImageResource(R.drawable.ic_present_to_all)
findViewById<View>(R.id.title)?.visibility = View.VISIBLE
} }
override fun appliedThemeResId(): Int = override fun appliedThemeResId(): Int =
R.style.Theme_SystemUI_MediaProjectionAppSelector R.style.Theme_SystemUI_MediaProjectionAppSelector
override fun createListController(userHandle: UserHandle): ResolverListController =
listControllerFactory?.invoke(userHandle) ?: super.createListController(userHandle)
override fun startSelected(which: Int, always: Boolean, filtered: Boolean) { override fun startSelected(which: Int, always: Boolean, filtered: Boolean) {
val currentListAdapter = mChooserMultiProfilePagerAdapter.activeListAdapter val currentListAdapter = mChooserMultiProfilePagerAdapter.activeListAdapter
val targetInfo = currentListAdapter.targetInfoForPosition(which, filtered) ?: return val targetInfo = currentListAdapter.targetInfoForPosition(which, filtered) ?: return

View File

@@ -18,8 +18,10 @@ package com.android.systemui.media.dagger
import android.app.Activity import android.app.Activity
import com.android.systemui.media.MediaProjectionAppSelectorActivity import com.android.systemui.media.MediaProjectionAppSelectorActivity
import com.android.systemui.util.AsyncActivityLauncher
import dagger.Binds import dagger.Binds
import dagger.Module import dagger.Module
import dagger.Provides
import dagger.multibindings.ClassKey import dagger.multibindings.ClassKey
import dagger.multibindings.IntoMap import dagger.multibindings.IntoMap
@@ -29,7 +31,17 @@ abstract class MediaProjectionModule {
@Binds @Binds
@IntoMap @IntoMap
@ClassKey(MediaProjectionAppSelectorActivity::class) @ClassKey(MediaProjectionAppSelectorActivity::class)
abstract fun provideMediaProjectionAppSelectorActivity( abstract fun bindMediaProjectionAppSelectorActivity(
activity: MediaProjectionAppSelectorActivity): Activity activity: MediaProjectionAppSelectorActivity): Activity
companion object {
@Provides
fun provideMediaProjectionAppSelectorActivity(
activityLauncher: AsyncActivityLauncher
): MediaProjectionAppSelectorActivity {
return MediaProjectionAppSelectorActivity(
activityLauncher
)
}
}
} }