diff --git a/res/raw/udfps_left_edge_hint_lottie.json b/res/raw/udfps_left_edge_hint_lottie.json index e69de29bb2d..9e26dfeeb6e 100644 --- a/res/raw/udfps_left_edge_hint_lottie.json +++ b/res/raw/udfps_left_edge_hint_lottie.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/res/raw/udfps_right_edge_hint_lottie.json b/res/raw/udfps_right_edge_hint_lottie.json index e69de29bb2d..9e26dfeeb6e 100644 --- a/res/raw/udfps_right_edge_hint_lottie.json +++ b/res/raw/udfps_right_edge_hint_lottie.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/res/raw/udfps_tip_hint_lottie.json b/res/raw/udfps_tip_hint_lottie.json index e69de29bb2d..9e26dfeeb6e 100644 --- a/res/raw/udfps_tip_hint_lottie.json +++ b/res/raw/udfps_tip_hint_lottie.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/res/values/strings.xml b/res/values/strings.xml index 71f4e148d9d..1ac6437720d 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -11763,12 +11763,6 @@ Temporarily turned on due to Battery Saver - - Supported apps will also switch to dark theme - - - Got it - Try Dark theme diff --git a/src/com/android/settings/display/DarkUIInfoDialogFragment.java b/src/com/android/settings/display/DarkUIInfoDialogFragment.java deleted file mode 100644 index ce517e8db23..00000000000 --- a/src/com/android/settings/display/DarkUIInfoDialogFragment.java +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Copyright (C) 2019 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.display; - -import android.app.Dialog; -import android.app.UiModeManager; -import android.app.settings.SettingsEnums; -import android.content.Context; -import android.content.DialogInterface; -import android.os.Bundle; -import android.provider.Settings; -import android.view.LayoutInflater; -import android.view.View; -import android.widget.ImageView; -import android.widget.TextView; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.appcompat.app.AlertDialog; - -import com.android.settings.R; -import com.android.settings.core.instrumentation.InstrumentedDialogFragment; - -public class DarkUIInfoDialogFragment extends InstrumentedDialogFragment - implements DialogInterface.OnClickListener{ - - @Override - public int getMetricsCategory() { - return SettingsEnums.DIALOG_DARK_UI_INFO; - } - - @NonNull - @Override - public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) { - Context context = getContext(); - AlertDialog.Builder dialog = new AlertDialog.Builder(context); - LayoutInflater inflater = LayoutInflater.from(dialog.getContext()); - View titleView = inflater.inflate(R.layout.settings_dialog_title, null); - ((ImageView) titleView.findViewById(R.id.settings_icon)) - .setImageDrawable(context.getDrawable(R.drawable.dark_theme)); - ((TextView) titleView.findViewById(R.id.settings_title)).setText(R.string.dark_ui_mode); - - dialog.setCustomTitle(titleView) - .setMessage(R.string.dark_ui_settings_dark_summary) - .setPositiveButton( - R.string.dark_ui_settings_dialog_acknowledge, - this); - return dialog.create(); - } - - @Override - public void onDismiss(@NonNull DialogInterface dialog) { - enableDarkTheme(); - super.onDismiss(dialog); - } - - @Override - public void onClick(DialogInterface dialogInterface, int i) { - // We have to manually dismiss the dialog because changing night mode causes it to - // recreate itself. - dialogInterface.dismiss(); - enableDarkTheme(); - } - - private void enableDarkTheme() { - final Context context = getContext(); - if (context != null) { - Settings.Secure.putInt(context.getContentResolver(), - Settings.Secure.DARK_MODE_DIALOG_SEEN, - DarkUIPreferenceController.DIALOG_SEEN); - context.getSystemService(UiModeManager.class) - .setNightMode(UiModeManager.MODE_NIGHT_YES); - } - } -} diff --git a/src/com/android/settings/display/DarkUIPreferenceController.java b/src/com/android/settings/display/DarkUIPreferenceController.java index d07410ee271..f1bbfcd47b7 100644 --- a/src/com/android/settings/display/DarkUIPreferenceController.java +++ b/src/com/android/settings/display/DarkUIPreferenceController.java @@ -23,10 +23,8 @@ import android.content.Intent; import android.content.IntentFilter; import android.content.res.Configuration; import android.os.PowerManager; -import android.provider.Settings; import androidx.annotation.VisibleForTesting; -import androidx.fragment.app.Fragment; import androidx.preference.Preference; import androidx.preference.PreferenceScreen; @@ -39,7 +37,6 @@ import com.android.settingslib.core.lifecycle.events.OnStop; public class DarkUIPreferenceController extends TogglePreferenceController implements LifecycleObserver, OnStart, OnStop { - public static final String DARK_MODE_PREFS = "dark_mode_prefs"; public static final String PREF_DARK_MODE_DIALOG_SEEN = "dark_mode_dialog_seen"; public static final int DIALOG_SEEN = 1; @@ -48,9 +45,6 @@ public class DarkUIPreferenceController extends TogglePreferenceController imple private UiModeManager mUiModeManager; private PowerManager mPowerManager; - private Context mContext; - - private Fragment mFragment; private BroadcastReceiver mReceiver = new BroadcastReceiver() { @Override @@ -61,7 +55,6 @@ public class DarkUIPreferenceController extends TogglePreferenceController imple public DarkUIPreferenceController(Context context, String key) { super(context, key); - mContext = context; mUiModeManager = context.getSystemService(UiModeManager.class); mPowerManager = context.getSystemService(PowerManager.class); } @@ -86,12 +79,6 @@ public class DarkUIPreferenceController extends TogglePreferenceController imple @Override public boolean setChecked(boolean isChecked) { - final boolean dialogSeen = - Settings.Secure.getInt(mContext.getContentResolver(), - Settings.Secure.DARK_MODE_DIALOG_SEEN, 0) == DIALOG_SEEN; - if (!dialogSeen && isChecked) { - showDarkModeDialog(); - } return mUiModeManager.setNightModeActivated(isChecked); } @@ -100,13 +87,6 @@ public class DarkUIPreferenceController extends TogglePreferenceController imple return R.string.menu_key_display; } - private void showDarkModeDialog() { - final DarkUIInfoDialogFragment frag = new DarkUIInfoDialogFragment(); - if (mFragment != null && mFragment.getFragmentManager() != null) { - frag.show(mFragment.getFragmentManager(), getClass().getName()); - } - } - @VisibleForTesting void updateEnabledStateIfNeeded() { if (mPreference == null) { @@ -133,11 +113,6 @@ public class DarkUIPreferenceController extends TogglePreferenceController imple new IntentFilter(PowerManager.ACTION_POWER_SAVE_MODE_CHANGED)); } - // used by AccessibilitySettings - public void setParentFragment(Fragment fragment) { - mFragment = fragment; - } - @Override public void onStop() { mContext.unregisterReceiver(mReceiver); diff --git a/src/com/android/settings/display/darkmode/DarkModeCustomPreferenceController.java b/src/com/android/settings/display/darkmode/DarkModeCustomPreferenceController.java index 10cda5334c5..c45bb3d2b34 100644 --- a/src/com/android/settings/display/darkmode/DarkModeCustomPreferenceController.java +++ b/src/com/android/settings/display/darkmode/DarkModeCustomPreferenceController.java @@ -27,7 +27,6 @@ import androidx.preference.Preference; import com.android.settings.core.BasePreferenceController; import java.time.LocalTime; -import java.time.format.DateTimeFormatter; /** * Controller for custom mode night mode time settings @@ -35,7 +34,6 @@ import java.time.format.DateTimeFormatter; public class DarkModeCustomPreferenceController extends BasePreferenceController { private static final String START_TIME_KEY = "dark_theme_start_time"; private static final String END_TIME_KEY = "dark_theme_end_time"; - public static DateTimeFormatter formatter = DateTimeFormatter.ofPattern("hh:mm a"); private final UiModeManager mUiModeManager; private TimeFormatter mFormat; private DarkModeSettingsFragment mFragmet; @@ -63,7 +61,10 @@ public class DarkModeCustomPreferenceController extends BasePreferenceController @Override public int getAvailabilityStatus() { - return AVAILABLE; + return mUiModeManager.getNightMode() == MODE_NIGHT_CUSTOM + && mUiModeManager.getNightModeCustomType() + == UiModeManager.MODE_NIGHT_CUSTOM_TYPE_SCHEDULE + ? AVAILABLE : CONDITIONALLY_UNAVAILABLE; } public TimePickerDialog getDialog() { @@ -88,13 +89,6 @@ public class DarkModeCustomPreferenceController extends BasePreferenceController @Override protected void refreshSummary(Preference preference) { - if (mUiModeManager.getNightMode() != MODE_NIGHT_CUSTOM - || mUiModeManager.getNightModeCustomType() - != UiModeManager.MODE_NIGHT_CUSTOM_TYPE_SCHEDULE) { - preference.setVisible(false); - return; - } - preference.setVisible(true); final LocalTime time; if (TextUtils.equals(getPreferenceKey(), START_TIME_KEY)) { time = mUiModeManager.getCustomNightModeStart(); diff --git a/src/com/android/settings/display/darkmode/DarkModeSettingsFragment.java b/src/com/android/settings/display/darkmode/DarkModeSettingsFragment.java index a5103b0aef9..17d32a536f6 100644 --- a/src/com/android/settings/display/darkmode/DarkModeSettingsFragment.java +++ b/src/com/android/settings/display/darkmode/DarkModeSettingsFragment.java @@ -21,6 +21,7 @@ import android.os.Bundle; import android.os.PowerManager; import androidx.preference.Preference; +import androidx.preference.PreferenceScreen; import com.android.settings.R; import com.android.settings.dashboard.DashboardFragment; @@ -43,9 +44,6 @@ public class DarkModeSettingsFragment extends DashboardFragment { private DarkModeObserver mContentObserver; private DarkModeCustomPreferenceController mCustomStartController; private DarkModeCustomPreferenceController mCustomEndController; - private Runnable mCallback = () -> { - updatePreferenceStates(); - }; private static final int DIALOG_START_TIME = 0; private static final int DIALOG_END_TIME = 1; @@ -60,7 +58,12 @@ public class DarkModeSettingsFragment extends DashboardFragment { public void onStart() { super.onStart(); // Listen for changes only while visible. - mContentObserver.subscribe(mCallback); + mContentObserver.subscribe(() -> { + PreferenceScreen preferenceScreen = getPreferenceScreen(); + mCustomStartController.displayPreference(preferenceScreen); + mCustomEndController.displayPreference(preferenceScreen); + updatePreferenceStates(); + }); } @Override diff --git a/tests/robotests/src/com/android/settings/display/DarkUIInfoDialogFragmentTest.java b/tests/robotests/src/com/android/settings/display/DarkUIInfoDialogFragmentTest.java deleted file mode 100644 index f90c5901a2e..00000000000 --- a/tests/robotests/src/com/android/settings/display/DarkUIInfoDialogFragmentTest.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright (C) 2019 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.display; - -import static com.google.common.truth.Truth.assertThat; - -import static org.mockito.Mockito.doReturn; -import static org.mockito.Mockito.spy; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; - -import android.content.Context; -import android.content.DialogInterface; -import android.content.SharedPreferences; -import android.provider.Settings; - -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Mock; -import org.mockito.MockitoAnnotations; -import org.robolectric.RobolectricTestRunner; -import org.robolectric.RuntimeEnvironment; - -@RunWith(RobolectricTestRunner.class) -public class DarkUIInfoDialogFragmentTest { - private DarkUIInfoDialogFragment mFragment; - @Mock - private DialogInterface dialog; - - - @Before - public void setup() { - MockitoAnnotations.initMocks(this); - mFragment = spy(new DarkUIInfoDialogFragment()); - } - - @Test - public void dialogDismissedOnConfirmation() { - doReturn(RuntimeEnvironment.application).when(mFragment).getContext(); - SharedPreferences prefs = RuntimeEnvironment.application.getSharedPreferences( - DarkUIPreferenceController.DARK_MODE_PREFS, - Context.MODE_PRIVATE); - assertThat(prefs.getBoolean(DarkUIPreferenceController.PREF_DARK_MODE_DIALOG_SEEN, false)) - .isFalse(); - mFragment.onClick(dialog, DialogInterface.BUTTON_POSITIVE); - verify(dialog, times(1)).dismiss(); - assertThat(Settings.Secure.getInt(RuntimeEnvironment.application.getContentResolver(), - Settings.Secure.DARK_MODE_DIALOG_SEEN, -1)).isEqualTo(1); - } -} diff --git a/tests/robotests/src/com/android/settings/display/DarkUIPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/display/DarkUIPreferenceControllerTest.java index 9924cb4b628..9a24d32a739 100644 --- a/tests/robotests/src/com/android/settings/display/DarkUIPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/display/DarkUIPreferenceControllerTest.java @@ -16,35 +16,33 @@ package com.android.settings.display; +import static com.google.common.truth.Truth.assertThat; + +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.spy; + import android.content.Context; -import androidx.fragment.app.Fragment; + import com.android.settings.display.darkmode.DarkModePreference; + import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; -import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; -import static com.google.common.truth.Truth.assertThat; -import static org.mockito.Mockito.doReturn; -import static org.mockito.Mockito.spy; - @RunWith(RobolectricTestRunner.class) public class DarkUIPreferenceControllerTest { private DarkUIPreferenceController mController; private Context mContext; - @Mock - private Fragment mFragment; @Before public void setUp() { MockitoAnnotations.initMocks(this); mContext = spy(RuntimeEnvironment.application); mController = spy(new DarkUIPreferenceController(mContext, "dark_ui_mode")); - mController.setParentFragment(mFragment); mController.mPreference = new DarkModePreference(mContext, null /* AttributeSet attrs */); mController.onStart(); } diff --git a/tests/robotests/src/com/android/settings/display/darkmode/DarkModeCustomPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/display/darkmode/DarkModeCustomPreferenceControllerTest.java index 4a26205bb58..8ac6257491b 100644 --- a/tests/robotests/src/com/android/settings/display/darkmode/DarkModeCustomPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/display/darkmode/DarkModeCustomPreferenceControllerTest.java @@ -15,6 +15,11 @@ package com.android.settings.display.darkmode; +import static com.android.settings.core.BasePreferenceController.AVAILABLE; +import static com.android.settings.core.BasePreferenceController.CONDITIONALLY_UNAVAILABLE; + +import static com.google.common.truth.Truth.assertThat; + import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.mock; @@ -71,68 +76,55 @@ public class DarkModeCustomPreferenceControllerTest { } @Test - public void nightMode_manualOn_hidePreference() { + public void getAvailabilityStatus_nightModeManualOn_unavailable() { when(mService.getNightMode()).thenReturn(UiModeManager.MODE_NIGHT_YES); mConfig.uiMode = Configuration.UI_MODE_NIGHT_YES; - mController.refreshSummary(mPreference); - - verify(mPreference).setVisible(eq(false)); + assertThat(mController.getAvailabilityStatus()).isEqualTo(CONDITIONALLY_UNAVAILABLE); } @Test - public void nightMode_manualOff_hidePreference() { + public void getAvailabilityStatus_nightModeManualOff_unavailable() { when(mService.getNightMode()).thenReturn(UiModeManager.MODE_NIGHT_NO); mConfig.uiMode = Configuration.UI_MODE_NIGHT_NO; - mController.refreshSummary(mPreference); - - verify(mPreference).setVisible(eq(false)); + assertThat(mController.getAvailabilityStatus()).isEqualTo(CONDITIONALLY_UNAVAILABLE); } - @Test - public void nightMode_customOn_showPreference() { + public void getAvailabilityStatus_nightModeCustomOn_available() { when(mService.getNightMode()).thenReturn(UiModeManager.MODE_NIGHT_CUSTOM); mConfig.uiMode = Configuration.UI_MODE_NIGHT_YES; - mController.refreshSummary(mPreference); - - verify(mPreference).setVisible(eq(true)); + assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE); } @Test - public void nightMode_customOff_showPreference() { + public void getAvailabilityStatus_nightModeCustomOff_available() { when(mService.getNightMode()).thenReturn(UiModeManager.MODE_NIGHT_CUSTOM); mConfig.uiMode = Configuration.UI_MODE_NIGHT_NO; - mController.refreshSummary(mPreference); - - verify(mPreference).setVisible(eq(true)); + assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE); } @Test - public void nightMode_customBedtimeOn_hidePreference() { + public void getAvailabilityStatus_nightModeCustomBedtimeOn_unavailable() { when(mService.getNightMode()).thenReturn(UiModeManager.MODE_NIGHT_CUSTOM); when(mService.getNightModeCustomType()) .thenReturn(UiModeManager.MODE_NIGHT_CUSTOM_TYPE_BEDTIME); mConfig.uiMode = Configuration.UI_MODE_NIGHT_YES; - mController.refreshSummary(mPreference); - - verify(mPreference).setVisible(eq(false)); + assertThat(mController.getAvailabilityStatus()).isEqualTo(CONDITIONALLY_UNAVAILABLE); } @Test - public void nightMode_customBedtimeOff_hidePreference() { + public void getAvailabilityStatus_nightModeCustomBedtimeOff_unavailable() { when(mService.getNightMode()).thenReturn(UiModeManager.MODE_NIGHT_CUSTOM); when(mService.getNightModeCustomType()) .thenReturn(UiModeManager.MODE_NIGHT_CUSTOM_TYPE_BEDTIME); mConfig.uiMode = Configuration.UI_MODE_NIGHT_NO; - mController.refreshSummary(mPreference); - - verify(mPreference).setVisible(eq(false)); + assertThat(mController.getAvailabilityStatus()).isEqualTo(CONDITIONALLY_UNAVAILABLE); } @Test