Snap for 7451737 from 5213fbced1 to sc-release
Change-Id: I4999e14db2cea6a61a85ea689773cb8e3d2e5baa
This commit is contained in:
@@ -3166,8 +3166,8 @@
|
||||
<string name="wallpaper_settings_title">Wallpaper</string>
|
||||
<!-- Styles & Wallpapers settings title [CHAR LIMIT=30] -->
|
||||
<string name="style_and_wallpaper_settings_title">Wallpaper & style</string>
|
||||
<!-- Summary for the top level Styles & wallpapers Settings [CHAR LIMIT=NONE]-->
|
||||
<string name="wallpaper_dashboard_summary">Colors, themed icons, app grid</string>
|
||||
<!-- Summary for the top level wallpapers settings [CHAR LIMIT=NONE]-->
|
||||
<string name="wallpaper_dashboard_summary">Home, lock screen</string>
|
||||
<!-- Wallpaper settings summary when default wallpaper is used [CHAR LIMIT=NONE] -->
|
||||
<string name="wallpaper_settings_summary_default">Default</string>
|
||||
<!-- Wallpaper settings summary when wallpaper has been updated [CHAR LIMIT=NONE] -->
|
||||
@@ -11676,7 +11676,7 @@
|
||||
<string name="swipe_bottom_to_notifications_summary">Swipe down on the bottom edge of the screen to show your notifications.\nYou can\'t use one-handed mode when this feature is turned on.</string>
|
||||
|
||||
<!-- Preference and settings suggestion title text for one handed [CHAR LIMIT=60] -->
|
||||
<string name="one_handed_title">One-Handed mode</string>
|
||||
<string name="one_handed_title">One-handed mode</string>
|
||||
<!-- Preference Switch for enabling one handed [CHAR LIMIT=60] -->
|
||||
<string name="one_handed_mode_enabled">Use one-handed mode</string>
|
||||
<!-- Preference Switch for app taps to exit one handed [CHAR LIMIT=60] -->
|
||||
@@ -11691,6 +11691,19 @@
|
||||
<string name="one_handed_timeout_long">12 seconds</string>
|
||||
<!-- Search keywords for "One-Handed" settings [CHAR_LIMIT=NONE] -->
|
||||
<string name="keywords_one_handed">reachability</string>
|
||||
<!-- Category title for one handed swipe down [CHAR_LIMIT=60] -->
|
||||
<string name="one_handed_mode_swipe_down_category">Swipe down to</string>
|
||||
<!-- One-handed mode Intro Text [CHAR_LIMIT=NONE] -->
|
||||
<string name="one_handed_mode_intro_text">To use one handed mode, swipe down from the bottom edge of the screen. To use this feature, make sure gesture navigation is turned on in system navigation settings.</string>
|
||||
<!-- One-handed mode pull down screen into reach action title [CHAR_LIMIT=60] -->
|
||||
<string name="one_handed_action_pull_down_screen_title">Pull screen into reach</string>
|
||||
<!-- One-handed mode pull down screen into reach action title [CHAR_LIMIT=NONE] -->
|
||||
<string name="one_handed_action_pull_down_screen_summary">The top of the screen will move into reach of your thumb.</string>
|
||||
<!-- One-handed mode show notification action [CHAR_LIMIT=60] -->
|
||||
<string name="one_handed_action_show_notification_title">Show notifications</string>
|
||||
<!-- One-handed mode show notification action [CHAR_LIMIT=NONE] -->
|
||||
<string name="one_handed_action_show_notification_summary">Notification and settings will appear.</string>
|
||||
<!-- One-handed mode Intro text for gesture navigation [CHAR_LIMIT=NONE] -->
|
||||
|
||||
<!-- Summary text for ambient display double tap [CHAR LIMIT=NONE]-->
|
||||
<string name="ambient_display_summary">To check time, notifications, and other info, double-tap your screen.</string>
|
||||
|
||||
@@ -33,13 +33,6 @@
|
||||
settings:searchable="false"
|
||||
settings:controller="com.android.settings.gestures.SwipeToNotificationPreferenceController" />
|
||||
|
||||
<Preference
|
||||
android:key="gesture_swipe_bottom_to_notification"
|
||||
android:title="@string/swipe_bottom_to_notifications_title"
|
||||
android:fragment="com.android.settings.gestures.SwipeBottomToNotificationSettings"
|
||||
settings:searchable="false"
|
||||
settings:controller="com.android.settings.gestures.SwipeBottomToNotificationPreferenceController" />
|
||||
|
||||
<Preference
|
||||
android:key="gesture_double_tap_power_input_summary"
|
||||
android:title="@string/double_tap_power_for_camera_title"
|
||||
|
||||
@@ -21,12 +21,6 @@
|
||||
android:persistent="false"
|
||||
android:title="@string/one_handed_title">
|
||||
|
||||
<com.android.settingslib.widget.MainSwitchPreference
|
||||
android:key="gesture_one_handed_mode_enabled"
|
||||
android:title="@string/one_handed_mode_enabled"
|
||||
settings:keywords="@string/keywords_one_handed"
|
||||
settings:controller="com.android.settings.gestures.OneHandedEnablePreferenceController"/>
|
||||
|
||||
<com.android.settingslib.widget.LayoutPreference
|
||||
android:key="one_handed_header"
|
||||
android:layout="@layout/one_handed_header"
|
||||
@@ -35,16 +29,31 @@
|
||||
settings:allowDividerBelow="false"
|
||||
settings:searchable="false"/>
|
||||
|
||||
<SwitchPreference
|
||||
android:key="gesture_app_taps_to_exit"
|
||||
android:title="@string/one_handed_app_taps_to_exit"
|
||||
settings:controller="com.android.settings.gestures.OneHandedAppTapsExitPreferenceController"/>
|
||||
<com.android.settingslib.widget.MainSwitchPreference
|
||||
android:key="gesture_one_handed_mode_enabled_main_switch"
|
||||
android:title="@string/one_handed_mode_enabled"
|
||||
settings:keywords="@string/keywords_one_handed"
|
||||
settings:controller="com.android.settings.gestures.OneHandedMainSwitchPreferenceController"/>
|
||||
|
||||
<ListPreference
|
||||
android:key="gesture_one_handed_timeout"
|
||||
android:entries="@array/one_handed_timeout_title"
|
||||
android:entryValues="@array/one_handed_timeout_values"
|
||||
android:persistent="false"
|
||||
android:title="@string/one_handed_timeout_title"
|
||||
settings:controller="com.android.settings.gestures.OneHandedTimeoutPreferenceController"/>
|
||||
<com.android.settingslib.widget.TopIntroPreference
|
||||
android:key="gesture_one_handed_mode_intro_text"
|
||||
android:title="@string/one_handed_mode_intro_text"/>
|
||||
|
||||
<PreferenceCategory
|
||||
android:key="gesture_one_handed_mode_swipe_down"
|
||||
android:title="@string/one_handed_mode_swipe_down_category">
|
||||
|
||||
<com.android.settingslib.widget.RadioButtonPreference
|
||||
android:key="gesture_one_handed_action_pull_screen_down"
|
||||
android:title="@string/one_handed_action_pull_down_screen_title"
|
||||
android:summary="@string/one_handed_action_pull_down_screen_summary"
|
||||
settings:controller="com.android.settings.gestures.OneHandedActionPullDownPrefController"/>
|
||||
|
||||
<com.android.settingslib.widget.RadioButtonPreference
|
||||
android:key="gesture_one_handed_action_show_notification"
|
||||
android:title="@string/one_handed_action_show_notification_title"
|
||||
android:summary="@string/one_handed_action_show_notification_summary"
|
||||
settings:controller="com.android.settings.gestures.OneHandedActionShowNotificationPrefController"/>
|
||||
|
||||
</PreferenceCategory>
|
||||
</PreferenceScreen>
|
||||
|
||||
@@ -1,38 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--
|
||||
~ Copyright (C) 2020 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.
|
||||
-->
|
||||
|
||||
<PreferenceScreen
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:settings="http://schemas.android.com/apk/res-auto"
|
||||
android:title="@string/swipe_bottom_to_notifications_title">
|
||||
|
||||
<com.android.settingslib.widget.LayoutPreference
|
||||
android:key="one_handed_header"
|
||||
android:layout="@layout/one_handed_header"
|
||||
android:persistent="false"
|
||||
android:selectable="false"
|
||||
settings:allowDividerBelow="false"
|
||||
settings:searchable="false"/>
|
||||
|
||||
<SwitchPreference
|
||||
android:key="gesture_swipe_bottom_to_notification"
|
||||
android:title="@string/swipe_bottom_to_notifications_title"
|
||||
android:summary="@string/swipe_bottom_to_notifications_summary"
|
||||
settings:controller="com.android.settings.gestures.SwipeBottomToNotificationPreferenceController"
|
||||
settings:allowDividerAbove="true" />
|
||||
|
||||
</PreferenceScreen>
|
||||
@@ -78,10 +78,12 @@ public class LaunchAccessibilityActivityPreferenceFragment extends ToggleFeature
|
||||
// Settings animated image.
|
||||
final int animatedImageRes = arguments.getInt(
|
||||
AccessibilitySettings.EXTRA_ANIMATED_IMAGE_RES);
|
||||
mImageUri = new Uri.Builder().scheme(ContentResolver.SCHEME_ANDROID_RESOURCE)
|
||||
.authority(mComponentName.getPackageName())
|
||||
.appendPath(String.valueOf(animatedImageRes))
|
||||
.build();
|
||||
if (animatedImageRes > 0) {
|
||||
mImageUri = new Uri.Builder().scheme(ContentResolver.SCHEME_ANDROID_RESOURCE)
|
||||
.authority(mComponentName.getPackageName())
|
||||
.appendPath(String.valueOf(animatedImageRes))
|
||||
.build();
|
||||
}
|
||||
|
||||
// Settings html description.
|
||||
mHtmlDescription = arguments.getCharSequence(AccessibilitySettings.EXTRA_HTML_DESCRIPTION);
|
||||
|
||||
@@ -396,10 +396,12 @@ public class ToggleAccessibilityServicePreferenceFragment extends
|
||||
// Settings animated image.
|
||||
final int animatedImageRes = arguments.getInt(
|
||||
AccessibilitySettings.EXTRA_ANIMATED_IMAGE_RES);
|
||||
mImageUri = new Uri.Builder().scheme(ContentResolver.SCHEME_ANDROID_RESOURCE)
|
||||
.authority(mComponentName.getPackageName())
|
||||
.appendPath(String.valueOf(animatedImageRes))
|
||||
.build();
|
||||
if (animatedImageRes > 0) {
|
||||
mImageUri = new Uri.Builder().scheme(ContentResolver.SCHEME_ANDROID_RESOURCE)
|
||||
.authority(mComponentName.getPackageName())
|
||||
.appendPath(String.valueOf(animatedImageRes))
|
||||
.build();
|
||||
}
|
||||
|
||||
// Get Accessibility service name.
|
||||
mPackageName = getAccessibilityServiceInfo().getResolveInfo().loadLabel(
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 2020 The Android Open Source Project
|
||||
* Copyright (C) 2021 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.
|
||||
@@ -22,61 +22,61 @@ import android.net.Uri;
|
||||
import androidx.preference.Preference;
|
||||
import androidx.preference.PreferenceScreen;
|
||||
|
||||
import com.android.settings.core.TogglePreferenceController;
|
||||
import com.android.settings.core.BasePreferenceController;
|
||||
import com.android.settingslib.core.lifecycle.LifecycleObserver;
|
||||
import com.android.settingslib.core.lifecycle.events.OnStart;
|
||||
import com.android.settingslib.core.lifecycle.events.OnStop;
|
||||
import com.android.settingslib.widget.RadioButtonPreference;
|
||||
|
||||
/**
|
||||
* The Controller to handle app taps to exit of one-handed mode
|
||||
*/
|
||||
public class OneHandedAppTapsExitPreferenceController extends TogglePreferenceController implements
|
||||
LifecycleObserver, OnStart, OnStop, OneHandedSettingsUtils.TogglesCallback {
|
||||
* The controller to handle one-handed mode pull screen into reach preference.
|
||||
**/
|
||||
public class OneHandedActionPullDownPrefController extends BasePreferenceController
|
||||
implements OneHandedSettingsUtils.TogglesCallback, LifecycleObserver, OnStart, OnStop {
|
||||
|
||||
private final OneHandedSettingsUtils mUtils;
|
||||
|
||||
private Preference mPreference;
|
||||
|
||||
public OneHandedAppTapsExitPreferenceController(Context context, String key) {
|
||||
public OneHandedActionPullDownPrefController(Context context, String key) {
|
||||
super(context, key);
|
||||
|
||||
mUtils = new OneHandedSettingsUtils(context);
|
||||
}
|
||||
|
||||
// By default, app taps to stop one-handed is enabled, this will get default value once.
|
||||
OneHandedSettingsUtils.setTapsAppToExitEnabled(mContext, isChecked());
|
||||
@Override
|
||||
public void updateState(Preference preference) {
|
||||
super.updateState(preference);
|
||||
if (preference instanceof RadioButtonPreference) {
|
||||
((RadioButtonPreference) preference).setChecked(
|
||||
!OneHandedSettingsUtils.isSwipeDownNotificationEnabled(mContext));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getAvailabilityStatus() {
|
||||
return OneHandedSettingsUtils.isOneHandedModeEnabled(mContext)
|
||||
return (OneHandedSettingsUtils.isSupportOneHandedMode()
|
||||
&& OneHandedSettingsUtils.canEnableController(mContext))
|
||||
? AVAILABLE : DISABLED_DEPENDENT_SETTING;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean handlePreferenceTreeClick(Preference preference) {
|
||||
if (!getPreferenceKey().equals(preference.getKey())) {
|
||||
return false;
|
||||
}
|
||||
OneHandedSettingsUtils.setSwipeDownNotificationEnabled(mContext, false);
|
||||
if (preference instanceof RadioButtonPreference) {
|
||||
((RadioButtonPreference) preference).setChecked(true);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void displayPreference(PreferenceScreen screen) {
|
||||
super.displayPreference(screen);
|
||||
mPreference = screen.findPreference(getPreferenceKey());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateState(Preference preference) {
|
||||
super.updateState(preference);
|
||||
|
||||
final int availabilityStatus = getAvailabilityStatus();
|
||||
preference.setEnabled(
|
||||
availabilityStatus == AVAILABLE || availabilityStatus == AVAILABLE_UNSEARCHABLE);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean setChecked(boolean isChecked) {
|
||||
return OneHandedSettingsUtils.setTapsAppToExitEnabled(mContext, isChecked);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isChecked() {
|
||||
return OneHandedSettingsUtils.isTapsAppToExitEnabled(mContext);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStart() {
|
||||
mUtils.registerToggleAwareObserver(this);
|
||||
@@ -89,6 +89,13 @@ public class OneHandedAppTapsExitPreferenceController extends TogglePreferenceCo
|
||||
|
||||
@Override
|
||||
public void onChange(Uri uri) {
|
||||
updateState(mPreference);
|
||||
if (mPreference == null) {
|
||||
return;
|
||||
}
|
||||
if (uri.equals(OneHandedSettingsUtils.ONE_HANDED_MODE_ENABLED_URI)) {
|
||||
mPreference.setEnabled(OneHandedSettingsUtils.canEnableController(mContext));
|
||||
} else if (uri.equals(OneHandedSettingsUtils.SHOW_NOTIFICATION_ENABLED_URI)) {
|
||||
updateState(mPreference);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,101 @@
|
||||
/*
|
||||
* Copyright (C) 2021 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.gestures;
|
||||
|
||||
import android.content.Context;
|
||||
import android.net.Uri;
|
||||
|
||||
import androidx.preference.Preference;
|
||||
import androidx.preference.PreferenceScreen;
|
||||
|
||||
import com.android.settings.core.BasePreferenceController;
|
||||
import com.android.settingslib.core.lifecycle.LifecycleObserver;
|
||||
import com.android.settingslib.core.lifecycle.events.OnStart;
|
||||
import com.android.settingslib.core.lifecycle.events.OnStop;
|
||||
import com.android.settingslib.widget.RadioButtonPreference;
|
||||
|
||||
/**
|
||||
* The controller to handle one-handed mode show notification preference.
|
||||
**/
|
||||
public class OneHandedActionShowNotificationPrefController extends BasePreferenceController
|
||||
implements OneHandedSettingsUtils.TogglesCallback, LifecycleObserver, OnStart, OnStop {
|
||||
|
||||
private final OneHandedSettingsUtils mUtils;
|
||||
|
||||
private Preference mPreference;
|
||||
|
||||
public OneHandedActionShowNotificationPrefController(Context context, String key) {
|
||||
super(context, key);
|
||||
mUtils = new OneHandedSettingsUtils(context);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateState(Preference preference) {
|
||||
super.updateState(preference);
|
||||
if (preference instanceof RadioButtonPreference) {
|
||||
((RadioButtonPreference) preference).setChecked(
|
||||
OneHandedSettingsUtils.isSwipeDownNotificationEnabled(mContext));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getAvailabilityStatus() {
|
||||
return (OneHandedSettingsUtils.isSupportOneHandedMode()
|
||||
&& OneHandedSettingsUtils.canEnableController(mContext))
|
||||
? AVAILABLE : DISABLED_DEPENDENT_SETTING;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean handlePreferenceTreeClick(Preference preference) {
|
||||
if (!getPreferenceKey().equals(preference.getKey())) {
|
||||
return false;
|
||||
}
|
||||
OneHandedSettingsUtils.setSwipeDownNotificationEnabled(mContext, true);
|
||||
if (preference instanceof RadioButtonPreference) {
|
||||
((RadioButtonPreference) preference).setChecked(true);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void displayPreference(PreferenceScreen screen) {
|
||||
super.displayPreference(screen);
|
||||
mPreference = screen.findPreference(getPreferenceKey());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStart() {
|
||||
mUtils.registerToggleAwareObserver(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStop() {
|
||||
mUtils.unregisterToggleAwareObserver();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onChange(Uri uri) {
|
||||
if (mPreference == null) {
|
||||
return;
|
||||
}
|
||||
if (uri.equals(OneHandedSettingsUtils.ONE_HANDED_MODE_ENABLED_URI)) {
|
||||
mPreference.setEnabled(OneHandedSettingsUtils.canEnableController(mContext));
|
||||
} else if (uri.equals(OneHandedSettingsUtils.SHOW_NOTIFICATION_ENABLED_URI)) {
|
||||
updateState(mPreference);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -19,38 +19,25 @@ package com.android.settings.gestures;
|
||||
import android.content.Context;
|
||||
|
||||
import com.android.settings.R;
|
||||
import com.android.settings.widget.SettingsMainSwitchPreferenceController;
|
||||
import com.android.settings.core.BasePreferenceController;
|
||||
|
||||
/**
|
||||
* The controller to handle one-handed mode enable or disable state.
|
||||
**/
|
||||
public class OneHandedEnablePreferenceController extends SettingsMainSwitchPreferenceController {
|
||||
public class OneHandedEnablePreferenceController extends BasePreferenceController {
|
||||
|
||||
public OneHandedEnablePreferenceController(Context context, String key) {
|
||||
super(context, key);
|
||||
public OneHandedEnablePreferenceController(Context context, String preferenceKey) {
|
||||
super(context, preferenceKey);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getAvailabilityStatus() {
|
||||
return OneHandedSettingsUtils.isFeatureAvailable(mContext)
|
||||
? AVAILABLE : UNSUPPORTED_ON_DEVICE;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean setChecked(boolean isChecked) {
|
||||
OneHandedSettingsUtils.setOneHandedModeEnabled(mContext, isChecked);
|
||||
OneHandedSettingsUtils.setSwipeDownNotificationEnabled(mContext, !isChecked);
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isChecked() {
|
||||
return OneHandedSettingsUtils.isOneHandedModeEnabled(mContext);
|
||||
return OneHandedSettingsUtils.isSupportOneHandedMode() ? AVAILABLE : UNSUPPORTED_ON_DEVICE;
|
||||
}
|
||||
|
||||
@Override
|
||||
public CharSequence getSummary() {
|
||||
return mContext.getText(
|
||||
isChecked() ? R.string.gesture_setting_on : R.string.gesture_setting_off);
|
||||
OneHandedSettingsUtils.isOneHandedModeEnabled(mContext)
|
||||
? R.string.gesture_setting_on : R.string.gesture_setting_off);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,56 @@
|
||||
/*
|
||||
* Copyright (C) 2021 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.gestures;
|
||||
|
||||
import android.content.Context;
|
||||
|
||||
import com.android.settings.widget.SettingsMainSwitchPreferenceController;
|
||||
|
||||
/**
|
||||
* The controller to handle one-handed mode main switch enable or disable state.
|
||||
**/
|
||||
public class OneHandedMainSwitchPreferenceController extends
|
||||
SettingsMainSwitchPreferenceController {
|
||||
|
||||
public OneHandedMainSwitchPreferenceController(Context context, String preferenceKey) {
|
||||
super(context, preferenceKey);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getAvailabilityStatus() {
|
||||
return (OneHandedSettingsUtils.isSupportOneHandedMode()
|
||||
&& OneHandedSettingsUtils.getNavigationBarMode(mContext) != 0 /* 3-button mode */)
|
||||
? AVAILABLE : DISABLED_DEPENDENT_SETTING;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isChecked() {
|
||||
return OneHandedSettingsUtils.isOneHandedModeEnabled(mContext);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean setChecked(boolean isChecked) {
|
||||
if (isChecked) {
|
||||
// Set default value for TapsAppToExit and Timeout
|
||||
OneHandedSettingsUtils.setTapsAppToExitEnabled(mContext, true);
|
||||
OneHandedSettingsUtils.setTimeoutValue(mContext,
|
||||
OneHandedSettingsUtils.OneHandedTimeout.MEDIUM.getValue());
|
||||
}
|
||||
OneHandedSettingsUtils.setOneHandedModeEnabled(mContext, isChecked);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -26,6 +26,8 @@ import android.os.SystemProperties;
|
||||
import android.os.UserHandle;
|
||||
import android.provider.Settings;
|
||||
|
||||
import androidx.annotation.VisibleForTesting;
|
||||
|
||||
/**
|
||||
* The Util to query one-handed mode settings config
|
||||
*/
|
||||
@@ -34,6 +36,10 @@ public class OneHandedSettingsUtils {
|
||||
static final String SUPPORT_ONE_HANDED_MODE = "ro.support_one_handed_mode";
|
||||
static final int OFF = 0;
|
||||
static final int ON = 1;
|
||||
static final Uri ONE_HANDED_MODE_ENABLED_URI =
|
||||
Settings.Secure.getUriFor(Settings.Secure.ONE_HANDED_MODE_ENABLED);
|
||||
static final Uri SHOW_NOTIFICATION_ENABLED_URI =
|
||||
Settings.Secure.getUriFor(Settings.Secure.SWIPE_BOTTOM_TO_NOTIFICATION_ENABLED);
|
||||
|
||||
public enum OneHandedTimeout {
|
||||
NEVER(0), SHORT(4), MEDIUM(8), LONG(12);
|
||||
@@ -176,6 +182,21 @@ public class OneHandedSettingsUtils {
|
||||
sCurrentUserId);
|
||||
}
|
||||
|
||||
/**
|
||||
* Set NavigationBar mode flag to Settings provider.
|
||||
* @param context App context
|
||||
* @param value Navigation bar mode:
|
||||
* 0 = 3 button
|
||||
* 1 = 2 button
|
||||
* 2 = fully gestural
|
||||
* @return true if the value was set, false on database errors.
|
||||
*/
|
||||
@VisibleForTesting
|
||||
public boolean setNavigationBarMode(Context context, String value) {
|
||||
return Settings.Secure.putStringForUser(context.getContentResolver(),
|
||||
Settings.Secure.NAVIGATION_MODE, value, UserHandle.myUserId());
|
||||
}
|
||||
|
||||
/**
|
||||
* Get NavigationBar mode flag from Settings provider.
|
||||
* @param context App context
|
||||
@@ -190,12 +211,17 @@ public class OneHandedSettingsUtils {
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* Check if One-handed mode settings controllers can enabled or disabled.
|
||||
* @param context App context
|
||||
* @return Support One-Handed mode feature or not.
|
||||
* @return true if controllers are able to enabled, false otherwise.
|
||||
*
|
||||
* Note: For better UX experience, just disabled controls that let users know to use
|
||||
* this feature, they need to make sure gesture navigation is turned on in system
|
||||
* navigation settings.
|
||||
*/
|
||||
public static boolean isFeatureAvailable(Context context) {
|
||||
return isSupportOneHandedMode() && getNavigationBarMode(context) != 0;
|
||||
public static boolean canEnableController(Context context) {
|
||||
return (OneHandedSettingsUtils.isOneHandedModeEnabled(context)
|
||||
&& OneHandedSettingsUtils.getNavigationBarMode(context) != 0 /* 3-button mode */);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -218,9 +244,6 @@ public class OneHandedSettingsUtils {
|
||||
private final class SettingsObserver extends ContentObserver {
|
||||
private TogglesCallback mCallback;
|
||||
|
||||
private final Uri mOneHandedEnabledAware = Settings.Secure.getUriFor(
|
||||
Settings.Secure.ONE_HANDED_MODE_ENABLED);
|
||||
|
||||
SettingsObserver(Handler handler) {
|
||||
super(handler);
|
||||
}
|
||||
@@ -231,7 +254,8 @@ public class OneHandedSettingsUtils {
|
||||
|
||||
public void observe() {
|
||||
final ContentResolver resolver = mContext.getContentResolver();
|
||||
resolver.registerContentObserver(mOneHandedEnabledAware, true, this);
|
||||
resolver.registerContentObserver(ONE_HANDED_MODE_ENABLED_URI, true, this);
|
||||
resolver.registerContentObserver(SHOW_NOTIFICATION_ENABLED_URI, true, this);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -1,138 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2020 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.gestures;
|
||||
|
||||
import android.content.Context;
|
||||
import android.net.Uri;
|
||||
|
||||
import androidx.preference.ListPreference;
|
||||
import androidx.preference.Preference;
|
||||
import androidx.preference.PreferenceScreen;
|
||||
|
||||
import com.android.settings.R;
|
||||
import com.android.settings.core.BasePreferenceController;
|
||||
import com.android.settingslib.core.lifecycle.LifecycleObserver;
|
||||
import com.android.settingslib.core.lifecycle.events.OnStart;
|
||||
import com.android.settingslib.core.lifecycle.events.OnStop;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* The Controller to handle one-handed mode timeout state.
|
||||
**/
|
||||
public class OneHandedTimeoutPreferenceController extends BasePreferenceController implements
|
||||
Preference.OnPreferenceChangeListener, LifecycleObserver, OnStart, OnStop,
|
||||
OneHandedSettingsUtils.TogglesCallback {
|
||||
|
||||
private final Map<String, String> mTimeoutMap;
|
||||
private final OneHandedSettingsUtils mUtils;
|
||||
|
||||
private Preference mTimeoutPreference;
|
||||
|
||||
public OneHandedTimeoutPreferenceController(Context context, String preferenceKey) {
|
||||
super(context, preferenceKey);
|
||||
|
||||
mTimeoutMap = new HashMap<>();
|
||||
initTimeoutMap();
|
||||
mUtils = new OneHandedSettingsUtils(context);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getAvailabilityStatus() {
|
||||
return OneHandedSettingsUtils.isOneHandedModeEnabled(mContext)
|
||||
? AVAILABLE : DISABLED_DEPENDENT_SETTING;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onPreferenceChange(Preference preference, Object object) {
|
||||
if (!(preference instanceof ListPreference)) {
|
||||
return false;
|
||||
}
|
||||
final int newValue = Integer.parseInt((String) object);
|
||||
OneHandedSettingsUtils.setTimeoutValue(mContext, newValue);
|
||||
updateState(preference);
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateState(Preference preference) {
|
||||
super.updateState(preference);
|
||||
if (!(preference instanceof ListPreference)) {
|
||||
return;
|
||||
}
|
||||
final ListPreference listPreference = (ListPreference) preference;
|
||||
listPreference.setValue(getTimeoutValue());
|
||||
|
||||
final int availabilityStatus = getAvailabilityStatus();
|
||||
preference.setEnabled(
|
||||
availabilityStatus == AVAILABLE || availabilityStatus == AVAILABLE_UNSEARCHABLE);
|
||||
}
|
||||
|
||||
@Override
|
||||
public CharSequence getSummary() {
|
||||
if (OneHandedSettingsUtils.getTimeoutValue(mContext) == 0) {
|
||||
return mContext.getResources().getString(R.string.screensaver_settings_summary_never);
|
||||
}
|
||||
return String.format(mContext.getResources().getString(
|
||||
R.string.screen_timeout_summary), mTimeoutMap.get(getTimeoutValue()));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void displayPreference(PreferenceScreen screen) {
|
||||
super.displayPreference(screen);
|
||||
mTimeoutPreference = screen.findPreference(mPreferenceKey);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStart() {
|
||||
mUtils.registerToggleAwareObserver(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStop() {
|
||||
mUtils.unregisterToggleAwareObserver();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onChange(Uri uri) {
|
||||
updateState(mTimeoutPreference);
|
||||
}
|
||||
|
||||
private String getTimeoutValue() {
|
||||
return String.valueOf(OneHandedSettingsUtils.getTimeoutValue(mContext));
|
||||
}
|
||||
|
||||
private void initTimeoutMap() {
|
||||
if (mTimeoutMap.size() != 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
final String[] timeoutValues = mContext.getResources().getStringArray(
|
||||
R.array.one_handed_timeout_values);
|
||||
final String[] timeoutTitles = mContext.getResources().getStringArray(
|
||||
R.array.one_handed_timeout_title);
|
||||
|
||||
if (timeoutValues.length != timeoutTitles.length) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (int i = 0; i < timeoutValues.length; i++) {
|
||||
mTimeoutMap.put(timeoutValues[i], timeoutTitles[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,71 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2020 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.gestures;
|
||||
|
||||
|
||||
import android.content.Context;
|
||||
|
||||
import com.android.settings.R;
|
||||
import com.android.settings.core.TogglePreferenceController;
|
||||
|
||||
/**
|
||||
* Handles swipe bottom to expand notification panel gesture.
|
||||
**/
|
||||
public class SwipeBottomToNotificationPreferenceController extends TogglePreferenceController {
|
||||
|
||||
public SwipeBottomToNotificationPreferenceController(Context context, String key) {
|
||||
super(context, key);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getAvailabilityStatus() {
|
||||
return OneHandedSettingsUtils.isFeatureAvailable(mContext)
|
||||
? AVAILABLE : UNSUPPORTED_ON_DEVICE;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isSliceable() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isPublicSlice() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean setChecked(boolean isChecked) {
|
||||
if (isChecked) {
|
||||
OneHandedSettingsUtils.setOneHandedModeEnabled(mContext, false);
|
||||
}
|
||||
OneHandedSettingsUtils.setSwipeDownNotificationEnabled(mContext, isChecked);
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isChecked() {
|
||||
return OneHandedSettingsUtils.isSwipeDownNotificationEnabled(mContext);
|
||||
}
|
||||
|
||||
@Override
|
||||
public CharSequence getSummary() {
|
||||
// This toggle preference summary will be updated in gesture preference page since we bound
|
||||
// it with entry preference in gesture.xml
|
||||
return mContext.getText(
|
||||
isChecked() ? R.string.gesture_setting_on : R.string.gesture_setting_off);
|
||||
}
|
||||
}
|
||||
@@ -1,59 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2020 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.gestures;
|
||||
|
||||
import android.app.settings.SettingsEnums;
|
||||
import android.content.Context;
|
||||
|
||||
import com.android.settings.R;
|
||||
import com.android.settings.dashboard.DashboardFragment;
|
||||
import com.android.settings.search.BaseSearchIndexProvider;
|
||||
|
||||
/**
|
||||
* The Fragment for swipe bottom to notification gesture settings.
|
||||
*/
|
||||
public class SwipeBottomToNotificationSettings extends DashboardFragment {
|
||||
|
||||
private static final String TAG = "SwipeBottomToNotificationSettings";
|
||||
|
||||
@Override
|
||||
public int getMetricsCategory() {
|
||||
return SettingsEnums.SETTINGS_SWIPE_BOTTOM_TO_NOTIFICATION;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String getLogTag() {
|
||||
return TAG;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected int getPreferenceScreenResId() {
|
||||
return R.xml.swipe_bottom_to_notification_settings;
|
||||
}
|
||||
|
||||
public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
|
||||
new BaseSearchIndexProvider(R.xml.swipe_bottom_to_notification_settings) {
|
||||
|
||||
@Override
|
||||
protected boolean isPageSearchEnabled(Context context) {
|
||||
if (!OneHandedSettingsUtils.isSupportOneHandedMode()) {
|
||||
return false;
|
||||
}
|
||||
return !OneHandedSettingsUtils.isOneHandedModeEnabled(context);
|
||||
}
|
||||
};
|
||||
}
|
||||
@@ -20,6 +20,7 @@ package com.android.settings.network;
|
||||
import static android.app.slice.Slice.EXTRA_TOGGLE_STATE;
|
||||
|
||||
import static com.android.settings.slices.CustomSliceRegistry.PROVIDER_MODEL_SLICE_URI;
|
||||
import static com.android.settings.slices.CustomSliceRegistry.WIFI_SLICE_URI;
|
||||
|
||||
import android.annotation.ColorInt;
|
||||
import android.app.PendingIntent;
|
||||
@@ -64,7 +65,6 @@ import java.util.stream.Collectors;
|
||||
public class ProviderModelSlice extends WifiSlice {
|
||||
|
||||
private static final String TAG = "ProviderModelSlice";
|
||||
protected static final String ACTION_TITLE_CONNECT_TO_CARRIER = "Connect_To_Carrier";
|
||||
|
||||
private final ProviderModelSliceHelper mHelper;
|
||||
|
||||
@@ -89,78 +89,77 @@ public class ProviderModelSlice extends WifiSlice {
|
||||
@Override
|
||||
public Slice getSlice() {
|
||||
// The provider model slice step:
|
||||
// First section: Add a Wi-Fi item which state is connected.
|
||||
// Second section: Add a carrier item.
|
||||
// Third section: Add the Wi-Fi items which are not connected.
|
||||
// Fourth section: If device has connection problem, this row show the message for user.
|
||||
@InternetUpdater.InternetType int internetType = getInternetType();
|
||||
// First section: Add the Ethernet item.
|
||||
// Second section: Add the carrier item.
|
||||
// Third section: Add the Wi-Fi toggle item.
|
||||
// Fourth section: Add the connected Wi-Fi item.
|
||||
// Fifth section: Add the Wi-Fi items which are not connected.
|
||||
// Sixth section: Add the See All item.
|
||||
final ListBuilder listBuilder = mHelper.createListBuilder(getUri());
|
||||
if (mHelper.isAirplaneModeEnabled() && !mWifiManager.isWifiEnabled()
|
||||
&& internetType != InternetUpdater.INTERNET_ETHERNET) {
|
||||
log("Airplane mode is enabled.");
|
||||
return listBuilder.build();
|
||||
}
|
||||
|
||||
int maxListSize = 0;
|
||||
List<WifiSliceItem> wifiList = null;
|
||||
final NetworkProviderWorker worker = getWorker();
|
||||
if (worker != null) {
|
||||
// get Wi-Fi list.
|
||||
wifiList = worker.getResults();
|
||||
maxListSize = worker.getApRowCount();
|
||||
} else {
|
||||
log("network provider worker is null.");
|
||||
}
|
||||
|
||||
final boolean hasCarrier = mHelper.hasCarrier();
|
||||
log("hasCarrier: " + hasCarrier);
|
||||
|
||||
// First section: Add a Ethernet or Wi-Fi item which state is connected.
|
||||
boolean isConnectedWifiAddedTop = false;
|
||||
final WifiSliceItem connectedWifiItem = mHelper.getConnectedWifiItem(wifiList);
|
||||
if (internetType == InternetUpdater.INTERNET_ETHERNET) {
|
||||
// First section: Add the Ethernet item.
|
||||
if (getInternetType() == InternetUpdater.INTERNET_ETHERNET) {
|
||||
log("get Ethernet item which is connected");
|
||||
listBuilder.addRow(createEthernetRow());
|
||||
maxListSize--;
|
||||
} else {
|
||||
if (connectedWifiItem != null && internetType == InternetUpdater.INTERNET_WIFI) {
|
||||
log("get Wi-Fi item which is connected to internet");
|
||||
listBuilder.addRow(getWifiSliceItemRow(connectedWifiItem));
|
||||
isConnectedWifiAddedTop = true;
|
||||
}
|
||||
|
||||
// Second section: Add the carrier item.
|
||||
if (!mHelper.isAirplaneModeEnabled()) {
|
||||
final boolean hasCarrier = mHelper.hasCarrier();
|
||||
log("hasCarrier: " + hasCarrier);
|
||||
if (hasCarrier) {
|
||||
mHelper.updateTelephony();
|
||||
listBuilder.addRow(
|
||||
mHelper.createCarrierRow(
|
||||
worker != null ? worker.getNetworkTypeDescription() : ""));
|
||||
maxListSize--;
|
||||
}
|
||||
}
|
||||
|
||||
// Second section: Add a carrier item.
|
||||
if (hasCarrier) {
|
||||
mHelper.updateTelephony();
|
||||
listBuilder.addRow(
|
||||
mHelper.createCarrierRow(
|
||||
worker != null ? worker.getNetworkTypeDescription() : ""));
|
||||
maxListSize--;
|
||||
// Third section: Add the Wi-Fi toggle item.
|
||||
final boolean isWifiEnabled = mWifiManager.isWifiEnabled();
|
||||
listBuilder.addRow(createWifiToggleRow(mContext, isWifiEnabled));
|
||||
maxListSize--;
|
||||
if (!isWifiEnabled) {
|
||||
log("Wi-Fi is disabled");
|
||||
return listBuilder.build();
|
||||
}
|
||||
List<WifiSliceItem> wifiList = (worker != null) ? worker.getResults() : null;
|
||||
if (wifiList == null || wifiList.size() <= 0) {
|
||||
log("Wi-Fi list is empty");
|
||||
return listBuilder.build();
|
||||
}
|
||||
|
||||
// Third section: Add the connected Wi-Fi item to Wi-Fi list if the Ethernet is connected.
|
||||
if (connectedWifiItem != null && !isConnectedWifiAddedTop) {
|
||||
// Fourth section: Add the connected Wi-Fi item.
|
||||
final WifiSliceItem connectedWifiItem = mHelper.getConnectedWifiItem(wifiList);
|
||||
if (connectedWifiItem != null) {
|
||||
log("get Wi-Fi item which is connected");
|
||||
listBuilder.addRow(getWifiSliceItemRow(connectedWifiItem));
|
||||
maxListSize--;
|
||||
}
|
||||
|
||||
// Fourth section: Add the Wi-Fi items which are not connected.
|
||||
if (wifiList != null && wifiList.size() > 0) {
|
||||
log("get Wi-Fi items which are not connected. Wi-Fi items : " + wifiList.size());
|
||||
|
||||
final List<WifiSliceItem> disconnectedWifiList = wifiList.stream()
|
||||
.filter(wifiSliceItem -> wifiSliceItem.getConnectedState()
|
||||
!= WifiEntry.CONNECTED_STATE_CONNECTED)
|
||||
.limit(maxListSize - 1)
|
||||
.collect(Collectors.toList());
|
||||
for (WifiSliceItem item : disconnectedWifiList) {
|
||||
listBuilder.addRow(getWifiSliceItemRow(item));
|
||||
}
|
||||
listBuilder.addRow(getSeeAllRow());
|
||||
// Fifth section: Add the Wi-Fi items which are not connected.
|
||||
log("get Wi-Fi items which are not connected. Wi-Fi items : " + wifiList.size());
|
||||
final List<WifiSliceItem> disconnectedWifiList = wifiList.stream()
|
||||
.filter(item -> item.getConnectedState() != WifiEntry.CONNECTED_STATE_CONNECTED)
|
||||
.limit(maxListSize - 1)
|
||||
.collect(Collectors.toList());
|
||||
for (WifiSliceItem item : disconnectedWifiList) {
|
||||
listBuilder.addRow(getWifiSliceItemRow(item));
|
||||
}
|
||||
|
||||
// Sixth section: Add the See All item.
|
||||
log("add See-All");
|
||||
listBuilder.addRow(getSeeAllRow());
|
||||
|
||||
return listBuilder.build();
|
||||
}
|
||||
|
||||
@@ -269,6 +268,26 @@ public class ProviderModelSlice extends WifiSlice {
|
||||
.setSubtitle(mContext.getText(R.string.to_switch_networks_disconnect_ethernet));
|
||||
}
|
||||
|
||||
/**
|
||||
* @return a {@link ListBuilder.RowBuilder} of the Wi-Fi toggle.
|
||||
*/
|
||||
protected ListBuilder.RowBuilder createWifiToggleRow(Context context, boolean isWifiEnabled) {
|
||||
final Intent intent = new Intent(WIFI_SLICE_URI.toString())
|
||||
.setData(WIFI_SLICE_URI)
|
||||
.setClass(context, SliceBroadcastReceiver.class)
|
||||
.putExtra(EXTRA_TOGGLE_STATE, !isWifiEnabled)
|
||||
// The FLAG_RECEIVER_FOREGROUND flag is necessary to avoid the intent delay of
|
||||
// the first sending after the device restarts
|
||||
.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
|
||||
final PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent,
|
||||
PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE);
|
||||
final SliceAction toggleSliceAction = SliceAction.createToggle(pendingIntent,
|
||||
null /* actionTitle */, isWifiEnabled);
|
||||
return new ListBuilder.RowBuilder()
|
||||
.setTitle(context.getString(R.string.wifi_settings))
|
||||
.setPrimaryAction(toggleSliceAction);
|
||||
}
|
||||
|
||||
protected ListBuilder.RowBuilder getSeeAllRow() {
|
||||
final CharSequence title = mContext.getText(R.string.previous_connected_see_all);
|
||||
final IconCompat icon = getSeeAllIcon();
|
||||
@@ -294,31 +313,6 @@ public class ProviderModelSlice extends WifiSlice {
|
||||
return SliceAction.createDeeplink(intent, icon, ListBuilder.ICON_IMAGE, title);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected ListBuilder.RowBuilder getWifiSliceItemRow(WifiSliceItem wifiSliceItem) {
|
||||
final CharSequence title = wifiSliceItem.getTitle();
|
||||
final IconCompat levelIcon = getWifiSliceItemLevelIcon(wifiSliceItem);
|
||||
final ListBuilder.RowBuilder rowBuilder = new ListBuilder.RowBuilder()
|
||||
.setTitleItem(levelIcon, ListBuilder.ICON_IMAGE)
|
||||
.setTitle(title)
|
||||
.setSubtitle(wifiSliceItem.getSummary())
|
||||
.setContentDescription(wifiSliceItem.getContentDescription());
|
||||
|
||||
final IconCompat endIcon;
|
||||
if (wifiSliceItem.hasInternetAccess()) {
|
||||
rowBuilder.setPrimaryAction(SliceAction.create(getBroadcastIntent(mContext),
|
||||
levelIcon, ListBuilder.ICON_IMAGE, ACTION_TITLE_CONNECT_TO_CARRIER));
|
||||
endIcon = IconCompat.createWithResource(mContext, R.drawable.ic_settings_close);
|
||||
} else {
|
||||
rowBuilder.setPrimaryAction(getWifiEntryAction(wifiSliceItem, levelIcon, title));
|
||||
endIcon = getEndIcon(wifiSliceItem);
|
||||
}
|
||||
if (endIcon != null) {
|
||||
rowBuilder.addEndItem(endIcon, ListBuilder.ICON_IMAGE);
|
||||
}
|
||||
return rowBuilder;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected IconCompat getWifiSliceItemLevelIcon(WifiSliceItem wifiSliceItem) {
|
||||
if (wifiSliceItem.getConnectedState() == WifiEntry.CONNECTED_STATE_CONNECTED
|
||||
|
||||
@@ -54,7 +54,7 @@ public class NetworkProviderWorker extends WifiScanWorker implements
|
||||
DataConnectivityListener.Client, InternetUpdater.InternetChangeListener,
|
||||
SubscriptionsChangeListener.SubscriptionsChangeListenerClient {
|
||||
private static final String TAG = "NetworkProviderWorker";
|
||||
private static final int PROVIDER_MODEL_DEFAULT_EXPANDED_ROW_COUNT = 5;
|
||||
private static final int PROVIDER_MODEL_DEFAULT_EXPANDED_ROW_COUNT = 6;
|
||||
private DataContentObserver mMobileDataObserver;
|
||||
private SignalStrengthListener mSignalStrengthListener;
|
||||
private SubscriptionsChangeListener mSubscriptionsListener;
|
||||
|
||||
@@ -38,7 +38,6 @@ import android.text.TextUtils;
|
||||
import android.util.Log;
|
||||
|
||||
import androidx.annotation.VisibleForTesting;
|
||||
import androidx.fragment.app.FragmentActivity;
|
||||
import androidx.lifecycle.LifecycleObserver;
|
||||
import androidx.lifecycle.OnLifecycleEvent;
|
||||
|
||||
@@ -84,12 +83,13 @@ public class InternetConnectivityPanel implements PanelContent, LifecycleObserve
|
||||
}
|
||||
|
||||
if (TextUtils.equals(intent.getAction(), WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)) {
|
||||
showProgressBar();
|
||||
updateProgressBar();
|
||||
updatePanelTitle();
|
||||
return;
|
||||
}
|
||||
|
||||
if (TextUtils.equals(intent.getAction(), WifiManager.NETWORK_STATE_CHANGED_ACTION)) {
|
||||
updateProgressBar();
|
||||
updatePanelTitle();
|
||||
}
|
||||
}
|
||||
@@ -110,13 +110,40 @@ public class InternetConnectivityPanel implements PanelContent, LifecycleObserve
|
||||
private int mDefaultDataSubid = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
|
||||
|
||||
// Wi-Fi scanning progress bar
|
||||
protected HandlerInjector mHandlerInjector;
|
||||
protected boolean mIsProgressBarVisible;
|
||||
protected final Runnable mHideProgressBarRunnable = () -> {
|
||||
protected boolean mIsScanningSubTitleShownOnce;
|
||||
protected Runnable mHideProgressBarRunnable = () -> {
|
||||
setProgressBarVisible(false);
|
||||
};
|
||||
protected Runnable mHideScanningSubTitleRunnable = () -> {
|
||||
mIsScanningSubTitleShownOnce = true;
|
||||
updatePanelTitle();
|
||||
};
|
||||
|
||||
/**
|
||||
* Wrapper for testing compatibility.
|
||||
*/
|
||||
@VisibleForTesting
|
||||
static class HandlerInjector {
|
||||
protected final Handler mHandler;
|
||||
|
||||
HandlerInjector(Context context) {
|
||||
mHandler = context.getMainThreadHandler();
|
||||
}
|
||||
|
||||
public void postDelay(Runnable runnable) {
|
||||
mHandler.postDelayed(runnable, 2000 /* delay millis */);
|
||||
}
|
||||
|
||||
public void removeCallbacks(Runnable runnable) {
|
||||
mHandler.removeCallbacks(runnable);
|
||||
}
|
||||
}
|
||||
|
||||
private InternetConnectivityPanel(Context context) {
|
||||
mContext = context.getApplicationContext();
|
||||
mHandlerInjector = new HandlerInjector(context);
|
||||
mIsProviderModelEnabled = Utils.isProviderModelEnabled(mContext);
|
||||
mInternetUpdater = new InternetUpdater(context, null /* Lifecycle */, this);
|
||||
|
||||
@@ -150,7 +177,7 @@ public class InternetConnectivityPanel implements PanelContent, LifecycleObserve
|
||||
mTelephonyManager.registerTelephonyCallback(
|
||||
new HandlerExecutor(new Handler(Looper.getMainLooper())), mTelephonyCallback);
|
||||
mContext.registerReceiver(mWifiStateReceiver, mWifiStateFilter);
|
||||
showProgressBar();
|
||||
updateProgressBar();
|
||||
updatePanelTitle();
|
||||
}
|
||||
|
||||
@@ -165,7 +192,8 @@ public class InternetConnectivityPanel implements PanelContent, LifecycleObserve
|
||||
mConnectivityListener.stop();
|
||||
mTelephonyManager.unregisterTelephonyCallback(mTelephonyCallback);
|
||||
mContext.unregisterReceiver(mWifiStateReceiver);
|
||||
mContext.getMainThreadHandler().removeCallbacks(mHideProgressBarRunnable);
|
||||
mHandlerInjector.removeCallbacks(mHideProgressBarRunnable);
|
||||
mHandlerInjector.removeCallbacks(mHideScanningSubTitleRunnable);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -209,23 +237,6 @@ public class InternetConnectivityPanel implements PanelContent, LifecycleObserve
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isCustomizedButtonUsed() {
|
||||
return mIsProviderModelEnabled;
|
||||
}
|
||||
|
||||
@Override
|
||||
public CharSequence getCustomizedButtonTitle() {
|
||||
return mContext.getText(
|
||||
mInternetUpdater.isWifiEnabled() ? R.string.turn_off_wifi : R.string.turn_on_wifi);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onClickCustomizedButton(FragmentActivity panelActivity) {
|
||||
// Don't finish the panel activity
|
||||
mWifiManager.setWifiEnabled(!mInternetUpdater.isWifiEnabled());
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isProgressBarVisible() {
|
||||
return mIsProgressBarVisible;
|
||||
@@ -246,6 +257,7 @@ public class InternetConnectivityPanel implements PanelContent, LifecycleObserve
|
||||
*/
|
||||
@Override
|
||||
public void onAirplaneModeChanged(boolean isAirplaneModeOn) {
|
||||
log("onAirplaneModeChanged: isAirplaneModeOn:" + isAirplaneModeOn);
|
||||
updatePanelTitle();
|
||||
}
|
||||
|
||||
@@ -254,6 +266,7 @@ public class InternetConnectivityPanel implements PanelContent, LifecycleObserve
|
||||
*/
|
||||
@Override
|
||||
public void onWifiEnabledChanged(boolean enabled) {
|
||||
log("onWifiEnabledChanged: enabled:" + enabled);
|
||||
updatePanelTitle();
|
||||
}
|
||||
|
||||
@@ -305,13 +318,6 @@ public class InternetConnectivityPanel implements PanelContent, LifecycleObserve
|
||||
return;
|
||||
}
|
||||
|
||||
if (mIsProgressBarVisible) {
|
||||
// When the Wi-Fi scan result callback is received
|
||||
// Sub-Title: Searching for networks...
|
||||
mSubtitle = SUBTITLE_TEXT_SEARCHING_FOR_NETWORKS;
|
||||
return;
|
||||
}
|
||||
|
||||
if (mInternetUpdater.isAirplaneModeOn()) {
|
||||
return;
|
||||
}
|
||||
@@ -319,11 +325,18 @@ public class InternetConnectivityPanel implements PanelContent, LifecycleObserve
|
||||
final List<ScanResult> wifiList = mWifiManager.getScanResults();
|
||||
if (wifiList != null && wifiList.size() != 0) {
|
||||
// When the Wi-Fi scan result is not empty
|
||||
// Sub-Title: Select the network you want to use for data
|
||||
// Sub-Title: Tap a network to connect
|
||||
mSubtitle = SUBTITLE_TEXT_TAP_A_NETWORK_TO_CONNECT;
|
||||
return;
|
||||
}
|
||||
|
||||
if (!mIsScanningSubTitleShownOnce && mIsProgressBarVisible) {
|
||||
// When the Wi-Fi scan result callback is received
|
||||
// Sub-Title: Searching for networks...
|
||||
mSubtitle = SUBTITLE_TEXT_SEARCHING_FOR_NETWORKS;
|
||||
return;
|
||||
}
|
||||
|
||||
// Sub-Title:
|
||||
// show non_carrier_network_unavailable
|
||||
// - while Wi-Fi on + no Wi-Fi item
|
||||
@@ -353,7 +366,7 @@ public class InternetConnectivityPanel implements PanelContent, LifecycleObserve
|
||||
mSubtitle = SUBTITLE_TEXT_NON_CARRIER_NETWORK_UNAVAILABLE;
|
||||
}
|
||||
|
||||
protected void showProgressBar() {
|
||||
protected void updateProgressBar() {
|
||||
if (mWifiManager == null || !mInternetUpdater.isWifiEnabled()) {
|
||||
setProgressBarVisible(false);
|
||||
return;
|
||||
@@ -362,8 +375,9 @@ public class InternetConnectivityPanel implements PanelContent, LifecycleObserve
|
||||
setProgressBarVisible(true);
|
||||
List<ScanResult> wifiScanResults = mWifiManager.getScanResults();
|
||||
if (wifiScanResults != null && wifiScanResults.size() > 0) {
|
||||
mContext.getMainThreadHandler().postDelayed(mHideProgressBarRunnable,
|
||||
2000 /* delay millis */);
|
||||
mHandlerInjector.postDelay(mHideProgressBarRunnable);
|
||||
} else if (!mIsScanningSubTitleShownOnce) {
|
||||
mHandlerInjector.postDelay(mHideScanningSubTitleRunnable);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,108 @@
|
||||
/*
|
||||
* Copyright (C) 2021 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.gestures;
|
||||
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
|
||||
import android.content.Context;
|
||||
import android.os.SystemProperties;
|
||||
import android.os.UserHandle;
|
||||
|
||||
import com.android.settings.core.BasePreferenceController;
|
||||
import com.android.settingslib.widget.RadioButtonPreference;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.robolectric.RobolectricTestRunner;
|
||||
import org.robolectric.RuntimeEnvironment;
|
||||
|
||||
@RunWith(RobolectricTestRunner.class)
|
||||
public class OneHandedActionPullDownPrefControllerTest {
|
||||
|
||||
private static final String KEY = "gesture_one_handed_action_pull_screen_down";
|
||||
|
||||
private Context mContext;
|
||||
private OneHandedSettingsUtils mUtils;
|
||||
private OneHandedActionPullDownPrefController mController;
|
||||
private RadioButtonPreference mPreference;
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
mContext = RuntimeEnvironment.application;
|
||||
mUtils = new OneHandedSettingsUtils(mContext);
|
||||
mController = new OneHandedActionPullDownPrefController(mContext, KEY);
|
||||
mPreference = new RadioButtonPreference(mContext);
|
||||
OneHandedSettingsUtils.setUserId(UserHandle.myUserId());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void updateState_showNotificationEnabled_shouldUnchecked() {
|
||||
OneHandedSettingsUtils.setSwipeDownNotificationEnabled(mContext, true);
|
||||
|
||||
mController.updateState(mPreference);
|
||||
assertThat(mPreference.isChecked()).isFalse();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void updateState_showNotificationDisabled_shouldChecked() {
|
||||
OneHandedSettingsUtils.setSwipeDownNotificationEnabled(mContext, false);
|
||||
|
||||
mController.updateState(mPreference);
|
||||
assertThat(mPreference.isChecked()).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getAvailabilityStatus_setOneHandedModeDisabled_shouldDisabled() {
|
||||
SystemProperties.set(OneHandedSettingsUtils.SUPPORT_ONE_HANDED_MODE, "true");
|
||||
OneHandedSettingsUtils.setOneHandedModeEnabled(mContext, false);
|
||||
mUtils.setNavigationBarMode(mContext, "2" /* fully gestural */);
|
||||
|
||||
assertThat(mController.getAvailabilityStatus())
|
||||
.isEqualTo(BasePreferenceController.DISABLED_DEPENDENT_SETTING);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getAvailabilityStatus_setNavi3ButtonMode_shouldDisabled() {
|
||||
SystemProperties.set(OneHandedSettingsUtils.SUPPORT_ONE_HANDED_MODE, "true");
|
||||
OneHandedSettingsUtils.setOneHandedModeEnabled(mContext, true);
|
||||
mUtils.setNavigationBarMode(mContext, "0" /* 3 button */);
|
||||
|
||||
assertThat(mController.getAvailabilityStatus())
|
||||
.isEqualTo(BasePreferenceController.DISABLED_DEPENDENT_SETTING);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getAvailabilityStatus_setNaviGesturalMode_shouldEnabled() {
|
||||
SystemProperties.set(OneHandedSettingsUtils.SUPPORT_ONE_HANDED_MODE, "true");
|
||||
OneHandedSettingsUtils.setOneHandedModeEnabled(mContext, true);
|
||||
mUtils.setNavigationBarMode(mContext, "2" /* fully gestural */);
|
||||
|
||||
assertThat(mController.getAvailabilityStatus())
|
||||
.isEqualTo(BasePreferenceController.AVAILABLE);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getAvailabilityStatus_unsetSupportOneHandedModeProperty_shouldDisabled() {
|
||||
SystemProperties.set(OneHandedSettingsUtils.SUPPORT_ONE_HANDED_MODE, "false");
|
||||
OneHandedSettingsUtils.setOneHandedModeEnabled(mContext, true);
|
||||
mUtils.setNavigationBarMode(mContext, "2" /* fully gestural */);
|
||||
|
||||
assertThat(mController.getAvailabilityStatus())
|
||||
.isEqualTo(BasePreferenceController.DISABLED_DEPENDENT_SETTING);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,107 @@
|
||||
/*
|
||||
* Copyright (C) 2021 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.gestures;
|
||||
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
|
||||
import android.content.Context;
|
||||
import android.os.SystemProperties;
|
||||
import android.os.UserHandle;
|
||||
|
||||
import com.android.settings.core.BasePreferenceController;
|
||||
import com.android.settingslib.widget.RadioButtonPreference;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.robolectric.RobolectricTestRunner;
|
||||
import org.robolectric.RuntimeEnvironment;
|
||||
|
||||
@RunWith(RobolectricTestRunner.class)
|
||||
public class OneHandedActionShowNotificationPrefControllerTest {
|
||||
|
||||
private static final String KEY = "gesture_one_handed_action_show_notification";
|
||||
|
||||
private Context mContext;
|
||||
private OneHandedSettingsUtils mUtils;
|
||||
private OneHandedActionShowNotificationPrefController mController;
|
||||
private RadioButtonPreference mPreference;
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
mContext = RuntimeEnvironment.application;
|
||||
mUtils = new OneHandedSettingsUtils(mContext);
|
||||
mController = new OneHandedActionShowNotificationPrefController(mContext, KEY);
|
||||
mPreference = new RadioButtonPreference(mContext);
|
||||
OneHandedSettingsUtils.setUserId(UserHandle.myUserId());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void updateState_setGesturalMode_shouldEnabled() {
|
||||
OneHandedSettingsUtils.setOneHandedModeEnabled(mContext, true);
|
||||
mUtils.setNavigationBarMode(mContext, "2" /* fully gestural */);
|
||||
|
||||
mController.updateState(mPreference);
|
||||
assertThat(mPreference.isEnabled()).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void updateState_ShowNotificationEnabled_shouldChecked() {
|
||||
OneHandedSettingsUtils.setSwipeDownNotificationEnabled(mContext, true);
|
||||
|
||||
mController.updateState(mPreference);
|
||||
assertThat(mPreference.isChecked()).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void updateState_showNotificationDisabled_shouldUnchecked() {
|
||||
OneHandedSettingsUtils.setSwipeDownNotificationEnabled(mContext, false);
|
||||
|
||||
mController.updateState(mPreference);
|
||||
assertThat(mPreference.isChecked()).isFalse();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getAvailabilityStatus_setOneHandedModeDisabled_shouldDisabled() {
|
||||
SystemProperties.set(OneHandedSettingsUtils.SUPPORT_ONE_HANDED_MODE, "true");
|
||||
OneHandedSettingsUtils.setOneHandedModeEnabled(mContext, false);
|
||||
mUtils.setNavigationBarMode(mContext, "2" /* fully gestural */);
|
||||
|
||||
assertThat(mController.getAvailabilityStatus())
|
||||
.isEqualTo(BasePreferenceController.DISABLED_DEPENDENT_SETTING);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getAvailabilityStatus_setNavi3ButtonMode_shouldDisabled() {
|
||||
SystemProperties.set(OneHandedSettingsUtils.SUPPORT_ONE_HANDED_MODE, "true");
|
||||
OneHandedSettingsUtils.setOneHandedModeEnabled(mContext, true);
|
||||
mUtils.setNavigationBarMode(mContext, "0" /* 3 button */);
|
||||
|
||||
assertThat(mController.getAvailabilityStatus())
|
||||
.isEqualTo(BasePreferenceController.DISABLED_DEPENDENT_SETTING);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getAvailabilityStatus_unsetSupportOneHandedModeProperty_shouldDisabled() {
|
||||
SystemProperties.set(OneHandedSettingsUtils.SUPPORT_ONE_HANDED_MODE, "false");
|
||||
OneHandedSettingsUtils.setOneHandedModeEnabled(mContext, true);
|
||||
mUtils.setNavigationBarMode(mContext, "2" /* fully gestural */);
|
||||
|
||||
assertThat(mController.getAvailabilityStatus())
|
||||
.isEqualTo(BasePreferenceController.DISABLED_DEPENDENT_SETTING);
|
||||
}
|
||||
}
|
||||
@@ -21,7 +21,6 @@ import static com.google.common.truth.Truth.assertThat;
|
||||
import android.content.Context;
|
||||
import android.os.SystemProperties;
|
||||
import android.os.UserHandle;
|
||||
import android.provider.Settings;
|
||||
|
||||
import com.android.settings.R;
|
||||
import com.android.settings.core.BasePreferenceController;
|
||||
@@ -47,21 +46,9 @@ public class OneHandedEnablePreferenceControllerTest {
|
||||
OneHandedSettingsUtils.setUserId(UserHandle.myUserId());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void setChecked_setBoolean_checkIsTrueOrFalse() {
|
||||
mController.setChecked(false);
|
||||
assertThat(OneHandedSettingsUtils.isOneHandedModeEnabled(mContext)).isFalse();
|
||||
assertThat(OneHandedSettingsUtils.isSwipeDownNotificationEnabled(mContext)).isTrue();
|
||||
|
||||
mController.setChecked(true);
|
||||
assertThat(OneHandedSettingsUtils.isOneHandedModeEnabled(mContext)).isTrue();
|
||||
assertThat(OneHandedSettingsUtils.isSwipeDownNotificationEnabled(mContext)).isFalse();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getAvailabilityStatus_setSupportOneHandedModeProperty_shouldAvailable() {
|
||||
SystemProperties.set(OneHandedSettingsUtils.SUPPORT_ONE_HANDED_MODE, "true");
|
||||
setNavigationBarMode(mContext, "2" /* fully gestural */);
|
||||
|
||||
assertThat(mController.getAvailabilityStatus())
|
||||
.isEqualTo(BasePreferenceController.AVAILABLE);
|
||||
@@ -70,16 +57,6 @@ public class OneHandedEnablePreferenceControllerTest {
|
||||
@Test
|
||||
public void getAvailabilityStatus_unsetSupportOneHandedModeProperty_shouldUnsupported() {
|
||||
SystemProperties.set(OneHandedSettingsUtils.SUPPORT_ONE_HANDED_MODE, "false");
|
||||
setNavigationBarMode(mContext, "2" /* fully gestural */);
|
||||
|
||||
assertThat(mController.getAvailabilityStatus())
|
||||
.isEqualTo(BasePreferenceController.UNSUPPORTED_ON_DEVICE);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getAvailabilityStatus_set3ButtonModeProperty_shouldUnsupported() {
|
||||
SystemProperties.set(OneHandedSettingsUtils.SUPPORT_ONE_HANDED_MODE, "true");
|
||||
setNavigationBarMode(mContext, "0" /* 3-button */);
|
||||
|
||||
assertThat(mController.getAvailabilityStatus())
|
||||
.isEqualTo(BasePreferenceController.UNSUPPORTED_ON_DEVICE);
|
||||
@@ -100,18 +77,4 @@ public class OneHandedEnablePreferenceControllerTest {
|
||||
assertThat(mController.getSummary())
|
||||
.isEqualTo(mContext.getText(R.string.switch_off_text));
|
||||
}
|
||||
|
||||
/**
|
||||
* Set NavigationBar mode flag to Settings provider.
|
||||
* @param context App context
|
||||
* @param value Navigation bar mode:
|
||||
* 0 = 3 button
|
||||
* 1 = 2 button
|
||||
* 2 = fully gestural
|
||||
* @return true if the value was set, false on database errors.
|
||||
*/
|
||||
private boolean setNavigationBarMode(Context context, String value) {
|
||||
return Settings.Secure.putStringForUser(context.getContentResolver(),
|
||||
Settings.Secure.NAVIGATION_MODE, value, UserHandle.myUserId());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,85 @@
|
||||
/*
|
||||
* Copyright (C) 2021 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.gestures;
|
||||
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
|
||||
import android.content.Context;
|
||||
import android.os.SystemProperties;
|
||||
import android.os.UserHandle;
|
||||
|
||||
import com.android.settings.core.BasePreferenceController;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.robolectric.RobolectricTestRunner;
|
||||
import org.robolectric.RuntimeEnvironment;
|
||||
|
||||
@RunWith(RobolectricTestRunner.class)
|
||||
public class OneHandedMainSwitchPreferenceControllerTest {
|
||||
|
||||
private static final String KEY = "gesture_one_handed_mode_enabled_main_switch";
|
||||
|
||||
private Context mContext;
|
||||
private OneHandedSettingsUtils mUtils;
|
||||
private OneHandedMainSwitchPreferenceController mController;
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
mContext = RuntimeEnvironment.application;
|
||||
mUtils = new OneHandedSettingsUtils(mContext);
|
||||
mController = new OneHandedMainSwitchPreferenceController(mContext, KEY);
|
||||
OneHandedSettingsUtils.setUserId(UserHandle.myUserId());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void setChecked_setBoolean_checkIsTrueOrFalse() {
|
||||
mController.setChecked(false);
|
||||
assertThat(OneHandedSettingsUtils.isOneHandedModeEnabled(mContext)).isFalse();
|
||||
|
||||
mController.setChecked(true);
|
||||
assertThat(OneHandedSettingsUtils.isOneHandedModeEnabled(mContext)).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getAvailabilityStatus_setSupportOneHandedModeProperty_shouldAvailable() {
|
||||
SystemProperties.set(OneHandedSettingsUtils.SUPPORT_ONE_HANDED_MODE, "true");
|
||||
mUtils.setNavigationBarMode(mContext, "2" /* fully gestural */);
|
||||
|
||||
assertThat(mController.getAvailabilityStatus())
|
||||
.isEqualTo(BasePreferenceController.AVAILABLE);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getAvailabilityStatus_unsetSupportOneHandedModeProperty_shouldDisabled() {
|
||||
SystemProperties.set(OneHandedSettingsUtils.SUPPORT_ONE_HANDED_MODE, "false");
|
||||
mUtils.setNavigationBarMode(mContext, "2" /* fully gestural */);
|
||||
|
||||
assertThat(mController.getAvailabilityStatus())
|
||||
.isEqualTo(BasePreferenceController.DISABLED_DEPENDENT_SETTING);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getAvailabilityStatus_set3ButtonMode_shouldDisabled() {
|
||||
SystemProperties.set(OneHandedSettingsUtils.SUPPORT_ONE_HANDED_MODE, "true");
|
||||
mUtils.setNavigationBarMode(mContext, "0" /* 3-button mode */);
|
||||
|
||||
assertThat(mController.getAvailabilityStatus())
|
||||
.isEqualTo(BasePreferenceController.DISABLED_DEPENDENT_SETTING);
|
||||
}
|
||||
}
|
||||
@@ -1,111 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2020 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.gestures;
|
||||
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
|
||||
import android.content.Context;
|
||||
import android.os.UserHandle;
|
||||
|
||||
import androidx.preference.ListPreference;
|
||||
|
||||
import com.android.settings.R;
|
||||
import com.android.settings.core.BasePreferenceController;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.robolectric.RobolectricTestRunner;
|
||||
import org.robolectric.RuntimeEnvironment;
|
||||
|
||||
@RunWith(RobolectricTestRunner.class)
|
||||
public class OneHandedTimeoutPreferenceControllerTest {
|
||||
|
||||
private static final String KEY = "gesture_one_handed_timeout";
|
||||
|
||||
private Context mContext;
|
||||
private OneHandedTimeoutPreferenceController mController;
|
||||
private ListPreference mPreference;
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
mContext = RuntimeEnvironment.application;
|
||||
mController = new OneHandedTimeoutPreferenceController(mContext, KEY);
|
||||
mPreference = new ListPreference(mContext);
|
||||
mPreference.setKey(KEY);
|
||||
OneHandedSettingsUtils.setUserId(UserHandle.myUserId());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getAvailabilityStatus_enabledOneHanded_shouldAvailable() {
|
||||
OneHandedSettingsUtils.setOneHandedModeEnabled(mContext, true);
|
||||
|
||||
assertThat(mController.getAvailabilityStatus())
|
||||
.isEqualTo(BasePreferenceController.AVAILABLE);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getAvailabilityStatus_disableOneHanded_shouldUnavailable() {
|
||||
OneHandedSettingsUtils.setOneHandedModeEnabled(mContext, false);
|
||||
|
||||
assertThat(mController.getAvailabilityStatus())
|
||||
.isEqualTo(BasePreferenceController.DISABLED_DEPENDENT_SETTING);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void updateState_enableOneHanded_switchShouldEnabled() {
|
||||
OneHandedSettingsUtils.setOneHandedModeEnabled(mContext, true);
|
||||
|
||||
mController.updateState(mPreference);
|
||||
|
||||
assertThat(mPreference.isEnabled()).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void updateState_disableOneHanded_switchShouldDisabled() {
|
||||
OneHandedSettingsUtils.setOneHandedModeEnabled(mContext, false);
|
||||
|
||||
mController.updateState(mPreference);
|
||||
|
||||
assertThat(mPreference.isEnabled()).isFalse();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getSummary_setTimeoutNever_shouldReturnNeverSummary() {
|
||||
final String[] timeoutTitles = mContext.getResources().getStringArray(
|
||||
R.array.one_handed_timeout_title);
|
||||
|
||||
OneHandedSettingsUtils.setTimeoutValue(mContext,
|
||||
OneHandedSettingsUtils.OneHandedTimeout.NEVER.getValue());
|
||||
|
||||
assertThat(mController.getSummary()).isEqualTo(
|
||||
timeoutTitles[OneHandedSettingsUtils.OneHandedTimeout.NEVER.ordinal()]);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getSummary_setTimeoutShort_shouldReturnShortSummary() {
|
||||
final String[] timeoutTitles = mContext.getResources().getStringArray(
|
||||
R.array.one_handed_timeout_title);
|
||||
|
||||
OneHandedSettingsUtils.setTimeoutValue(mContext,
|
||||
OneHandedSettingsUtils.OneHandedTimeout.SHORT.getValue());
|
||||
|
||||
assertThat(mController.getSummary()).isEqualTo(String.format(
|
||||
mContext.getResources().getString(R.string.screen_timeout_summary),
|
||||
timeoutTitles[OneHandedSettingsUtils.OneHandedTimeout.SHORT.ordinal()]));
|
||||
}
|
||||
}
|
||||
@@ -1,134 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2020 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.gestures;
|
||||
|
||||
import static com.android.settings.core.BasePreferenceController.AVAILABLE;
|
||||
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
|
||||
import android.content.Context;
|
||||
import android.os.SystemProperties;
|
||||
import android.os.UserHandle;
|
||||
import android.provider.Settings;
|
||||
|
||||
import com.android.settings.R;
|
||||
import com.android.settings.core.BasePreferenceController;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.mockito.Answers;
|
||||
import org.mockito.Mock;
|
||||
import org.mockito.MockitoAnnotations;
|
||||
import org.robolectric.RobolectricTestRunner;
|
||||
|
||||
@RunWith(RobolectricTestRunner.class)
|
||||
public class SwipeBottomToNotificationPreferenceControllerTest {
|
||||
|
||||
private static final String KEY = "gesture_swipe_bottom_to_notification";
|
||||
|
||||
@Mock(answer = Answers.RETURNS_DEEP_STUBS)
|
||||
private Context mContext;
|
||||
|
||||
private SwipeBottomToNotificationPreferenceController mController;
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
MockitoAnnotations.initMocks(this);
|
||||
mController = new SwipeBottomToNotificationPreferenceController(mContext, KEY);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void setChecked_toggledOn_enablesSwipeBottomToNotification() {
|
||||
mController.setChecked(true);
|
||||
|
||||
assertThat(OneHandedSettingsUtils.isSwipeDownNotificationEnabled(mContext)).isTrue();
|
||||
assertThat(OneHandedSettingsUtils.isOneHandedModeEnabled(mContext)).isFalse();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void setChecked_toggledOff_disablesSwipeBottomToNotification() {
|
||||
mController.setChecked(false);
|
||||
|
||||
assertThat(OneHandedSettingsUtils.isSwipeDownNotificationEnabled(mContext)).isFalse();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getAvailabilityStatus_oneHandedUnsupported_returnsUnsupport() {
|
||||
SystemProperties.set(OneHandedSettingsUtils.SUPPORT_ONE_HANDED_MODE, "false");
|
||||
setNavigationBarMode(mContext, "2" /* fully gestural */);
|
||||
|
||||
assertThat(mController.getAvailabilityStatus()).isEqualTo(
|
||||
BasePreferenceController.UNSUPPORTED_ON_DEVICE);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getAvailabilityStatus_oneHandedSupported_returnsAvailable() {
|
||||
SystemProperties.set(OneHandedSettingsUtils.SUPPORT_ONE_HANDED_MODE, "true");
|
||||
setNavigationBarMode(mContext, "2" /* fully gestural */);
|
||||
|
||||
assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getAvailabilityStatus_set3ButtonModeProperty_returnsUnsupport() {
|
||||
SystemProperties.set(OneHandedSettingsUtils.SUPPORT_ONE_HANDED_MODE, "true");
|
||||
setNavigationBarMode(mContext, "0" /* 3-button */);
|
||||
|
||||
assertThat(mController.getAvailabilityStatus())
|
||||
.isEqualTo(BasePreferenceController.UNSUPPORTED_ON_DEVICE);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getSummary_gestureEnabled_returnsOnSummary() {
|
||||
mController.setChecked(true);
|
||||
|
||||
assertThat(mController.getSummary()).isEqualTo(
|
||||
mContext.getText(R.string.gesture_setting_on));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getSummary_gestureDisabled_returnsOffSummary() {
|
||||
mController.setChecked(false);
|
||||
|
||||
assertThat(mController.getSummary()).isEqualTo(
|
||||
mContext.getText(R.string.gesture_setting_off));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void isChecked_getDefaultConfig_returnFalse() {
|
||||
SystemProperties.set(OneHandedSettingsUtils.SUPPORT_ONE_HANDED_MODE, "false");
|
||||
Settings.Secure.resetToDefaults(mContext.getContentResolver(),
|
||||
Settings.Secure.ONE_HANDED_MODE_ENABLED);
|
||||
|
||||
assertThat(mController.isChecked()).isFalse();
|
||||
}
|
||||
|
||||
/**
|
||||
* Set NavigationBar mode flag to Settings provider.
|
||||
* @param context App context
|
||||
* @param value Navigation bar mode:
|
||||
* 0 = 3 button
|
||||
* 1 = 2 button
|
||||
* 2 = fully gestural
|
||||
* @return true if the value was set, false on database errors.
|
||||
*/
|
||||
private boolean setNavigationBarMode(Context context, String value) {
|
||||
return Settings.Secure.putStringForUser(context.getContentResolver(),
|
||||
Settings.Secure.NAVIGATION_MODE, value, UserHandle.myUserId());
|
||||
}
|
||||
}
|
||||
@@ -1,102 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2020 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.gestures;
|
||||
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
|
||||
import android.content.Context;
|
||||
import android.os.SystemProperties;
|
||||
import android.provider.SearchIndexableResource;
|
||||
|
||||
import com.android.settings.R;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.mockito.Answers;
|
||||
import org.mockito.Mock;
|
||||
import org.mockito.MockitoAnnotations;
|
||||
import org.robolectric.RobolectricTestRunner;
|
||||
import org.robolectric.util.ReflectionHelpers;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@RunWith(RobolectricTestRunner.class)
|
||||
public class SwipeBottomToNotificationSettingsTest {
|
||||
@Mock(answer = Answers.RETURNS_DEEP_STUBS)
|
||||
private Context mContext;
|
||||
|
||||
private SwipeBottomToNotificationSettings mSettings = new SwipeBottomToNotificationSettings();
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
MockitoAnnotations.initMocks(this);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getPreferenceScreenResId_shouldReturnsXml() {
|
||||
assertThat(mSettings.getPreferenceScreenResId())
|
||||
.isEqualTo(R.xml.swipe_bottom_to_notification_settings);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void searchIndexProvider_shouldIndexResource() {
|
||||
final List<SearchIndexableResource> indexRes =
|
||||
SwipeBottomToNotificationSettings.SEARCH_INDEX_DATA_PROVIDER.getXmlResourcesToIndex(
|
||||
mContext, true /* enabled */);
|
||||
|
||||
assertThat(indexRes.get(0).xmlResId).isEqualTo(mSettings.getPreferenceScreenResId());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void isPageSearchEnabled_oneHandedUnsupported_shouldReturnFalse() {
|
||||
SystemProperties.set(OneHandedSettingsUtils.SUPPORT_ONE_HANDED_MODE, "false");
|
||||
|
||||
final Object obj = ReflectionHelpers.callInstanceMethod(
|
||||
SwipeBottomToNotificationSettings.SEARCH_INDEX_DATA_PROVIDER, "isPageSearchEnabled",
|
||||
ReflectionHelpers.ClassParameter.from(Context.class, mContext));
|
||||
|
||||
final boolean isEnabled = (Boolean) obj;
|
||||
assertThat(isEnabled).isFalse();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void isPageSearchEnabled_oneHandedDisabled_shouldReturnTrue() {
|
||||
SystemProperties.set(OneHandedSettingsUtils.SUPPORT_ONE_HANDED_MODE, "true");
|
||||
OneHandedSettingsUtils.setOneHandedModeEnabled(mContext, false);
|
||||
|
||||
final Object obj = ReflectionHelpers.callInstanceMethod(
|
||||
SwipeBottomToNotificationSettings.SEARCH_INDEX_DATA_PROVIDER, "isPageSearchEnabled",
|
||||
ReflectionHelpers.ClassParameter.from(Context.class, mContext));
|
||||
|
||||
final boolean isEnabled = (Boolean) obj;
|
||||
assertThat(isEnabled).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void isPageSearchEnabled_oneHandedEnabled_shouldReturnFalse() {
|
||||
SystemProperties.set(OneHandedSettingsUtils.SUPPORT_ONE_HANDED_MODE, "true");
|
||||
OneHandedSettingsUtils.setOneHandedModeEnabled(mContext, true);
|
||||
|
||||
final Object obj = ReflectionHelpers.callInstanceMethod(
|
||||
SwipeBottomToNotificationSettings.SEARCH_INDEX_DATA_PROVIDER, "isPageSearchEnabled",
|
||||
ReflectionHelpers.ClassParameter.from(Context.class, mContext));
|
||||
|
||||
final boolean isEnabled = (Boolean) obj;
|
||||
assertThat(isEnabled).isFalse();
|
||||
}
|
||||
}
|
||||
@@ -1,94 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2020 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.gestures;
|
||||
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
|
||||
import android.content.Context;
|
||||
import android.os.UserHandle;
|
||||
|
||||
import androidx.preference.SwitchPreference;
|
||||
import androidx.test.core.app.ApplicationProvider;
|
||||
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||
|
||||
import com.android.settings.core.TogglePreferenceController;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
|
||||
@RunWith(AndroidJUnit4.class)
|
||||
public class OneHandedAppTapsExitPreferenceControllerTest {
|
||||
|
||||
private static final String KEY = "gesture_app_taps_to_exit";
|
||||
|
||||
private Context mContext;
|
||||
private SwitchPreference mSwitchPreference;
|
||||
private OneHandedAppTapsExitPreferenceController mController;
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
mContext = ApplicationProvider.getApplicationContext();
|
||||
mController = new OneHandedAppTapsExitPreferenceController(mContext, KEY);
|
||||
mSwitchPreference = new SwitchPreference(mContext);
|
||||
mSwitchPreference.setKey(KEY);
|
||||
OneHandedSettingsUtils.setUserId(UserHandle.myUserId());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void setChecked_setBoolean_checkIsTrueOrFalse() {
|
||||
mController.setChecked(false);
|
||||
assertThat(mController.isChecked()).isFalse();
|
||||
|
||||
mController.setChecked(true);
|
||||
assertThat(mController.isChecked()).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getAvailabilityStatus_enabledOneHanded_shouldAvailable() {
|
||||
OneHandedSettingsUtils.setOneHandedModeEnabled(mContext, true);
|
||||
|
||||
assertThat(mController.getAvailabilityStatus())
|
||||
.isEqualTo(TogglePreferenceController.AVAILABLE);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getAvailabilityStatus_disabledOneHanded_shouldUnavailable() {
|
||||
OneHandedSettingsUtils.setOneHandedModeEnabled(mContext, false);
|
||||
|
||||
assertThat(mController.getAvailabilityStatus())
|
||||
.isEqualTo(TogglePreferenceController.DISABLED_DEPENDENT_SETTING);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void updateState_enableOneHanded_switchShouldEnabled() {
|
||||
OneHandedSettingsUtils.setOneHandedModeEnabled(mContext, true);
|
||||
|
||||
mController.updateState(mSwitchPreference);
|
||||
|
||||
assertThat(mSwitchPreference.isEnabled()).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void updateState_disableOneHanded_switchShouldDisabled() {
|
||||
OneHandedSettingsUtils.setOneHandedModeEnabled(mContext, false);
|
||||
|
||||
mController.updateState(mSwitchPreference);
|
||||
|
||||
assertThat(mSwitchPreference.isEnabled()).isFalse();
|
||||
}
|
||||
}
|
||||
@@ -16,8 +16,6 @@
|
||||
|
||||
package com.android.settings.network;
|
||||
|
||||
import static com.android.settings.network.ProviderModelSlice.ACTION_TITLE_CONNECT_TO_CARRIER;
|
||||
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
|
||||
import static org.mockito.ArgumentMatchers.any;
|
||||
@@ -42,6 +40,8 @@ import android.telephony.SubscriptionManager;
|
||||
import android.telephony.TelephonyManager;
|
||||
|
||||
import androidx.slice.Slice;
|
||||
import androidx.slice.SliceItem;
|
||||
import androidx.slice.SliceMetadata;
|
||||
import androidx.slice.SliceProvider;
|
||||
import androidx.slice.builders.ListBuilder;
|
||||
import androidx.slice.builders.SliceAction;
|
||||
@@ -100,8 +100,6 @@ public class ProviderModelSliceTest {
|
||||
ListBuilder.RowBuilder mMockCarrierRowBuild;
|
||||
@Mock
|
||||
WifiPickerTracker mWifiPickerTracker;
|
||||
@Mock
|
||||
WifiSliceItem mWifiSliceItem;
|
||||
|
||||
private FakeFeatureFactory mFeatureFactory;
|
||||
|
||||
@@ -122,7 +120,7 @@ public class ProviderModelSliceTest {
|
||||
when(mContext.getSystemService(TelephonyManager.class)).thenReturn(mTelephonyManager);
|
||||
when(mTelephonyManager.createForSubscriptionId(anyInt())).thenReturn(mTelephonyManager);
|
||||
when(mContext.getSystemService(WifiManager.class)).thenReturn(mWifiManager);
|
||||
|
||||
when(mWifiManager.isWifiEnabled()).thenReturn(true);
|
||||
|
||||
// Set-up specs for SliceMetadata.
|
||||
SliceProvider.setSpecs(SliceLiveData.SUPPORTED_SPECS);
|
||||
@@ -182,7 +180,24 @@ public class ProviderModelSliceTest {
|
||||
|
||||
@Test
|
||||
@UiThreadTest
|
||||
public void getSlice_haveTwoWifiAndOneCarrier_getCarrierAndTwoWiFiAndSeeAll() {
|
||||
public void getSlice_airplaneModeIsOn_oneWifiToggle() {
|
||||
mWifiList.clear();
|
||||
mMockNetworkProviderWorker.updateSelfResults(null);
|
||||
mockHelperCondition(true, false, false, null);
|
||||
|
||||
final Slice slice = mMockProviderModelSlice.getSlice();
|
||||
|
||||
assertThat(slice).isNotNull();
|
||||
verify(mListBuilder, times(1)).addRow(any(ListBuilder.RowBuilder.class));
|
||||
final SliceItem sliceTitle =
|
||||
SliceMetadata.from(mContext, slice).getListContent().getHeader().getTitleItem();
|
||||
assertThat(sliceTitle.getText()).isEqualTo(
|
||||
ResourcesUtils.getResourcesString(mContext, "wifi_settings"));
|
||||
}
|
||||
|
||||
@Test
|
||||
@UiThreadTest
|
||||
public void getSlice_haveTwoWifiAndOneCarrier_getFiveRow() {
|
||||
mWifiList.clear();
|
||||
mockWifiItemCondition(mMockWifiSliceItem1, "wifi1", "wifi1",
|
||||
WifiEntry.CONNECTED_STATE_CONNECTED, "wifi1_key", true);
|
||||
@@ -197,13 +212,13 @@ public class ProviderModelSliceTest {
|
||||
|
||||
assertThat(slice).isNotNull();
|
||||
verify(mListBuilder, times(1)).addRow(mMockCarrierRowBuild);
|
||||
verify(mListBuilder, times(4)).addRow(any(ListBuilder.RowBuilder.class));
|
||||
verify(mListBuilder, times(5)).addRow(any(ListBuilder.RowBuilder.class));
|
||||
assertThat(mMockProviderModelSlice.hasSeeAllRow()).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
@UiThreadTest
|
||||
public void getSlice_haveOneConnectedWifiAndTwoDisconnectedWifiAndNoCarrier_getFourRow() {
|
||||
public void getSlice_haveOneConnectedWifiAndTwoDisconnectedWifiAndNoCarrier_getFiveRow() {
|
||||
mWifiList.clear();
|
||||
mockWifiItemCondition(mMockWifiSliceItem1, "wifi1", "wifi1",
|
||||
WifiEntry.CONNECTED_STATE_CONNECTED, "wifi1_key", true);
|
||||
@@ -220,13 +235,13 @@ public class ProviderModelSliceTest {
|
||||
final Slice slice = mMockProviderModelSlice.getSlice();
|
||||
|
||||
assertThat(slice).isNotNull();
|
||||
verify(mListBuilder, times(4)).addRow(any(ListBuilder.RowBuilder.class));
|
||||
verify(mListBuilder, times(5)).addRow(any(ListBuilder.RowBuilder.class));
|
||||
assertThat(mMockProviderModelSlice.hasSeeAllRow()).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
@UiThreadTest
|
||||
public void getSlice_haveTwoDisconnectedWifiAndNoCarrier_getThreeRow() {
|
||||
public void getSlice_haveTwoDisconnectedWifiAndNoCarrier_getFourRow() {
|
||||
mWifiList.clear();
|
||||
mockWifiItemCondition(mMockWifiSliceItem1, "wifi1", "wifi1",
|
||||
WifiEntry.CONNECTED_STATE_DISCONNECTED, "wifi1_key", true);
|
||||
@@ -240,13 +255,13 @@ public class ProviderModelSliceTest {
|
||||
final Slice slice = mMockProviderModelSlice.getSlice();
|
||||
|
||||
assertThat(slice).isNotNull();
|
||||
verify(mListBuilder, times(3)).addRow(any(ListBuilder.RowBuilder.class));
|
||||
verify(mListBuilder, times(4)).addRow(any(ListBuilder.RowBuilder.class));
|
||||
assertThat(mMockProviderModelSlice.hasSeeAllRow()).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
@UiThreadTest
|
||||
public void getSlice_haveEthernetAndCarrierAndTwoDisconnectedWifi_getFiveRow() {
|
||||
public void getSlice_haveEthernetAndCarrierAndTwoDisconnectedWifi_getSixRow() {
|
||||
mWifiList.clear();
|
||||
mockWifiItemCondition(mMockWifiSliceItem1, "wifi1", "wifi1",
|
||||
WifiEntry.CONNECTED_STATE_DISCONNECTED, "wifi1_key", true);
|
||||
@@ -264,13 +279,13 @@ public class ProviderModelSliceTest {
|
||||
assertThat(slice).isNotNull();
|
||||
assertThat(mMockProviderModelSlice.hasCreateEthernetRow()).isTrue();
|
||||
verify(mListBuilder, times(1)).addRow(mMockCarrierRowBuild);
|
||||
verify(mListBuilder, times(5)).addRow(any(ListBuilder.RowBuilder.class));
|
||||
verify(mListBuilder, times(6)).addRow(any(ListBuilder.RowBuilder.class));
|
||||
assertThat(mMockProviderModelSlice.hasSeeAllRow()).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
@UiThreadTest
|
||||
public void getSlice_haveEthernetAndCarrierAndConnectedWifiAndDisconnectedWifi_getFiveRow() {
|
||||
public void getSlice_haveEthernetAndCarrierAndConnectedWifiAndDisconnectedWifi_getSixRow() {
|
||||
mWifiList.clear();
|
||||
mockWifiItemCondition(mMockWifiSliceItem1, "wifi1", "wifi1",
|
||||
WifiEntry.CONNECTED_STATE_CONNECTED, "wifi1_key", true);
|
||||
@@ -288,7 +303,7 @@ public class ProviderModelSliceTest {
|
||||
assertThat(slice).isNotNull();
|
||||
assertThat(mMockProviderModelSlice.hasCreateEthernetRow()).isTrue();
|
||||
verify(mListBuilder, times(1)).addRow(mMockCarrierRowBuild);
|
||||
verify(mListBuilder, times(5)).addRow(any(ListBuilder.RowBuilder.class));
|
||||
verify(mListBuilder, times(6)).addRow(any(ListBuilder.RowBuilder.class));
|
||||
assertThat(mMockProviderModelSlice.hasSeeAllRow()).isTrue();
|
||||
}
|
||||
|
||||
@@ -380,6 +395,11 @@ public class ProviderModelSliceTest {
|
||||
return super.getSeeAllRow();
|
||||
}
|
||||
|
||||
@Override
|
||||
public ListBuilder.RowBuilder getWifiSliceItemRow(WifiSliceItem wifiSliceItem) {
|
||||
return super.getWifiSliceItemRow(wifiSliceItem);
|
||||
}
|
||||
|
||||
public boolean hasCreateEthernetRow() {
|
||||
return mHasCreateEthernetRow;
|
||||
}
|
||||
@@ -420,29 +440,4 @@ public class ProviderModelSliceTest {
|
||||
|
||||
verify(mMockNetworkProviderWorker, never()).connectCarrierNetwork();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getWifiSliceItemRow_wifiNoInternetAccess_actionConnectToWifiSsid() {
|
||||
when(mWifiSliceItem.getKey()).thenReturn("wifi_key");
|
||||
when(mWifiSliceItem.getTitle()).thenReturn("wifi_ssid");
|
||||
when(mWifiSliceItem.hasInternetAccess()).thenReturn(false);
|
||||
|
||||
ListBuilder.RowBuilder rowBuilder =
|
||||
mMockProviderModelSlice.getWifiSliceItemRow(mWifiSliceItem);
|
||||
|
||||
assertThat(rowBuilder.getPrimaryAction().getTitle())
|
||||
.isEqualTo("wifi_ssid");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getWifiSliceItemRow_wifiHasInternetAccess_actionConnectToCarrier() {
|
||||
when(mWifiSliceItem.getTitle()).thenReturn("wifi_ssid");
|
||||
when(mWifiSliceItem.hasInternetAccess()).thenReturn(true);
|
||||
|
||||
ListBuilder.RowBuilder rowBuilder =
|
||||
mMockProviderModelSlice.getWifiSliceItemRow(mWifiSliceItem);
|
||||
|
||||
assertThat(rowBuilder.getPrimaryAction().getTitle())
|
||||
.isEqualTo(ACTION_TITLE_CONNECT_TO_CARRIER);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -18,12 +18,9 @@ package com.android.settings.panel;
|
||||
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
|
||||
import static org.mockito.ArgumentMatchers.any;
|
||||
import static org.mockito.ArgumentMatchers.anyLong;
|
||||
import static org.mockito.Mockito.clearInvocations;
|
||||
import static org.mockito.Mockito.doReturn;
|
||||
import static org.mockito.Mockito.mock;
|
||||
import static org.mockito.Mockito.never;
|
||||
import static org.mockito.Mockito.spy;
|
||||
import static org.mockito.Mockito.verify;
|
||||
import static org.mockito.Mockito.when;
|
||||
@@ -32,9 +29,7 @@ import android.content.Context;
|
||||
import android.net.Uri;
|
||||
import android.net.wifi.ScanResult;
|
||||
import android.net.wifi.WifiManager;
|
||||
import android.os.Handler;
|
||||
|
||||
import androidx.fragment.app.FragmentActivity;
|
||||
import androidx.test.core.app.ApplicationProvider;
|
||||
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||
|
||||
@@ -82,8 +77,6 @@ public class InternetConnectivityPanelTest {
|
||||
@Rule
|
||||
public final MockitoRule mMocks = MockitoJUnit.rule();
|
||||
@Mock
|
||||
Handler mMainThreadHandler;
|
||||
@Mock
|
||||
PanelContentCallback mPanelContentCallback;
|
||||
@Mock
|
||||
InternetUpdater mInternetUpdater;
|
||||
@@ -91,17 +84,34 @@ public class InternetConnectivityPanelTest {
|
||||
private WifiManager mWifiManager;
|
||||
@Mock
|
||||
private ProviderModelSliceHelper mProviderModelSliceHelper;
|
||||
@Mock
|
||||
private FragmentActivity mPanelActivity;
|
||||
|
||||
private Context mContext;
|
||||
private FakeHandlerInjector mFakeHandlerInjector;
|
||||
private InternetConnectivityPanel mPanel;
|
||||
|
||||
private class FakeHandlerInjector extends InternetConnectivityPanel.HandlerInjector {
|
||||
|
||||
private Runnable mRunnable;
|
||||
|
||||
FakeHandlerInjector(Context context) {
|
||||
super(context);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void postDelay(Runnable runnable) {
|
||||
mRunnable = runnable;
|
||||
}
|
||||
|
||||
public Runnable getRunnable() {
|
||||
return mRunnable;
|
||||
}
|
||||
}
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
mContext = spy(ApplicationProvider.getApplicationContext());
|
||||
mFakeHandlerInjector = new FakeHandlerInjector(mContext);
|
||||
when(mContext.getApplicationContext()).thenReturn(mContext);
|
||||
when(mContext.getMainThreadHandler()).thenReturn(mMainThreadHandler);
|
||||
when(mContext.getSystemService(WifiManager.class)).thenReturn(mWifiManager);
|
||||
|
||||
mPanel = InternetConnectivityPanel.create(mContext);
|
||||
@@ -109,6 +119,7 @@ public class InternetConnectivityPanelTest {
|
||||
mPanel.mIsProviderModelEnabled = true;
|
||||
mPanel.mInternetUpdater = mInternetUpdater;
|
||||
mPanel.mProviderModelSliceHelper = mProviderModelSliceHelper;
|
||||
mPanel.mHandlerInjector = mFakeHandlerInjector;
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -203,20 +214,6 @@ public class InternetConnectivityPanelTest {
|
||||
assertThat(mPanel.getSubTitle()).isEqualTo(SUBTITLE_TEXT_TAP_A_NETWORK_TO_CONNECT);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getCustomizedButtonTitle_wifiOff_turnOnWifi() {
|
||||
doReturn(false).when(mInternetUpdater).isWifiEnabled();
|
||||
|
||||
assertThat(mPanel.getCustomizedButtonTitle()).isEqualTo(BUTTON_TURN_ON_WIFI);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getCustomizedButtonTitle_wifiOn_turnOffWifi() {
|
||||
doReturn(true).when(mInternetUpdater).isWifiEnabled();
|
||||
|
||||
assertThat(mPanel.getCustomizedButtonTitle()).isEqualTo(BUTTON_TURN_OFF_WIFI);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getSlices_providerModelDisabled_containsNecessarySlices() {
|
||||
mPanel.mIsProviderModelEnabled = false;
|
||||
@@ -240,31 +237,6 @@ public class InternetConnectivityPanelTest {
|
||||
assertThat(mPanel.getSeeMoreIntent()).isNull();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void onClickCustomizedButton_wifiOn_setWifiOff() {
|
||||
doReturn(true).when(mInternetUpdater).isWifiEnabled();
|
||||
|
||||
mPanel.onClickCustomizedButton(mPanelActivity);
|
||||
|
||||
verify(mWifiManager).setWifiEnabled(false);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void onClickCustomizedButton_wifiOff_setWifiOn() {
|
||||
doReturn(false).when(mInternetUpdater).isWifiEnabled();
|
||||
|
||||
mPanel.onClickCustomizedButton(mPanelActivity);
|
||||
|
||||
verify(mWifiManager).setWifiEnabled(true);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void onClickCustomizedButton_shouldNotFinishActivity() {
|
||||
mPanel.onClickCustomizedButton(mPanelActivity);
|
||||
|
||||
verify(mPanelActivity, never()).finish();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void updatePanelTitle_onHeaderChanged() {
|
||||
clearInvocations(mPanelContentCallback);
|
||||
@@ -295,36 +267,41 @@ public class InternetConnectivityPanelTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void showProgressBar_wifiDisabled_hideProgress() {
|
||||
public void updateProgressBar_wifiDisabled_hideProgress() {
|
||||
mPanel.mIsProgressBarVisible = true;
|
||||
doReturn(false).when(mInternetUpdater).isWifiEnabled();
|
||||
clearInvocations(mPanelContentCallback);
|
||||
|
||||
mPanel.showProgressBar();
|
||||
mPanel.updateProgressBar();
|
||||
|
||||
assertThat(mPanel.isProgressBarVisible()).isFalse();
|
||||
verify(mPanelContentCallback).onProgressBarVisibleChanged();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void showProgressBar_noWifiScanResults_showProgressForever() {
|
||||
public void updateProgressBar_noWifiScanResults_showProgressForever() {
|
||||
mPanel.mIsScanningSubTitleShownOnce = false;
|
||||
mPanel.mIsProgressBarVisible = false;
|
||||
doReturn(true).when(mInternetUpdater).isWifiEnabled();
|
||||
List<ScanResult> noWifiScanResults = new ArrayList<>();
|
||||
doReturn(noWifiScanResults).when(mWifiManager).getScanResults();
|
||||
clearInvocations(mPanelContentCallback);
|
||||
|
||||
mPanel.showProgressBar();
|
||||
mPanel.updateProgressBar();
|
||||
|
||||
assertThat(mPanel.isProgressBarVisible()).isTrue();
|
||||
assertThat(mPanel.mIsProgressBarVisible).isTrue();
|
||||
verify(mPanelContentCallback).onProgressBarVisibleChanged();
|
||||
verify(mPanelContentCallback).onHeaderChanged();
|
||||
verify(mMainThreadHandler, never())
|
||||
.postDelayed(any() /* mHideProgressBarRunnable */, anyLong());
|
||||
|
||||
assertThat(mFakeHandlerInjector.getRunnable())
|
||||
.isEqualTo(mPanel.mHideScanningSubTitleRunnable);
|
||||
mFakeHandlerInjector.getRunnable().run();
|
||||
assertThat(mPanel.mIsScanningSubTitleShownOnce).isTrue();
|
||||
assertThat(mPanel.mIsProgressBarVisible).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void showProgressBar_hasWifiScanResults_showProgressDelayedHide() {
|
||||
public void updateProgressBar_hasWifiScanResults_showProgressDelayedHide() {
|
||||
mPanel.mIsProgressBarVisible = false;
|
||||
doReturn(true).when(mInternetUpdater).isWifiEnabled();
|
||||
List<ScanResult> hasWifiScanResults = mock(ArrayList.class);
|
||||
@@ -332,11 +309,15 @@ public class InternetConnectivityPanelTest {
|
||||
doReturn(hasWifiScanResults).when(mWifiManager).getScanResults();
|
||||
clearInvocations(mPanelContentCallback);
|
||||
|
||||
mPanel.showProgressBar();
|
||||
mPanel.updateProgressBar();
|
||||
|
||||
assertThat(mPanel.isProgressBarVisible()).isTrue();
|
||||
verify(mPanelContentCallback).onProgressBarVisibleChanged();
|
||||
verify(mMainThreadHandler).postDelayed(any() /* mHideProgressBarRunnable */, anyLong());
|
||||
|
||||
assertThat(mFakeHandlerInjector.getRunnable())
|
||||
.isEqualTo(mPanel.mHideProgressBarRunnable);
|
||||
mFakeHandlerInjector.getRunnable().run();
|
||||
assertThat(mPanel.mIsProgressBarVisible).isFalse();
|
||||
}
|
||||
|
||||
@Test
|
||||
|
||||
Reference in New Issue
Block a user