From 9736b59ac2cfd8eecee55abbf8eeb44117373f1b Mon Sep 17 00:00:00 2001 From: Angela Wang Date: Thu, 26 Dec 2024 03:38:54 +0000 Subject: [PATCH] Update Flash Notifications screen with expressive design Flag: EXEMPT flag by System prop Bug: 349678118 Test: atest FlashNotificationsPreviewPreferenceControllerTest Test: manually check the UI, screenshots attached on bug Change-Id: I2db55cef161016940b19f14c70b9d2442d3859c3 --- res/xml/flash_notifications_settings.xml | 31 +++--- .../FlashNotificationsPreviewPreference.java | 94 ------------------- ...ificationsPreviewPreferenceController.java | 22 ++--- ...ationsPreviewPreferenceControllerTest.java | 49 +++++----- ...ashNotificationsPreviewPreferenceTest.java | 93 ------------------ 5 files changed, 48 insertions(+), 241 deletions(-) delete mode 100644 src/com/android/settings/accessibility/FlashNotificationsPreviewPreference.java delete mode 100644 tests/robotests/src/com/android/settings/accessibility/FlashNotificationsPreviewPreferenceTest.java diff --git a/res/xml/flash_notifications_settings.xml b/res/xml/flash_notifications_settings.xml index bc76f6df279..9f1ff3c97a9 100644 --- a/res/xml/flash_notifications_settings.xml +++ b/res/xml/flash_notifications_settings.xml @@ -28,23 +28,28 @@ android:key="flash_notifications_illustration" settings:searchable="false" settings:lottie_rawRes="@drawable/flash_notifications_illustration" - settings:controller="com.android.settings.accessibility.FlashNotificationIllustrationPreferenceController"/> + settings:controller="com.android.settings.accessibility.FlashNotificationIllustrationPreferenceController" /> - + + + + - - - diff --git a/src/com/android/settings/accessibility/FlashNotificationsPreviewPreference.java b/src/com/android/settings/accessibility/FlashNotificationsPreviewPreference.java deleted file mode 100644 index 5b669fa618c..00000000000 --- a/src/com/android/settings/accessibility/FlashNotificationsPreviewPreference.java +++ /dev/null @@ -1,94 +0,0 @@ -/* - * Copyright (C) 2023 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. - */ - -package com.android.settings.accessibility; - -import android.content.Context; -import android.graphics.drawable.Drawable; -import android.util.AttributeSet; -import android.view.View; -import android.widget.TextView; - -import androidx.annotation.ColorInt; -import androidx.preference.Preference; -import androidx.preference.PreferenceViewHolder; - -import com.android.settings.R; -import com.android.settingslib.Utils; - -/** - * Preference for Flash notifications preview. - */ -public class FlashNotificationsPreviewPreference extends Preference { - private Drawable mBackgroundEnabled; - private Drawable mBackgroundDisabled; - @ColorInt - private int mTextColorDisabled; - - public FlashNotificationsPreviewPreference(Context context) { - super(context); - init(); - } - - public FlashNotificationsPreviewPreference(Context context, AttributeSet attrs) { - super(context, attrs); - init(); - } - - public FlashNotificationsPreviewPreference(Context context, AttributeSet attrs, - int defStyleAttr) { - super(context, attrs, defStyleAttr); - init(); - } - - public FlashNotificationsPreviewPreference(Context context, AttributeSet attrs, - int defStyleAttr, int defStyleRes) { - super(context, attrs, defStyleAttr, defStyleRes); - init(); - } - - private void init() { - setLayoutResource(R.layout.flash_notification_preview_preference); - mBackgroundEnabled = getContext().getDrawable( - com.android.settingslib.widget.mainswitch.R.drawable.settingslib_switch_bar_bg_on); - mBackgroundDisabled = getContext().getDrawable(R.drawable.switch_bar_bg_disabled); - mTextColorDisabled = Utils.getColorAttrDefaultColor(getContext(), - android.R.attr.textColorPrimary); - } - - @Override - public void onBindViewHolder(PreferenceViewHolder holder) { - super.onBindViewHolder(holder); - - final boolean enabled = isEnabled(); - final View frame = holder.findViewById(R.id.frame); - if (frame != null) { - frame.setBackground(enabled ? mBackgroundEnabled : mBackgroundDisabled); - } - final TextView title = (TextView) holder.findViewById(android.R.id.title); - if (title != null) { - @ColorInt final int textColorEnabled = title.getCurrentTextColor(); - title.setAlpha(enabled ? 1f : 0.38f); - title.setTextColor(enabled ? textColorEnabled : mTextColorDisabled); - } - } - - @Override - public void setEnabled(boolean enabled) { - super.setEnabled(enabled); - notifyChanged(); - } -} diff --git a/src/com/android/settings/accessibility/FlashNotificationsPreviewPreferenceController.java b/src/com/android/settings/accessibility/FlashNotificationsPreviewPreferenceController.java index fe69b2b4675..dcfcf0f5e95 100644 --- a/src/com/android/settings/accessibility/FlashNotificationsPreviewPreferenceController.java +++ b/src/com/android/settings/accessibility/FlashNotificationsPreviewPreferenceController.java @@ -41,6 +41,7 @@ import androidx.preference.Preference; import androidx.preference.PreferenceScreen; import com.android.settings.core.BasePreferenceController; +import com.android.settingslib.widget.ButtonPreference; /** * Controller for flash notifications preview. @@ -48,7 +49,7 @@ import com.android.settings.core.BasePreferenceController; public class FlashNotificationsPreviewPreferenceController extends BasePreferenceController implements LifecycleEventObserver { - private Preference mPreference; + private ButtonPreference mPreference; private final ContentResolver mContentResolver; @VisibleForTesting @@ -74,19 +75,14 @@ public class FlashNotificationsPreviewPreferenceController extends public void displayPreference(PreferenceScreen screen) { super.displayPreference(screen); mPreference = screen.findPreference(getPreferenceKey()); - updateState(mPreference); - } - - @Override - public boolean handlePreferenceTreeClick(Preference preference) { - if (getPreferenceKey().equals(preference.getKey())) { - Intent intent = new Intent(ACTION_FLASH_NOTIFICATION_START_PREVIEW); - intent.putExtra(EXTRA_FLASH_NOTIFICATION_PREVIEW_TYPE, TYPE_SHORT_PREVIEW); - mContext.sendBroadcastAsUser(intent, UserHandle.SYSTEM); - return true; + if (mPreference != null) { + mPreference.setOnClickListener(view -> { + Intent intent = new Intent(ACTION_FLASH_NOTIFICATION_START_PREVIEW); + intent.putExtra(EXTRA_FLASH_NOTIFICATION_PREVIEW_TYPE, TYPE_SHORT_PREVIEW); + mContext.sendBroadcastAsUser(intent, UserHandle.SYSTEM); + }); } - - return super.handlePreferenceTreeClick(preference); + updateState(mPreference); } @Override diff --git a/tests/robotests/src/com/android/settings/accessibility/FlashNotificationsPreviewPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/FlashNotificationsPreviewPreferenceControllerTest.java index 6432a171434..2c2228ecedf 100644 --- a/tests/robotests/src/com/android/settings/accessibility/FlashNotificationsPreviewPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/accessibility/FlashNotificationsPreviewPreferenceControllerTest.java @@ -29,7 +29,6 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -37,13 +36,16 @@ import android.content.ContentResolver; import android.content.Context; import android.content.Intent; import android.provider.Settings; +import android.view.View; import androidx.lifecycle.Lifecycle; import androidx.lifecycle.LifecycleOwner; -import androidx.preference.Preference; import androidx.preference.PreferenceScreen; +import androidx.preference.PreferenceViewHolder; import androidx.test.core.app.ApplicationProvider; +import com.android.settingslib.widget.ButtonPreference; + import org.junit.After; import org.junit.Before; import org.junit.Rule; @@ -51,7 +53,6 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; import org.mockito.Mock; -import org.mockito.MockitoAnnotations; import org.mockito.Spy; import org.mockito.junit.MockitoJUnit; import org.mockito.junit.MockitoRule; @@ -71,20 +72,21 @@ public class FlashNotificationsPreviewPreferenceControllerTest { private ContentResolver mContentResolver = mContext.getContentResolver(); @Mock private PreferenceScreen mPreferenceScreen; - private Preference mPreference; + private ButtonPreference mPreference; private FlashNotificationsPreviewPreferenceController mController; @Before public void setUp() { - MockitoAnnotations.initMocks(this); - when(mContext.getContentResolver()).thenReturn(mContentResolver); - mPreference = new Preference(mContext); + mPreference = new ButtonPreference(mContext); mPreference.setKey(PREFERENCE_KEY); + final View rootView = View.inflate(mContext, mPreference.getLayoutResource(), null); + mPreference.onBindViewHolder(PreferenceViewHolder.createInstanceForTests(rootView)); when(mPreferenceScreen.findPreference(PREFERENCE_KEY)).thenReturn(mPreference); mController = new FlashNotificationsPreviewPreferenceController(mContext, PREFERENCE_KEY); + mController.displayPreference(mPreferenceScreen); } @After @@ -98,67 +100,58 @@ public class FlashNotificationsPreviewPreferenceControllerTest { } @Test - public void testDisplayPreference_torchPresent_cameraOff_screenOff_notVisible() { + public void updateState_cameraOff_screenOff_notVisible() { setFlashNotificationsState(FlashNotificationsUtil.State.OFF); - mController.displayPreference(mPreferenceScreen); + mController.updateState(mPreference); assertThat(mPreference.isVisible()).isFalse(); } @Test - public void testDisplayPreference_torchPresent_cameraOn_screenOff_isVisible() { + public void updateState_cameraOn_screenOff_isVisible() { setFlashNotificationsState(FlashNotificationsUtil.State.CAMERA); - mController.displayPreference(mPreferenceScreen); + mController.updateState(mPreference); assertThat(mPreference.isVisible()).isTrue(); } @Test - public void testDisplayPreference_torchPresent_cameraOff_screenOn_isVisible() { + public void updateState_cameraOff_screenOn_isVisible() { setFlashNotificationsState(FlashNotificationsUtil.State.SCREEN); - mController.displayPreference(mPreferenceScreen); + mController.updateState(mPreference); assertThat(mPreference.isVisible()).isTrue(); } @Test - public void testDisplayPreference_torchPresent_cameraOn_screenOn_isVisible() { + public void updateState_cameraOn_screenOn_isVisible() { setFlashNotificationsState(FlashNotificationsUtil.State.CAMERA_SCREEN); - mController.displayPreference(mPreferenceScreen); + mController.updateState(mPreference); assertThat(mPreference.isVisible()).isTrue(); } @Test - public void testHandlePreferenceTreeClick_invalidPreference() { - mController.handlePreferenceTreeClick(mock(Preference.class)); - - verify(mContext, never()).sendBroadcastAsUser(any(), any()); - } - - @Test - public void handlePreferenceTreeClick_assertAction() { - mController.handlePreferenceTreeClick(mPreference); + public void clickOnButton_assertAction() { + mPreference.getButton().callOnClick(); ArgumentCaptor captor = ArgumentCaptor.forClass(Intent.class); verify(mContext).sendBroadcastAsUser(captor.capture(), any()); Intent captured = captor.getValue(); - assertThat(captured.getAction()).isEqualTo(ACTION_FLASH_NOTIFICATION_START_PREVIEW); } @Test - public void handlePreferenceTreeClick_assertExtra() { - mController.handlePreferenceTreeClick(mPreference); + public void clickOnButton_assertExtra() { + mPreference.getButton().callOnClick(); ArgumentCaptor captor = ArgumentCaptor.forClass(Intent.class); verify(mContext).sendBroadcastAsUser(captor.capture(), any()); Intent captured = captor.getValue(); - assertThat(captured.getIntExtra(EXTRA_FLASH_NOTIFICATION_PREVIEW_TYPE, TYPE_LONG_PREVIEW)) .isEqualTo(TYPE_SHORT_PREVIEW); } diff --git a/tests/robotests/src/com/android/settings/accessibility/FlashNotificationsPreviewPreferenceTest.java b/tests/robotests/src/com/android/settings/accessibility/FlashNotificationsPreviewPreferenceTest.java deleted file mode 100644 index fac467d1302..00000000000 --- a/tests/robotests/src/com/android/settings/accessibility/FlashNotificationsPreviewPreferenceTest.java +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Copyright (C) 2023 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. - */ - -package com.android.settings.accessibility; - -import static com.google.common.truth.Truth.assertThat; - -import android.content.Context; -import android.view.LayoutInflater; -import android.view.View; -import android.widget.TextView; - -import androidx.annotation.ColorInt; -import androidx.preference.PreferenceViewHolder; -import androidx.test.core.app.ApplicationProvider; - -import com.android.settings.R; -import com.android.settingslib.Utils; - -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Spy; -import org.mockito.junit.MockitoJUnit; -import org.mockito.junit.MockitoRule; -import org.robolectric.RobolectricTestRunner; -import org.robolectric.Shadows; - -@RunWith(RobolectricTestRunner.class) -public class FlashNotificationsPreviewPreferenceTest { - - @Rule - public MockitoRule mMockitoRule = MockitoJUnit.rule(); - @Spy - private final Context mContext = ApplicationProvider.getApplicationContext(); - private FlashNotificationsPreviewPreference mFlashNotificationsPreviewPreference; - private PreferenceViewHolder mPreferenceViewHolder; - - @Before - public void setUp() { - mPreferenceViewHolder = PreferenceViewHolder.createInstanceForTests( - LayoutInflater.from(mContext).inflate( - R.layout.flash_notification_preview_preference, null)); - mFlashNotificationsPreviewPreference = new FlashNotificationsPreviewPreference(mContext); - } - - @Test - public void setEnabled_true_verifyEnabledUi() { - @ColorInt final int textColorEnabled = ((TextView) mPreferenceViewHolder.findViewById( - android.R.id.title)).getCurrentTextColor(); - - mFlashNotificationsPreviewPreference.setEnabled(true); - mFlashNotificationsPreviewPreference.onBindViewHolder(mPreferenceViewHolder); - - final View frame = mPreferenceViewHolder.findViewById(R.id.frame); - final int backgroundResId = Shadows.shadowOf(frame.getBackground()).getCreatedFromResId(); - assertThat(backgroundResId).isEqualTo( - com.android.settingslib.widget.mainswitch.R.drawable.settingslib_switch_bar_bg_on); - final TextView title = (TextView) mPreferenceViewHolder.findViewById(android.R.id.title); - assertThat(title.getAlpha()).isEqualTo(1f); - assertThat(title.getCurrentTextColor()).isEqualTo(textColorEnabled); - } - - @Test - public void setEnabled_false_verifyDisabledUi() { - @ColorInt final int textColorDisabled = Utils.getColorAttrDefaultColor(mContext, - android.R.attr.textColorPrimary); - - mFlashNotificationsPreviewPreference.setEnabled(false); - mFlashNotificationsPreviewPreference.onBindViewHolder(mPreferenceViewHolder); - - final View frame = mPreferenceViewHolder.findViewById(R.id.frame); - final int backgroundResId = Shadows.shadowOf(frame.getBackground()).getCreatedFromResId(); - assertThat(backgroundResId).isEqualTo(R.drawable.switch_bar_bg_disabled); - final TextView title = (TextView) mPreferenceViewHolder.findViewById(android.R.id.title); - assertThat(title.getAlpha()).isEqualTo(0.38f); - assertThat(title.getCurrentTextColor()).isEqualTo(textColorDisabled); - } -} \ No newline at end of file