Change brightness mirror background

And match size to slider.

Also, simplify slider hierarchy by removing an unnecessary FrameLayout.

Test: manual
Test: atest com.android.systemui.settings.brightness
Fixes: 185505618

Change-Id: Iaf33514e627974a91712b5af99e171a7c64a3295
This commit is contained in:
Fabian Kozynski
2021-04-19 12:40:49 -04:00
parent 9646f6630b
commit 815f2dd72e
11 changed files with 85 additions and 87 deletions

View File

@@ -16,5 +16,5 @@
-->
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="?attr/underSurfaceColor" />
<corners android:radius="8dp" />
<corners android:radius="@dimen/rounded_slider_background_rounded_corner" />
</shape>

View File

@@ -17,10 +17,14 @@
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:theme="@style/Theme.SystemUI.QuickSettings"
android:id="@+id/brightness_mirror"
android:layout_width="@dimen/qs_panel_width"
android:layout_height="@dimen/brightness_mirror_height"
android:layout_gravity="@integer/notification_panel_layout_gravity"
android:id="@+id/brightness_mirror_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/brightness_mirror_background"
android:layout_gravity="center_vertical"
android:layout_margin="8dp"
android:padding="@dimen/rounded_slider_background_padding"
android:gravity="center"
android:visibility="invisible">
</FrameLayout>

View File

@@ -13,16 +13,12 @@
See the License for the specific language governing permissions and
limitations under the License.
-->
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:layout_gravity="center">
<com.android.systemui.settings.brightness.BrightnessSliderView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/brightness_slider"
android:layout_width="match_parent"
android:layout_height="@dimen/brightness_mirror_height"
android:layout_gravity="center_vertical"
android:layout_gravity="center"
android:contentDescription="@string/accessibility_brightness"
android:importantForAccessibility="no" >
@@ -40,4 +36,3 @@
android:splitTrack="false"
/>
</com.android.systemui.settings.brightness.BrightnessSliderView>
</FrameLayout>

View File

@@ -70,7 +70,7 @@
android:layout_height="match_parent"
android:visibility="invisible" />
<include layout="@layout/brightness_mirror" />
<include layout="@layout/brightness_mirror_container" />
<com.android.systemui.statusbar.ScrimView
android:id="@+id/scrim_in_front"

View File

@@ -1430,6 +1430,9 @@
<dimen name="rounded_slider_track_width">4dp</dimen>
<!-- rounded_slider_track_width / 2 -->
<dimen name="rounded_slider_track_corner_radius">2dp</dimen>
<dimen name="rounded_slider_background_padding">8dp</dimen>
<!-- rounded_slider_corner_radius + rounded_slider_background_padding -->
<dimen name="rounded_slider_background_rounded_corner">32dp</dimen>
<!-- inset for ic_lock_open within a DisabledUdfpsView -->
<dimen name="udfps_unlock_icon_inset">16dp</dimen>

View File

@@ -388,7 +388,7 @@
</style>
<style name="Theme.SystemUI.QuickSettings.BrightnessDialog" parent="@android:style/Theme.DeviceDefault.Dialog">
<item name="android:dialogCornerRadius">8dp</item>
<item name="android:windowBackground">@android:color/transparent</item>
</style>
<style name="Theme.SystemUI.QuickSettings.Dialog" parent="@android:style/Theme.DeviceDefault.Dialog">

View File

@@ -16,12 +16,17 @@
package com.android.systemui.settings.brightness;
import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT;
import android.app.Activity;
import android.os.Bundle;
import android.view.Gravity;
import android.view.KeyEvent;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.FrameLayout;
import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
@@ -62,10 +67,15 @@ public class BrightnessDialog extends Activity {
window.setLayout(
WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.WRAP_CONTENT);
BrightnessSlider controller = mToggleSliderFactory.create(this, null);
setContentView(R.layout.brightness_mirror_container);
FrameLayout frame = findViewById(R.id.brightness_mirror_container);
// The brightness mirror container is INVISIBLE by default.
frame.setVisibility(View.VISIBLE);
BrightnessSlider controller = mToggleSliderFactory.create(this, frame);
controller.init();
setContentView(controller.getRootView());
controller.getRootView().setBackgroundResource(R.drawable.brightness_mirror_background);
frame.addView(controller.getRootView(), MATCH_PARENT, WRAP_CONTENT);
mBrightnessController = new BrightnessController(this, controller, mBroadcastDispatcher);
}

View File

@@ -44,11 +44,10 @@ import javax.inject.Inject;
*
* @see BrightnessMirrorController
*/
public class BrightnessSlider extends ViewController<View> implements ToggleSlider {
public class BrightnessSlider extends ViewController<BrightnessSliderView> implements ToggleSlider {
private Listener mListener;
private ToggleSlider mMirror;
private final BrightnessSliderView mBrightnessSliderView;
private BrightnessMirrorController mMirrorController;
private boolean mTracking;
private final FalsingManager mFalsingManager;
@@ -71,11 +70,9 @@ public class BrightnessSlider extends ViewController<View> implements ToggleSlid
};
BrightnessSlider(
View rootView,
BrightnessSliderView brightnessSliderView,
FalsingManager falsingManager) {
super(rootView);
mBrightnessSliderView = brightnessSliderView;
super(brightnessSliderView);
mFalsingManager = falsingManager;
}
@@ -86,21 +83,18 @@ public class BrightnessSlider extends ViewController<View> implements ToggleSlid
return mView;
}
private void enableSlider(boolean enable) {
mBrightnessSliderView.enableSlider(enable);
}
@Override
protected void onViewAttached() {
mBrightnessSliderView.setOnSeekBarChangeListener(mSeekListener);
mBrightnessSliderView.setOnInterceptListener(mOnInterceptListener);
mView.setOnSeekBarChangeListener(mSeekListener);
mView.setOnInterceptListener(mOnInterceptListener);
}
@Override
protected void onViewDetached() {
mBrightnessSliderView.setOnSeekBarChangeListener(null);
mBrightnessSliderView.setOnDispatchTouchEventListener(null);
mBrightnessSliderView.setOnInterceptListener(null);
mView.setOnSeekBarChangeListener(null);
mView.setOnDispatchTouchEventListener(null);
mView.setOnInterceptListener(null);
}
@Override
@@ -109,7 +103,7 @@ public class BrightnessSlider extends ViewController<View> implements ToggleSlid
return copyEventToMirror(ev);
} else {
// We are the mirror, so we have to dispatch the event
return mBrightnessSliderView.dispatchTouchEvent(ev);
return mView.dispatchTouchEvent(ev);
}
}
@@ -122,19 +116,19 @@ public class BrightnessSlider extends ViewController<View> implements ToggleSlid
@Override
public void setEnforcedAdmin(RestrictedLockUtils.EnforcedAdmin admin) {
mBrightnessSliderView.setEnforcedAdmin(admin);
mView.setEnforcedAdmin(admin);
}
private void setMirror(ToggleSlider toggleSlider) {
mMirror = toggleSlider;
if (mMirror != null) {
mMirror.setMax(mBrightnessSliderView.getMax());
mMirror.setValue(mBrightnessSliderView.getValue());
mBrightnessSliderView.setOnDispatchTouchEventListener(this::mirrorTouchEvent);
mMirror.setMax(mView.getMax());
mMirror.setValue(mView.getValue());
mView.setOnDispatchTouchEventListener(this::mirrorTouchEvent);
} else {
// If there's no mirror, we may be the ones dispatching, events but we should not mirror
// them
mBrightnessSliderView.setOnDispatchTouchEventListener(null);
mView.setOnDispatchTouchEventListener(null);
}
}
@@ -151,7 +145,7 @@ public class BrightnessSlider extends ViewController<View> implements ToggleSlid
} else {
// If there's no mirror, we may be the ones dispatching, events but we should not mirror
// them
mBrightnessSliderView.setOnDispatchTouchEventListener(null);
mView.setOnDispatchTouchEventListener(null);
}
}
@@ -162,7 +156,7 @@ public class BrightnessSlider extends ViewController<View> implements ToggleSlid
@Override
public void setMax(int max) {
mBrightnessSliderView.setMax(max);
mView.setMax(max);
if (mMirror != null) {
mMirror.setMax(max);
}
@@ -170,12 +164,12 @@ public class BrightnessSlider extends ViewController<View> implements ToggleSlid
@Override
public int getMax() {
return mBrightnessSliderView.getMax();
return mView.getMax();
}
@Override
public void setValue(int value) {
mBrightnessSliderView.setValue(value);
mView.setValue(value);
if (mMirror != null) {
mMirror.setValue(value);
}
@@ -183,7 +177,7 @@ public class BrightnessSlider extends ViewController<View> implements ToggleSlid
@Override
public int getValue() {
return mBrightnessSliderView.getValue();
return mView.getValue();
}
private final SeekBar.OnSeekBarChangeListener mSeekListener =
@@ -205,7 +199,7 @@ public class BrightnessSlider extends ViewController<View> implements ToggleSlid
if (mMirrorController != null) {
mMirrorController.showMirror();
mMirrorController.setLocation((View) mBrightnessSliderView.getParent());
mMirrorController.setLocationAndSize(mView);
}
}
@@ -244,15 +238,9 @@ public class BrightnessSlider extends ViewController<View> implements ToggleSlid
*/
public BrightnessSlider create(Context context, @Nullable ViewGroup viewRoot) {
int layout = getLayout();
ViewGroup root = (ViewGroup) LayoutInflater.from(context)
BrightnessSliderView root = (BrightnessSliderView) LayoutInflater.from(context)
.inflate(layout, viewRoot, false);
return fromTree(root);
}
private BrightnessSlider fromTree(ViewGroup root) {
BrightnessSliderView v = root.requireViewById(R.id.brightness_slider);
return new BrightnessSlider(root, v, mFalsingManager);
return new BrightnessSlider(root, mFalsingManager);
}
/** Get the layout to inflate based on what slider to use */

View File

@@ -161,7 +161,7 @@ public class NotificationShadeWindowViewController {
mNotificationStackScrollLayoutController = notificationStackScrollLayoutController;
// This view is not part of the newly inflated expanded status bar.
mBrightnessMirror = mView.findViewById(R.id.brightness_mirror);
mBrightnessMirror = mView.findViewById(R.id.brightness_mirror_container);
}
/** Inflates the {@link R.layout#status_bar_expanded} layout and sets it up. */
@@ -392,7 +392,7 @@ public class NotificationShadeWindowViewController {
mView.setOnHierarchyChangeListener(new ViewGroup.OnHierarchyChangeListener() {
@Override
public void onChildViewAdded(View parent, View child) {
if (child.getId() == R.id.brightness_mirror) {
if (child.getId() == R.id.brightness_mirror_container) {
mBrightnessMirror = child;
}
}

View File

@@ -19,7 +19,6 @@ package com.android.systemui.statusbar.policy;
import android.annotation.NonNull;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.drawable.Drawable;
import android.util.ArraySet;
import android.view.LayoutInflater;
import android.view.View;
@@ -51,6 +50,8 @@ public class BrightnessMirrorController
private BrightnessSlider mToggleSliderController;
private final int[] mInt2Cache = new int[2];
private FrameLayout mBrightnessMirror;
private int mBrightnessMirrorBackgroundPadding;
private int mLastBrightnessSliderWidth = -1;
public BrightnessMirrorController(NotificationShadeWindowView statusBarWindow,
NotificationPanelViewController notificationPanelViewController,
@@ -59,7 +60,7 @@ public class BrightnessMirrorController
@NonNull Consumer<Boolean> visibilityCallback) {
mStatusBarWindow = statusBarWindow;
mToggleSliderFactory = factory;
mBrightnessMirror = statusBarWindow.findViewById(R.id.brightness_mirror);
mBrightnessMirror = statusBarWindow.findViewById(R.id.brightness_mirror_container);
mToggleSliderController = setMirrorLayout();
mNotificationPanel = notificationPanelViewController;
mDepthController = notificationShadeDepthController;
@@ -82,20 +83,32 @@ public class BrightnessMirrorController
mDepthController.setBrightnessMirrorVisible(false);
}
public void setLocation(View original) {
/**
* Set the location and size of the mirror container to match that of the slider in QS
* @param original the original view in QS
*/
public void setLocationAndSize(View original) {
original.getLocationInWindow(mInt2Cache);
// Original is slightly larger than the mirror, so make sure to use the center for the
// positioning.
int originalX = mInt2Cache[0] + original.getWidth() / 2;
int originalY = mInt2Cache[1] + original.getHeight() / 2;
int originalX = mInt2Cache[0] - mBrightnessMirrorBackgroundPadding;
int originalY = mInt2Cache[1] - mBrightnessMirrorBackgroundPadding;
mBrightnessMirror.setTranslationX(0);
mBrightnessMirror.setTranslationY(0);
mBrightnessMirror.getLocationInWindow(mInt2Cache);
int mirrorX = mInt2Cache[0] + mBrightnessMirror.getWidth() / 2;
int mirrorY = mInt2Cache[1] + mBrightnessMirror.getHeight() / 2;
int mirrorX = mInt2Cache[0];
int mirrorY = mInt2Cache[1];
mBrightnessMirror.setTranslationX(originalX - mirrorX);
mBrightnessMirror.setTranslationY(originalY - mirrorY);
// Set the brightness mirror container to be the width of the mirror + 2 times the padding
int newWidth = original.getMeasuredWidth() + 2 * mBrightnessMirrorBackgroundPadding;
if (newWidth != mLastBrightnessSliderWidth) {
ViewGroup.LayoutParams lp = mBrightnessMirror.getLayoutParams();
lp.width = newWidth;
mBrightnessMirror.setLayoutParams(lp);
}
}
public ToggleSlider getToggleSlider() {
@@ -103,13 +116,15 @@ public class BrightnessMirrorController
}
public void updateResources() {
FrameLayout.LayoutParams lp =
(FrameLayout.LayoutParams) mBrightnessMirror.getLayoutParams();
Resources r = mBrightnessMirror.getResources();
lp.width = r.getDimensionPixelSize(R.dimen.qs_panel_width);
lp.height = r.getDimensionPixelSize(R.dimen.brightness_mirror_height);
lp.gravity = r.getInteger(R.integer.notification_panel_layout_gravity);
mBrightnessMirror.setLayoutParams(lp);
mBrightnessMirrorBackgroundPadding = r
.getDimensionPixelSize(R.dimen.rounded_slider_background_padding);
mBrightnessMirror.setPadding(
mBrightnessMirrorBackgroundPadding,
mBrightnessMirrorBackgroundPadding,
mBrightnessMirrorBackgroundPadding,
mBrightnessMirrorBackgroundPadding
);
}
public void onOverlayChanged() {
@@ -124,19 +139,9 @@ public class BrightnessMirrorController
Context context = mBrightnessMirror.getContext();
BrightnessSlider controller = mToggleSliderFactory.create(context, mBrightnessMirror);
controller.init();
Drawable mirrorBackground = context.getDrawable(R.drawable.brightness_mirror_background);
View rootView = controller.getRootView();
rootView.setBackground(mirrorBackground);
ViewGroup.MarginLayoutParams lp = (ViewGroup.MarginLayoutParams) rootView.getLayoutParams();
lp.height = ViewGroup.LayoutParams.MATCH_PARENT;
lp.width = ViewGroup.LayoutParams.MATCH_PARENT;
int margin = context.getResources()
.getDimensionPixelSize(R.dimen.notification_side_paddings);
lp.leftMargin = margin;
lp.rightMargin = margin;
mBrightnessMirror.addView(rootView, lp);
mBrightnessMirror.addView(controller.getRootView(), ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT);
return controller;
}
@@ -145,7 +150,7 @@ public class BrightnessMirrorController
int index = mStatusBarWindow.indexOfChild(mBrightnessMirror);
mStatusBarWindow.removeView(mBrightnessMirror);
mBrightnessMirror = (FrameLayout) LayoutInflater.from(mBrightnessMirror.getContext())
.inflate(R.layout.brightness_mirror, mStatusBarWindow, false);
.inflate(R.layout.brightness_mirror_container, mStatusBarWindow, false);
mToggleSliderController = setMirrorLayout();
mStatusBarWindow.addView(mBrightnessMirror, index);

View File

@@ -18,8 +18,6 @@ package com.android.systemui.settings.brightness
import android.testing.AndroidTestingRunner
import android.view.MotionEvent
import android.view.View
import android.view.ViewGroup
import android.widget.SeekBar
import androidx.test.filters.SmallTest
import com.android.settingslib.RestrictedLockUtils
@@ -39,7 +37,6 @@ import org.mockito.ArgumentMatchers.anyBoolean
import org.mockito.Captor
import org.mockito.Mock
import org.mockito.Mockito.isNull
import org.mockito.Mockito.mock
import org.mockito.Mockito.never
import org.mockito.Mockito.notNull
import org.mockito.Mockito.verify
@@ -50,8 +47,6 @@ import org.mockito.Mockito.`when` as whenever
@RunWith(AndroidTestingRunner::class)
class BrightnessSliderTest : SysuiTestCase() {
@Mock
private lateinit var rootView: View
@Mock
private lateinit var brightnessSliderView: BrightnessSliderView
@Mock
@@ -80,7 +75,7 @@ class BrightnessSliderTest : SysuiTestCase() {
whenever(mirrorController.toggleSlider).thenReturn(mirror)
whenever(motionEvent.copy()).thenReturn(motionEvent)
mController = BrightnessSlider(rootView, brightnessSliderView, mFalsingManager)
mController = BrightnessSlider(brightnessSliderView, mFalsingManager)
mController.init()
mController.setOnChangedListener(listener)
}
@@ -203,9 +198,7 @@ class BrightnessSliderTest : SysuiTestCase() {
@Test
fun testSeekBarTrackingStarted() {
val parent = mock(ViewGroup::class.java)
whenever(brightnessSliderView.value).thenReturn(42)
whenever(brightnessSliderView.parent).thenReturn(parent)
mController.onViewAttached()
mController.setMirrorControllerAndMirror(mirrorController)
@@ -215,7 +208,7 @@ class BrightnessSliderTest : SysuiTestCase() {
verify(listener).onChanged(eq(true), eq(42), eq(false))
verify(mirrorController).showMirror()
verify(mirrorController).setLocation(parent)
verify(mirrorController).setLocationAndSize(brightnessSliderView)
}
@Test