Move edit button next to page dots
Test: atest SystemUITests Fixes: 215687235 Change-Id: I521a2f3e541403afe2b504926d515fb71bc90593
This commit is contained in:
@@ -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"
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
|
||||
@@ -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 -->
|
||||
|
||||
|
||||
@@ -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()
|
||||
}
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user