Move edit button next to page dots

Test: atest SystemUITests
Fixes: 215687235
Change-Id: I521a2f3e541403afe2b504926d515fb71bc90593
This commit is contained in:
Fabian Kozynski
2022-01-21 10:37:19 -05:00
parent d41dec9d25
commit 6002bbf034
12 changed files with 81 additions and 40 deletions

View File

@@ -22,21 +22,6 @@
android:layout_height="48dp"
android:gravity="center_vertical">
<com.android.systemui.statusbar.AlphaOptimizedImageView
android:id="@android:id/edit"
android:layout_width="0dp"
android:layout_height="@dimen/qs_footer_action_button_size"
android:layout_marginEnd="@dimen/qs_tile_margin_horizontal"
android:layout_weight="1"
android:background="@drawable/qs_footer_action_chip_background"
android:clickable="true"
android:clipToPadding="false"
android:contentDescription="@string/accessibility_quick_settings_edit"
android:focusable="true"
android:padding="@dimen/qs_footer_icon_padding"
android:src="@*android:drawable/ic_mode_edit"
android:tint="?android:attr/textColorPrimary" />
<com.android.systemui.statusbar.phone.MultiUserSwitch
android:id="@+id/multi_user_switch"
android:layout_width="0dp"

View File

@@ -15,7 +15,7 @@
-->
<inset xmlns:android="http://schemas.android.com/apk/res/android">
<shape>
<solid android:color="@color/qs_detail_transition"/>
<solid android:color="@android:color/transparent"/>
<corners android:radius="?android:attr/dialogCornerRadius" />
</shape>
</inset>

View File

@@ -17,7 +17,7 @@ Copyright (C) 2014 The Android Open Source Project
<item>
<inset>
<shape>
<solid android:color="@color/qs_detail_transition"/>
<solid android:color="@android:color/transparent"/>
<corners android:radius="@dimen/qs_footer_action_corner_radius" />
</shape>
</inset>

View File

@@ -43,7 +43,6 @@
android:id="@+id/build"
android:layout_width="0dp"
android:layout_height="match_parent"
android:paddingStart="@dimen/qs_tile_margin_horizontal"
android:paddingEnd="4dp"
android:layout_weight="1"
android:clickable="true"
@@ -61,10 +60,23 @@
android:layout_gravity="center_vertical"
android:visibility="gone" />
<View
<FrameLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1" />
android:layout_weight="1">
<com.android.systemui.statusbar.AlphaOptimizedImageView
android:id="@android:id/edit"
android:layout_width="@dimen/qs_footer_action_button_size"
android:layout_height="@dimen/qs_footer_action_button_size"
android:layout_gravity="center_vertical|end"
android:background="?android:attr/selectableItemBackground"
android:clickable="true"
android:contentDescription="@string/accessibility_quick_settings_edit"
android:focusable="true"
android:padding="@dimen/qs_footer_icon_padding"
android:src="@*android:drawable/ic_mode_edit"
android:tint="?android:attr/textColorPrimary" />
</FrameLayout>
</LinearLayout>

View File

@@ -23,7 +23,6 @@
<color name="system_bar_background_transparent">#00000000</color>
<color name="qs_tile_divider">#29ffffff</color><!-- 16% white -->
<color name="qs_detail_button_white">#B3FFFFFF</color><!-- 70% white -->
<color name="qs_detail_transition">#66FFFFFF</color>
<color name="status_bar_clock_color">#FFFFFFFF</color>
<color name="qs_tile_disabled_color">#9E9E9E</color> <!-- 38% black -->

View File

@@ -56,7 +56,6 @@ import javax.inject.Named
*/
class FooterActionsController @Inject constructor(
view: FooterActionsView,
private val qsPanelController: QSPanelController,
private val activityStarter: ActivityStarter,
private val userManager: UserManager,
private val userTracker: UserTracker,
@@ -82,7 +81,6 @@ class FooterActionsController @Inject constructor(
private val settingsButton: SettingsButton = view.findViewById(R.id.settings_button)
private val settingsButtonContainer: View? = view.findViewById(R.id.settings_button_container)
private val editButton: View = view.findViewById(android.R.id.edit)
private val powerMenuLite: View = view.findViewById(R.id.pm_lite)
private val onUserInfoChangedListener = OnUserInfoChangedListener { _, picture, _ ->
@@ -176,13 +174,6 @@ class FooterActionsController @Inject constructor(
powerMenuLite.visibility = View.GONE
}
settingsButton.setOnClickListener(onClickListener)
editButton.setOnClickListener(View.OnClickListener { view: View? ->
if (falsingManager.isFalseTap(FalsingManager.LOW_PENALTY)) {
return@OnClickListener
}
activityStarter.postQSRunnableDismissingKeyguard { qsPanelController.showEdit(view) }
})
updateView()
}

View File

@@ -36,7 +36,6 @@ import javax.inject.Inject
import javax.inject.Named
class FooterActionsControllerBuilder @Inject constructor(
private val qsPanelController: QSPanelController,
private val activityStarter: ActivityStarter,
private val userManager: UserManager,
private val userTracker: UserTracker,
@@ -66,7 +65,7 @@ class FooterActionsControllerBuilder @Inject constructor(
}
fun build(): FooterActionsController {
return FooterActionsController(view, qsPanelController, activityStarter, userManager,
return FooterActionsController(view, activityStarter, userManager,
userTracker, userInfoController, multiUserSwitchControllerFactory.create(view),
deviceProvisionedController, falsingManager, metricsLogger, tunerService,
globalActionsDialog, uiEventLogger, showPMLiteButton, buttonsVisibleState,

View File

@@ -43,7 +43,6 @@ class FooterActionsView(context: Context?, attrs: AttributeSet?) : LinearLayout(
private lateinit var multiUserSwitch: MultiUserSwitch
private lateinit var multiUserAvatar: ImageView
private lateinit var tunerIcon: View
private lateinit var editTilesButton: View
private var settingsCogAnimator: TouchAnimator? = null
@@ -52,7 +51,6 @@ class FooterActionsView(context: Context?, attrs: AttributeSet?) : LinearLayout(
override fun onFinishInflate() {
super.onFinishInflate()
editTilesButton = requireViewById(android.R.id.edit)
settingsButton = findViewById(R.id.settings_button)
settingsContainer = findViewById(R.id.settings_button_container)
multiUserSwitch = findViewById(R.id.multi_user_switch)
@@ -130,7 +128,6 @@ class FooterActionsView(context: Context?, attrs: AttributeSet?) : LinearLayout(
private fun updateClickabilities() {
multiUserSwitch.isClickable = multiUserSwitch.visibility == VISIBLE
editTilesButton.isClickable = editTilesButton.visibility == VISIBLE
settingsButton.isClickable = settingsButton.visibility == VISIBLE
}

View File

@@ -47,6 +47,7 @@ public class QSFooterView extends FrameLayout {
private PageIndicator mPageIndicator;
private TextView mBuildText;
private View mActionsContainer;
private View mEditButton;
@Nullable
protected TouchAnimator mFooterAnimator;
@@ -79,6 +80,7 @@ public class QSFooterView extends FrameLayout {
mPageIndicator = findViewById(R.id.footer_page_indicator);
mActionsContainer = requireViewById(R.id.qs_footer_actions);
mBuildText = findViewById(R.id.build);
mEditButton = findViewById(android.R.id.edit);
updateResources();
setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_YES);
@@ -130,6 +132,7 @@ public class QSFooterView extends FrameLayout {
.addFloat(mActionsContainer, "alpha", 0, 1)
.addFloat(mPageIndicator, "alpha", 0, 1)
.addFloat(mBuildText, "alpha", 0, 1)
.addFloat(mEditButton, "alpha", 0, 1)
.setStartDelay(0.9f);
return builder.build();
}

View File

@@ -26,6 +26,8 @@ import android.widget.TextView;
import android.widget.Toast;
import com.android.systemui.R;
import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.plugins.FalsingManager;
import com.android.systemui.qs.dagger.QSScope;
import com.android.systemui.settings.UserTracker;
import com.android.systemui.util.ViewController;
@@ -45,10 +47,15 @@ public class QSFooterViewController extends ViewController<QSFooterView> impleme
private final FooterActionsController mFooterActionsController;
private final TextView mBuildText;
private final PageIndicator mPageIndicator;
private final View mEditButton;
private final FalsingManager mFalsingManager;
private final ActivityStarter mActivityStarter;
@Inject
QSFooterViewController(QSFooterView view,
UserTracker userTracker,
FalsingManager falsingManager,
ActivityStarter activityStarter,
QSPanelController qsPanelController,
QuickQSPanelController quickQSPanelController,
@Named(QS_FOOTER) FooterActionsController footerActionsController) {
@@ -57,9 +64,12 @@ public class QSFooterViewController extends ViewController<QSFooterView> impleme
mQsPanelController = qsPanelController;
mQuickQSPanelController = quickQSPanelController;
mFooterActionsController = footerActionsController;
mFalsingManager = falsingManager;
mActivityStarter = activityStarter;
mBuildText = mView.findViewById(R.id.build);
mPageIndicator = mView.findViewById(R.id.footer_page_indicator);
mEditButton = mView.findViewById(android.R.id.edit);
}
@Override
@@ -91,6 +101,14 @@ public class QSFooterViewController extends ViewController<QSFooterView> impleme
}
return false;
});
mEditButton.setOnClickListener(view -> {
if (mFalsingManager.isFalseTap(FalsingManager.LOW_PENALTY)) {
return;
}
mActivityStarter
.postQSRunnableDismissingKeyguard(() -> mQsPanelController.showEdit(view));
});
mQsPanelController.setFooterPageIndicator(mPageIndicator);
mView.updateEverything();
}
@@ -103,6 +121,7 @@ public class QSFooterViewController extends ViewController<QSFooterView> impleme
@Override
public void setVisibility(int visibility) {
mView.setVisibility(visibility);
mEditButton.setClickable(visibility == View.VISIBLE);
}
@Override

View File

@@ -54,8 +54,6 @@ class FooterActionsControllerTest : LeakCheckedTest() {
@Mock
private lateinit var userInfoController: UserInfoController
@Mock
private lateinit var qsPanelController: QSPanelController
@Mock
private lateinit var multiUserSwitchController: MultiUserSwitchController
@Mock
private lateinit var globalActionsDialog: GlobalActionsDialogLite
@@ -81,7 +79,7 @@ class FooterActionsControllerTest : LeakCheckedTest() {
view = LayoutInflater.from(context)
.inflate(R.layout.footer_actions, null) as FooterActionsView
controller = FooterActionsController(view, qsPanelController, activityStarter,
controller = FooterActionsController(view, activityStarter,
userManager, userTracker, userInfoController, multiUserSwitchController,
deviceProvisionedController, falsingManager, metricsLogger, fakeTunerService,
globalActionsDialog, uiEventLogger, showPMLiteButton = true,

View File

@@ -18,7 +18,11 @@ package com.android.systemui.qs;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.any;
import static org.mockito.Mockito.anyInt;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyZeroInteractions;
import static org.mockito.Mockito.when;
import android.content.ClipData;
@@ -31,6 +35,8 @@ import android.widget.TextView;
import androidx.test.filters.SmallTest;
import com.android.systemui.R;
import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.plugins.FalsingManager;
import com.android.systemui.settings.UserTracker;
import com.android.systemui.utils.leaks.LeakCheckedTest;
@@ -60,13 +66,20 @@ public class QSFooterViewControllerTest extends LeakCheckedTest {
private TextView mBuildText;
@Mock
private FooterActionsController mFooterActionsController;
@Mock
private FalsingManager mFalsingManager;
@Mock
private ActivityStarter mActivityStarter;
private QSFooterViewController mController;
private View mEditButton;
@Before
public void setup() throws Exception {
MockitoAnnotations.initMocks(this);
mEditButton = new View(mContext);
injectLeakCheckedDependencies(ALL_SUPPORTED_CLASSES);
mContext.addMockSystemService(ClipboardManager.class, mClipboardManager);
@@ -77,9 +90,11 @@ public class QSFooterViewControllerTest extends LeakCheckedTest {
when(mView.isAttachedToWindow()).thenReturn(true);
when(mView.findViewById(R.id.build)).thenReturn(mBuildText);
when(mView.findViewById(android.R.id.edit)).thenReturn(mEditButton);
mController = new QSFooterViewController(mView, mUserTracker, mQSPanelController,
mQuickQSPanelController, mFooterActionsController);
mController = new QSFooterViewController(mView, mUserTracker, mFalsingManager,
mActivityStarter, mQSPanelController, mQuickQSPanelController,
mFooterActionsController);
mController.init();
}
@@ -99,4 +114,27 @@ public class QSFooterViewControllerTest extends LeakCheckedTest {
verify(mClipboardManager).setPrimaryClip(captor.capture());
assertThat(captor.getValue().getItemAt(0).getText()).isEqualTo(text);
}
@Test
public void testEditButton_falseTap() {
when(mFalsingManager.isFalseTap(anyInt())).thenReturn(true);
mEditButton.performClick();
verify(mQSPanelController, never()).showEdit(any());
verifyZeroInteractions(mActivityStarter);
}
@Test
public void testEditButton_realTap() {
when(mFalsingManager.isFalseTap(anyInt())).thenReturn(false);
mEditButton.performClick();
ArgumentCaptor<Runnable> captor = ArgumentCaptor.forClass(Runnable.class);
verify(mActivityStarter).postQSRunnableDismissingKeyguard(captor.capture());
captor.getValue().run();
verify(mQSPanelController).showEdit(mEditButton);
}
}