Add progressive disclsoure

- Add a ProgressiveDisclosureMixin that contains all logic for collapse
  preference list when it's too long
- Refactored PreferenceController's updateState to take a preference
  instead of PreferenceScreen, because with progressive disclosure the
  preference can either be in screen or the mixin. DashboardFragment is
  responsible finding the preference before passing it to controller.

Bug: 32255863
Test: RunSettingsRoboTests

Change-Id: I6713abd61c954ce12732902e5b3ca4d4c0b1563e
This commit is contained in:
Fan Zhang
2016-10-18 12:58:31 -07:00
parent a5c421083a
commit db1112a221
34 changed files with 524 additions and 127 deletions

View File

@@ -0,0 +1,32 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (C) 2016 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.
-->
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/selectable_card_grey"
android:gravity="center_vertical"
android:minHeight="?android:attr/listPreferredItemHeight"
android:orientation="vertical"
android:paddingEnd="?android:attr/scrollbarSize">
<TextView
android:id="@android:id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"/>
</LinearLayout>

View File

@@ -50,7 +50,8 @@ public abstract class PreferenceController {
/** /**
* Updates the current status of preference (summary, switch state, etc) * Updates the current status of preference (summary, switch state, etc)
*/ */
public void updateState(PreferenceScreen screen) { public void updateState(Preference preference) {
} }
/** /**
@@ -72,6 +73,11 @@ public abstract class PreferenceController {
*/ */
public abstract boolean handlePreferenceTreeClick(Preference preference); public abstract boolean handlePreferenceTreeClick(Preference preference);
/**
* Returns the key for this preference.
*/
public abstract String getPreferenceKey();
/** /**
* Removes preference from screen. * Removes preference from screen.
*/ */
@@ -86,10 +92,4 @@ public abstract class PreferenceController {
* Returns true if preference is available (should be displayed) * Returns true if preference is available (should be displayed)
*/ */
protected abstract boolean isAvailable(); protected abstract boolean isAvailable();
/**
* Returns the key for this preference.
*/
protected abstract String getPreferenceKey();
} }

View File

@@ -42,8 +42,8 @@ public abstract class ObservablePreferenceFragment extends PreferenceFragment {
@CallSuper @CallSuper
@Override @Override
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mLifecycle.onCreate(savedInstanceState); mLifecycle.onCreate(savedInstanceState);
super.onCreate(savedInstanceState);
} }
@CallSuper @CallSuper

View File

@@ -52,12 +52,14 @@ import java.util.Set;
public abstract class DashboardFragment extends SettingsPreferenceFragment public abstract class DashboardFragment extends SettingsPreferenceFragment
implements SettingsDrawerActivity.CategoryListener, Indexable, implements SettingsDrawerActivity.CategoryListener, Indexable,
SummaryLoader.SummaryConsumer { SummaryLoader.SummaryConsumer {
private static final String TAG = "DashboardFragment";
private final Map<Class, PreferenceController> mPreferenceControllers = private final Map<Class, PreferenceController> mPreferenceControllers =
new ArrayMap<>(); new ArrayMap<>();
private final Set<String> mDashboardTilePrefKeys = new ArraySet<>(); private final Set<String> mDashboardTilePrefKeys = new ArraySet<>();
private DashboardDividerDecoration mDividerDecoration; private DashboardDividerDecoration mDividerDecoration;
protected ProgressiveDisclosureMixin mProgressiveDisclosureMixin;
protected DashboardFeatureProvider mDashboardFeatureProvider; protected DashboardFeatureProvider mDashboardFeatureProvider;
private boolean mListeningToCategoryChange; private boolean mListeningToCategoryChange;
private SummaryLoader mSummaryLoader; private SummaryLoader mSummaryLoader;
@@ -67,6 +69,8 @@ public abstract class DashboardFragment extends SettingsPreferenceFragment
super.onAttach(context); super.onAttach(context);
mDashboardFeatureProvider = mDashboardFeatureProvider =
FeatureFactory.getFactory(context).getDashboardFeatureProvider(context); FeatureFactory.getFactory(context).getDashboardFeatureProvider(context);
mProgressiveDisclosureMixin = new ProgressiveDisclosureMixin(context, this);
getLifecycle().addObserver(mProgressiveDisclosureMixin);
final List<PreferenceController> controllers = getPreferenceControllers(context); final List<PreferenceController> controllers = getPreferenceControllers(context);
if (controllers == null) { if (controllers == null) {
@@ -160,6 +164,18 @@ public abstract class DashboardFragment extends SettingsPreferenceFragment
} }
} }
@Override
public Preference findPreference(CharSequence key) {
Preference preference = super.findPreference(key);
if (preference == null && mProgressiveDisclosureMixin != null) {
preference = mProgressiveDisclosureMixin.findPreference(key);
}
if (preference == null) {
Log.d(TAG, "Cannot find preference with key " + key);
}
return preference;
}
protected <T extends PreferenceController> T getPreferenceController(Class<T> clazz) { protected <T extends PreferenceController> T getPreferenceController(Class<T> clazz) {
PreferenceController controller = mPreferenceControllers.get(clazz); PreferenceController controller = mPreferenceControllers.get(clazz);
return (T) controller; return (T) controller;
@@ -259,9 +275,21 @@ public abstract class DashboardFragment extends SettingsPreferenceFragment
// (larger value has higher priority). However pref order defines smaller value has // (larger value has higher priority). However pref order defines smaller value has
// higher priority. // higher priority.
pref.setOrder(-tile.priority); pref.setOrder(-tile.priority);
// Either add to screen, or to collapsed list.
if (mProgressiveDisclosureMixin.isCollapsed()) {
// Already collapsed, add to collapsed list.
mProgressiveDisclosureMixin.addToCollapsedList(pref);
} else if (mProgressiveDisclosureMixin.shouldCollapse(screen)) {
// About to have too many tiles on scree, collapse and add pref to collapsed list.
mProgressiveDisclosureMixin.collapse(screen);
mProgressiveDisclosureMixin.addToCollapsedList(pref);
} else {
// No need to collapse, add to screen directly.
screen.addPreference(pref); screen.addPreference(pref);
} }
} }
}
@Override @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, public View onCreateView(LayoutInflater inflater, ViewGroup container,
@@ -278,9 +306,15 @@ public abstract class DashboardFragment extends SettingsPreferenceFragment
*/ */
private void updatePreferenceStates() { private void updatePreferenceStates() {
Collection<PreferenceController> controllers = mPreferenceControllers.values(); Collection<PreferenceController> controllers = mPreferenceControllers.values();
final PreferenceScreen screen = getPreferenceScreen();
for (PreferenceController controller : controllers) { for (PreferenceController controller : controllers) {
controller.updateState(screen); final String key = controller.getPreferenceKey();
final Preference preference = findPreference(key);
if (preference == null) {
Log.d(TAG, "Cannot find preference with key " + key);
continue;
}
controller.updateState(preference);
} }
} }
@@ -302,15 +336,20 @@ public abstract class DashboardFragment extends SettingsPreferenceFragment
*/ */
private void refreshAllPreferences(final String TAG) { private void refreshAllPreferences(final String TAG) {
// First remove old preferences. // First remove old preferences.
final PreferenceScreen screen = getPreferenceScreen(); if (getPreferenceScreen() != null) {
if (screen != null) { // Intentionally do not cache PreferenceScreen because it will be recreated later.
screen.removeAll(); getPreferenceScreen().removeAll();
} }
// Add resource based tiles. // Add resource based tiles.
displayResourceTiles(); displayResourceTiles();
refreshDashboardTiles(TAG); refreshDashboardTiles(TAG);
if (!mProgressiveDisclosureMixin.isCollapsed()
&& mProgressiveDisclosureMixin.shouldCollapse(getPreferenceScreen())) {
mProgressiveDisclosureMixin.collapse(getPreferenceScreen());
}
} }
/** /**
@@ -319,10 +358,13 @@ public abstract class DashboardFragment extends SettingsPreferenceFragment
private void refreshDashboardTiles(final String TAG) { private void refreshDashboardTiles(final String TAG) {
final PreferenceScreen screen = getPreferenceScreen(); final PreferenceScreen screen = getPreferenceScreen();
for (String key : mDashboardTilePrefKeys) { for (String key : mDashboardTilePrefKeys) {
// Remove tiles from screen
final Preference pref = screen.findPreference(key); final Preference pref = screen.findPreference(key);
if (pref != null) { if (pref != null) {
screen.removePreference(pref); screen.removePreference(pref);
} }
// Also remove tile from collapsed set
mProgressiveDisclosureMixin.removePreference(screen, key);
} }
mDashboardTilePrefKeys.clear(); mDashboardTilePrefKeys.clear();
displayDashboardTiles(TAG, getPreferenceScreen()); displayDashboardTiles(TAG, getPreferenceScreen());

View File

@@ -0,0 +1,53 @@
/*
* Copyright (C) 2016 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.dashboard;
import android.content.Context;
import android.support.v7.preference.Preference;
import android.util.AttributeSet;
import com.android.settings.R;
public class ExpandPreference extends Preference {
public ExpandPreference(Context context, AttributeSet attrs,
int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
init();
}
public ExpandPreference(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
public ExpandPreference(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public ExpandPreference(Context context) {
super(context);
init();
}
private void init() {
setLayoutResource(R.layout.expand_preference);
setTitle(R.string.wifi_more);
setOrder(999);
}
}

View File

@@ -0,0 +1,168 @@
/*
* Copyright (C) 2016 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.dashboard;
import android.content.Context;
import android.os.Bundle;
import android.support.v14.preference.PreferenceFragment;
import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceScreen;
import android.text.TextUtils;
import android.util.Log;
import com.android.settings.core.lifecycle.LifecycleObserver;
import com.android.settings.core.lifecycle.events.OnCreate;
import com.android.settings.core.lifecycle.events.OnSaveInstanceState;
import com.android.settings.overlay.FeatureFactory;
import java.util.ArrayList;
import java.util.List;
public class ProgressiveDisclosureMixin implements Preference.OnPreferenceClickListener,
LifecycleObserver, OnCreate, OnSaveInstanceState {
private static final String TAG = "ProgressiveDisclosure";
private static final String STATE_USER_EXPANDED = "state_user_expanded";
private static final int DEFAULT_TILE_LIMIT = 3;
private int mTileLimit = DEFAULT_TILE_LIMIT;
private final DashboardFeatureProvider mDashboardFeatureProvider;
private final List<Preference> collapsedPrefs = new ArrayList<>();
private final ExpandPreference mExpandButton;
private final PreferenceFragment mFragment;
private boolean mUserExpanded;
public ProgressiveDisclosureMixin(Context context, PreferenceFragment fragment) {
mFragment = fragment;
mExpandButton = new ExpandPreference(context);
mExpandButton.setOnPreferenceClickListener(this);
mDashboardFeatureProvider = FeatureFactory.getFactory(context)
.getDashboardFeatureProvider(context);
}
@Override
public void onCreate(Bundle savedInstanceState) {
if (savedInstanceState != null) {
mUserExpanded = savedInstanceState.getBoolean(STATE_USER_EXPANDED, false);
}
}
@Override
public void onSaveInstanceState(Bundle outState) {
outState.putBoolean(STATE_USER_EXPANDED, mUserExpanded);
}
@Override
public boolean onPreferenceClick(Preference preference) {
if (preference instanceof ExpandPreference) {
final PreferenceScreen screen = mFragment.getPreferenceScreen();
if (screen != null) {
screen.removePreference(preference);
for (Preference pref : collapsedPrefs) {
screen.addPreference(pref);
}
mUserExpanded = true;
}
}
return false;
}
/**
* Sets the threshold to start collapsing preferences when there are too many.
*/
public void setTileLimit(int limit) {
mTileLimit = limit;
}
/**
* Whether the controller is in collapsed state.
*/
public boolean isCollapsed() {
return !collapsedPrefs.isEmpty();
}
/**
* Whether the screen should be collapsed.
*/
public boolean shouldCollapse(PreferenceScreen screen) {
return mDashboardFeatureProvider.isEnabled() && screen.getPreferenceCount() >= mTileLimit
&& !mUserExpanded;
}
/**
* Collapse extra preferences and show a "More" button
*/
public void collapse(PreferenceScreen screen) {
final int itemCount = screen.getPreferenceCount();
if (!shouldCollapse(screen)) {
return;
}
if (!collapsedPrefs.isEmpty()) {
Log.w(TAG, "collapsed list should ALWAYS BE EMPTY before collapsing!");
}
for (int i = itemCount - 1; i >= mTileLimit; i--) {
final Preference preference = screen.getPreference(i);
addToCollapsedList(preference);
screen.removePreference(preference);
}
screen.addPreference(mExpandButton);
}
/**
* Add preference to collapsed list.
*/
public void addToCollapsedList(Preference preference) {
collapsedPrefs.add(preference);
}
/**
* Remove preference from collapsed list. If the preference is not in list, do nothing.
*/
public void removePreference(PreferenceScreen screen, String key) {
if (!isCollapsed()) {
return;
}
for (int i = 0; i < collapsedPrefs.size(); i++) {
final Preference pref = collapsedPrefs.get(i);
if (TextUtils.equals(key, pref.getKey())) {
collapsedPrefs.remove(pref);
if (collapsedPrefs.isEmpty()) {
// Removed last element, remove expand button too.
screen.removePreference(mExpandButton);
}
return;
}
}
}
/**
* Find whether a preference is in collapsed list.
*/
public Preference findPreference(CharSequence key) {
for (int i = 0; i < collapsedPrefs.size(); i++) {
final Preference pref = collapsedPrefs.get(i);
if (TextUtils.equals(key, pref.getKey())) {
return pref;
}
}
return null;
}
}

View File

@@ -40,7 +40,7 @@ public class AdditionalSystemUpdatePreferenceController extends PreferenceContro
} }
@Override @Override
protected String getPreferenceKey() { public String getPreferenceKey() {
return KEY_UPDATE_SETTING; return KEY_UPDATE_SETTING;
} }
} }

View File

@@ -33,7 +33,7 @@ public class ManageStoragePreferenceController extends PreferenceController {
} }
@Override @Override
protected String getPreferenceKey() { public String getPreferenceKey() {
return KEY_MANAGE_STORAGE; return KEY_MANAGE_STORAGE;
} }

View File

@@ -51,7 +51,7 @@ public class SystemUpdatePreferenceController extends PreferenceController {
} }
@Override @Override
protected String getPreferenceKey() { public String getPreferenceKey() {
return KEY_SYSTEM_UPDATE_SETTINGS; return KEY_SYSTEM_UPDATE_SETTINGS;
} }

View File

@@ -17,7 +17,6 @@ import android.content.Context;
import android.provider.Settings; import android.provider.Settings;
import android.support.v14.preference.SwitchPreference; import android.support.v14.preference.SwitchPreference;
import android.support.v7.preference.Preference; import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceScreen;
import com.android.settings.core.PreferenceController; import com.android.settings.core.PreferenceController;
@@ -42,7 +41,7 @@ public class AutoBrightnessPreferenceController extends PreferenceController imp
} }
@Override @Override
protected String getPreferenceKey() { public String getPreferenceKey() {
return KEY_AUTO_BRIGHTNESS; return KEY_AUTO_BRIGHTNESS;
} }
@@ -52,15 +51,10 @@ public class AutoBrightnessPreferenceController extends PreferenceController imp
} }
@Override @Override
public void updateState(PreferenceScreen screen) { public void updateState(Preference preference) {
final SwitchPreference preference =
(SwitchPreference) screen.findPreference(KEY_AUTO_BRIGHTNESS);
if (preference == null) {
return;
}
int brightnessMode = Settings.System.getInt(mContext.getContentResolver(), int brightnessMode = Settings.System.getInt(mContext.getContentResolver(),
SCREEN_BRIGHTNESS_MODE, SCREEN_BRIGHTNESS_MODE_MANUAL); SCREEN_BRIGHTNESS_MODE, SCREEN_BRIGHTNESS_MODE_MANUAL);
preference.setChecked(brightnessMode != SCREEN_BRIGHTNESS_MODE_MANUAL); ((SwitchPreference) preference).setChecked(brightnessMode != SCREEN_BRIGHTNESS_MODE_MANUAL);
} }
@Override @Override

View File

@@ -17,7 +17,6 @@ import android.content.Context;
import android.content.res.Configuration; import android.content.res.Configuration;
import android.support.v7.preference.DropDownPreference; import android.support.v7.preference.DropDownPreference;
import android.support.v7.preference.Preference; import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceScreen;
import com.android.internal.logging.MetricsProto; import com.android.internal.logging.MetricsProto;
import com.android.internal.view.RotationPolicy; import com.android.internal.view.RotationPolicy;
@@ -38,14 +37,13 @@ public class AutoRotatePreferenceController extends PreferenceController impleme
} }
@Override @Override
protected String getPreferenceKey() { public String getPreferenceKey() {
return KEY_AUTO_ROTATE; return KEY_AUTO_ROTATE;
} }
@Override @Override
public void updateState(PreferenceScreen screen) { public void updateState(Preference preference) {
final DropDownPreference rotatePreference = final DropDownPreference rotatePreference = (DropDownPreference) preference;
(DropDownPreference) screen.findPreference(KEY_AUTO_ROTATE);
final int rotateLockedResourceId; final int rotateLockedResourceId;
// The following block sets the string used when rotation is locked. // The following block sets the string used when rotation is locked.
// If the device locks specifically to portrait or landscape (rather than current // If the device locks specifically to portrait or landscape (rather than current
@@ -69,7 +67,6 @@ public class AutoRotatePreferenceController extends PreferenceController impleme
1 : 0); 1 : 0);
} }
@Override @Override
public boolean handlePreferenceTreeClick(Preference preference) { public boolean handlePreferenceTreeClick(Preference preference) {
return false; return false;

View File

@@ -18,7 +18,6 @@ import android.os.SystemProperties;
import android.provider.Settings; import android.provider.Settings;
import android.support.v14.preference.SwitchPreference; import android.support.v14.preference.SwitchPreference;
import android.support.v7.preference.Preference; import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceScreen;
import com.android.settings.core.PreferenceController; import com.android.settings.core.PreferenceController;
@@ -34,7 +33,7 @@ public class CameraGesturePreferenceController extends PreferenceController impl
} }
@Override @Override
protected String getPreferenceKey() { public String getPreferenceKey() {
return KEY_CAMERA_GESTURE; return KEY_CAMERA_GESTURE;
} }
@@ -44,14 +43,10 @@ public class CameraGesturePreferenceController extends PreferenceController impl
} }
@Override @Override
public void updateState(PreferenceScreen screen) { public void updateState(Preference preference) {
final SwitchPreference preference =
(SwitchPreference) screen.findPreference(KEY_CAMERA_GESTURE);
if (preference != null) {
int value = Settings.Secure.getInt(mContext.getContentResolver(), int value = Settings.Secure.getInt(mContext.getContentResolver(),
CAMERA_GESTURE_DISABLED, 0); CAMERA_GESTURE_DISABLED, 0);
preference.setChecked(value == 0); ((SwitchPreference) preference).setChecked(value == 0);
}
} }
@Override @Override

View File

@@ -19,7 +19,6 @@ import android.os.SystemProperties;
import android.provider.Settings; import android.provider.Settings;
import android.support.v14.preference.SwitchPreference; import android.support.v14.preference.SwitchPreference;
import android.support.v7.preference.Preference; import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceScreen;
import android.text.TextUtils; import android.text.TextUtils;
import com.android.settings.core.PreferenceController; import com.android.settings.core.PreferenceController;
@@ -42,7 +41,7 @@ public class DozePreferenceController extends PreferenceController implements
} }
@Override @Override
protected String getPreferenceKey() { public String getPreferenceKey() {
return KEY_DOZE; return KEY_DOZE;
} }
@@ -55,13 +54,9 @@ public class DozePreferenceController extends PreferenceController implements
} }
@Override @Override
public void updateState(PreferenceScreen screen) { public void updateState(Preference preference) {
final SwitchPreference preference = (SwitchPreference) screen.findPreference(KEY_DOZE);
// Update doze if it is available.
if (preference != null) {
int value = Settings.Secure.getInt(mContext.getContentResolver(), DOZE_ENABLED, 1); int value = Settings.Secure.getInt(mContext.getContentResolver(), DOZE_ENABLED, 1);
preference.setChecked(value != 0); ((SwitchPreference) preference).setChecked(value != 0);
}
} }
@Override @Override

View File

@@ -17,7 +17,6 @@ import android.content.Context;
import android.content.res.Resources; import android.content.res.Resources;
import android.provider.Settings; import android.provider.Settings;
import android.support.v7.preference.Preference; import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceScreen;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.accessibility.ToggleFontSizePreferenceFragment; import com.android.settings.accessibility.ToggleFontSizePreferenceFragment;
@@ -37,16 +36,12 @@ public class FontSizePreferenceController extends PreferenceController {
} }
@Override @Override
protected String getPreferenceKey() { public String getPreferenceKey() {
return KEY_FONT_SIZE; return KEY_FONT_SIZE;
} }
@Override @Override
public void updateState(PreferenceScreen screen) { public void updateState(Preference preference) {
final Preference preference = screen.findPreference(KEY_FONT_SIZE);
if (preference == null) {
return;
}
final float currentScale = Settings.System.getFloat(mContext.getContentResolver(), final float currentScale = Settings.System.getFloat(mContext.getContentResolver(),
Settings.System.FONT_SCALE, 1.0f); Settings.System.FONT_SCALE, 1.0f);
final Resources res = mContext.getResources(); final Resources res = mContext.getResources();

View File

@@ -19,7 +19,6 @@ import android.hardware.SensorManager;
import android.provider.Settings; import android.provider.Settings;
import android.support.v14.preference.SwitchPreference; import android.support.v14.preference.SwitchPreference;
import android.support.v7.preference.Preference; import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceScreen;
import com.android.settings.core.PreferenceController; import com.android.settings.core.PreferenceController;
@@ -41,7 +40,7 @@ public class LiftToWakePreferenceController extends PreferenceController impleme
} }
@Override @Override
protected String getPreferenceKey() { public String getPreferenceKey() {
return KEY_LIFT_TO_WAKE; return KEY_LIFT_TO_WAKE;
} }
@@ -58,13 +57,8 @@ public class LiftToWakePreferenceController extends PreferenceController impleme
} }
@Override @Override
public void updateState(PreferenceScreen screen) { public void updateState(Preference preference) {
final SwitchPreference pref = (SwitchPreference) screen.findPreference(KEY_LIFT_TO_WAKE); int value = Settings.Secure.getInt(mContext.getContentResolver(), WAKE_GESTURE_ENABLED, 0);
// Update lift-to-wake if it is available. ((SwitchPreference) preference).setChecked(value != 0);
if (pref != null) {
int value =
Settings.Secure.getInt(mContext.getContentResolver(), WAKE_GESTURE_ENABLED, 0);
pref.setChecked(value != 0);
}
} }
} }

View File

@@ -38,7 +38,7 @@ public class NightDisplayPreferenceController extends PreferenceController {
} }
@Override @Override
protected String getPreferenceKey() { public String getPreferenceKey() {
return KEY_NIGHT_DISPLAY; return KEY_NIGHT_DISPLAY;
} }
} }

View File

@@ -40,7 +40,7 @@ public class NightModePreferenceController extends PreferenceController
} }
@Override @Override
protected String getPreferenceKey() { public String getPreferenceKey() {
return KEY_NIGHT_MODE; return KEY_NIGHT_MODE;
} }

View File

@@ -15,7 +15,6 @@ package com.android.settings.display;
import android.content.Context; import android.content.Context;
import android.support.v7.preference.Preference; import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceScreen;
import com.android.settings.DreamSettings; import com.android.settings.DreamSettings;
import com.android.settings.core.PreferenceController; import com.android.settings.core.PreferenceController;
@@ -35,7 +34,7 @@ public class ScreenSaverPreferenceController extends PreferenceController {
} }
@Override @Override
protected String getPreferenceKey() { public String getPreferenceKey() {
return KEY_SCREEN_SAVER; return KEY_SCREEN_SAVER;
} }
@@ -45,11 +44,7 @@ public class ScreenSaverPreferenceController extends PreferenceController {
} }
@Override @Override
public void updateState(PreferenceScreen screen) { public void updateState(Preference preference) {
final Preference preference = screen.findPreference(KEY_SCREEN_SAVER); preference.setSummary(DreamSettings.getSummaryTextWithDreamName(mContext));
if (preference != null) {
preference.setSummary(
DreamSettings.getSummaryTextWithDreamName(mContext));
}
} }
} }

View File

@@ -17,7 +17,6 @@ import android.content.Context;
import android.provider.Settings; import android.provider.Settings;
import android.support.v14.preference.SwitchPreference; import android.support.v14.preference.SwitchPreference;
import android.support.v7.preference.Preference; import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceScreen;
import com.android.settings.core.PreferenceController; import com.android.settings.core.PreferenceController;
@@ -31,7 +30,7 @@ public class TapToWakePreferenceController extends PreferenceController implemen
} }
@Override @Override
protected String getPreferenceKey() { public String getPreferenceKey() {
return KEY_TAP_TO_WAKE; return KEY_TAP_TO_WAKE;
} }
@@ -47,14 +46,10 @@ public class TapToWakePreferenceController extends PreferenceController implemen
} }
@Override @Override
public void updateState(PreferenceScreen screen) { public void updateState(Preference preference) {
final SwitchPreference preference =
(SwitchPreference) screen.findPreference(KEY_TAP_TO_WAKE);
if (preference != null) {
int value = Settings.Secure.getInt( int value = Settings.Secure.getInt(
mContext.getContentResolver(), Settings.Secure.DOUBLE_TAP_TO_WAKE, 0); mContext.getContentResolver(), Settings.Secure.DOUBLE_TAP_TO_WAKE, 0);
preference.setChecked(value != 0); ((SwitchPreference) preference).setChecked(value != 0);
}
} }
@Override @Override

View File

@@ -18,7 +18,6 @@ import android.content.Context;
import android.os.UserHandle; import android.os.UserHandle;
import android.provider.Settings; import android.provider.Settings;
import android.support.v7.preference.Preference; import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceScreen;
import android.util.Log; import android.util.Log;
import com.android.settings.R; import com.android.settings.R;
@@ -48,7 +47,7 @@ public class TimeoutPreferenceController extends PreferenceController implements
} }
@Override @Override
protected String getPreferenceKey() { public String getPreferenceKey() {
return KEY_SCREEN_TIMEOUT; return KEY_SCREEN_TIMEOUT;
} }
@@ -58,15 +57,11 @@ public class TimeoutPreferenceController extends PreferenceController implements
} }
@Override @Override
public void updateState(PreferenceScreen screen) { public void updateState(Preference preference) {
final TimeoutListPreference preference = final TimeoutListPreference timeoutListPreference = (TimeoutListPreference) preference;
(TimeoutListPreference) screen.findPreference(KEY_SCREEN_TIMEOUT);
if (preference == null) {
return;
}
final long currentTimeout = Settings.System.getLong(mContext.getContentResolver(), final long currentTimeout = Settings.System.getLong(mContext.getContentResolver(),
SCREEN_OFF_TIMEOUT, FALLBACK_SCREEN_TIMEOUT_VALUE); SCREEN_OFF_TIMEOUT, FALLBACK_SCREEN_TIMEOUT_VALUE);
preference.setValue(String.valueOf(currentTimeout)); timeoutListPreference.setValue(String.valueOf(currentTimeout));
final DevicePolicyManager dpm = (DevicePolicyManager) mContext.getSystemService( final DevicePolicyManager dpm = (DevicePolicyManager) mContext.getSystemService(
Context.DEVICE_POLICY_SERVICE); Context.DEVICE_POLICY_SERVICE);
if (dpm != null) { if (dpm != null) {
@@ -74,9 +69,9 @@ public class TimeoutPreferenceController extends PreferenceController implements
RestrictedLockUtils.checkIfMaximumTimeToLockIsSet(mContext); RestrictedLockUtils.checkIfMaximumTimeToLockIsSet(mContext);
final long maxTimeout = final long maxTimeout =
dpm.getMaximumTimeToLockForUserAndProfiles(UserHandle.myUserId()); dpm.getMaximumTimeToLockForUserAndProfiles(UserHandle.myUserId());
preference.removeUnusableTimeouts(maxTimeout, admin); timeoutListPreference.removeUnusableTimeouts(maxTimeout, admin);
} }
updateTimeoutPreferenceDescription(preference, currentTimeout); updateTimeoutPreferenceDescription(timeoutListPreference, currentTimeout);
} }
@Override @Override

View File

@@ -19,7 +19,6 @@ import android.content.pm.PackageManager;
import android.provider.Settings; import android.provider.Settings;
import android.support.v7.preference.DropDownPreference; import android.support.v7.preference.DropDownPreference;
import android.support.v7.preference.Preference; import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceScreen;
import android.util.Log; import android.util.Log;
import com.android.settings.R; import com.android.settings.R;
@@ -42,18 +41,13 @@ public class VrDisplayPreferenceController extends PreferenceController implemen
} }
@Override @Override
protected String getPreferenceKey() { public String getPreferenceKey() {
return KEY_VR_DISPLAY_PREF; return KEY_VR_DISPLAY_PREF;
} }
@Override @Override
public void updateState(PreferenceScreen screen) { public void updateState(Preference preference) {
final DropDownPreference pref = final DropDownPreference pref = (DropDownPreference) preference;
(DropDownPreference) screen.findPreference(KEY_VR_DISPLAY_PREF);
if (pref == null) {
Log.d(TAG, "Could not find VR display preference.");
return;
}
pref.setEntries(new CharSequence[]{ pref.setEntries(new CharSequence[]{
mContext.getString(R.string.display_vr_pref_low_persistence), mContext.getString(R.string.display_vr_pref_low_persistence),
mContext.getString(R.string.display_vr_pref_off), mContext.getString(R.string.display_vr_pref_off),

View File

@@ -16,7 +16,6 @@ package com.android.settings.display;
import android.content.Context; import android.content.Context;
import android.os.UserHandle; import android.os.UserHandle;
import android.support.v7.preference.Preference; import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceScreen;
import com.android.settings.core.PreferenceController; import com.android.settings.core.PreferenceController;
import com.android.settingslib.RestrictedLockUtils; import com.android.settingslib.RestrictedLockUtils;
@@ -38,13 +37,13 @@ public class WallpaperPreferenceController extends PreferenceController {
} }
@Override @Override
protected String getPreferenceKey() { public String getPreferenceKey() {
return KEY_WALLPAPER; return KEY_WALLPAPER;
} }
@Override @Override
public void updateState(PreferenceScreen screen) { public void updateState(Preference preference) {
disablePreferenceIfManaged(screen); disablePreferenceIfManaged((RestrictedPreference) preference);
} }
@Override @Override
@@ -52,9 +51,7 @@ public class WallpaperPreferenceController extends PreferenceController {
return false; return false;
} }
private void disablePreferenceIfManaged(PreferenceScreen screen) { private void disablePreferenceIfManaged(RestrictedPreference pref) {
final RestrictedPreference pref =
(RestrictedPreference) screen.findPreference(KEY_WALLPAPER);
final String restriction = DISALLOW_SET_WALLPAPER; final String restriction = DISALLOW_SET_WALLPAPER;
if (pref != null) { if (pref != null) {
pref.setDisabledByAdmin(null); pref.setDisabledByAdmin(null);

View File

@@ -92,7 +92,7 @@ public class AirplaneModePreferenceController extends PreferenceController
} }
@Override @Override
protected String getPreferenceKey() { public String getPreferenceKey() {
return KEY_TOGGLE_AIRPLANE; return KEY_TOGGLE_AIRPLANE;
} }

View File

@@ -52,7 +52,7 @@ public class MobileNetworkPreferenceController extends PreferenceController {
} }
@Override @Override
protected String getPreferenceKey() { public String getPreferenceKey() {
return KEY_MOBILE_NETWORK_SETTINGS; return KEY_MOBILE_NETWORK_SETTINGS;
} }
} }

View File

@@ -120,7 +120,7 @@ public class MobilePlanPreferenceController extends PreferenceController impleme
return isPrefAllowedForUser && isPrefAllowedOnDevice; return isPrefAllowedForUser && isPrefAllowedOnDevice;
} }
@Override @Override
protected String getPreferenceKey() { public String getPreferenceKey() {
return KEY_MANAGE_MOBILE_PLAN; return KEY_MANAGE_MOBILE_PLAN;
} }

View File

@@ -43,7 +43,7 @@ public class NetworkResetPreferenceController extends PreferenceController {
} }
@Override @Override
protected String getPreferenceKey() { public String getPreferenceKey() {
return KEY_NETWORK_RESET; return KEY_NETWORK_RESET;
} }
} }

View File

@@ -54,7 +54,7 @@ public class ProxyPreferenceController extends PreferenceController {
} }
@Override @Override
protected String getPreferenceKey() { public String getPreferenceKey() {
return KEY_PROXY_SETTINGS; return KEY_PROXY_SETTINGS;
} }
} }

View File

@@ -83,7 +83,7 @@ public class TetherPreferenceController extends PreferenceController {
} }
@Override @Override
protected String getPreferenceKey() { public String getPreferenceKey() {
return KEY_TETHER_SETTINGS; return KEY_TETHER_SETTINGS;
} }
} }

View File

@@ -65,7 +65,7 @@ public class VpnPreferenceController extends PreferenceController {
} }
@Override @Override
protected String getPreferenceKey() { public String getPreferenceKey() {
return KEY_VPN_SETTINGS; return KEY_VPN_SETTINGS;
} }
} }

View File

@@ -56,7 +56,7 @@ public class WifiCallingPreferenceController extends PreferenceController {
} }
@Override @Override
protected String getPreferenceKey() { public String getPreferenceKey() {
return KEY_WFC_SETTINGS; return KEY_WFC_SETTINGS;
} }
} }

View File

@@ -106,7 +106,7 @@ public class NfcPreferenceController extends PreferenceController
} }
@Override @Override
protected String getPreferenceKey() { public String getPreferenceKey() {
return null; return null;
} }

View File

@@ -107,7 +107,7 @@ public class PreferenceControllerTest {
} }
@Override @Override
protected String getPreferenceKey() { public String getPreferenceKey() {
return KEY_PREF; return KEY_PREF;
} }
} }

View File

@@ -69,7 +69,7 @@ public class DashboardFragmentTest {
mDashboardCategory.tiles = new ArrayList<>(); mDashboardCategory.tiles = new ArrayList<>();
mDashboardCategory.tiles.add(new Tile()); mDashboardCategory.tiles.add(new Tile());
mTestFragment = new TestFragment(ShadowApplication.getInstance().getApplicationContext()); mTestFragment = new TestFragment(ShadowApplication.getInstance().getApplicationContext());
mTestFragment.onAttach(mContext); mTestFragment.onAttach(ShadowApplication.getInstance().getApplicationContext());
when(mFakeFeatureFactory.dashboardFeatureProvider.getTilesForCategory(anyString())) when(mFakeFeatureFactory.dashboardFeatureProvider.getTilesForCategory(anyString()))
.thenReturn(mDashboardCategory); .thenReturn(mDashboardCategory);
} }
@@ -126,7 +126,7 @@ public class DashboardFragmentTest {
} }
@Override @Override
protected String getPreferenceKey() { public String getPreferenceKey() {
return null; return null;
} }

View File

@@ -0,0 +1,156 @@
/*
* Copyright (C) 2016 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.dashboard;
import android.content.Context;
import android.support.v14.preference.PreferenceFragment;
import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceScreen;
import com.android.settings.TestConfig;
import com.android.settings.overlay.FeatureFactory;
import com.android.settings.testutils.FakeFeatureFactory;
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.annotation.Config;
import org.robolectric.shadows.ShadowApplication;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@RunWith(RobolectricTestRunner.class)
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
public class ProgressiveDisclosureTest {
@Mock(answer = Answers.RETURNS_DEEP_STUBS)
private Context mContext;
@Mock
private FakeFeatureFactory mFakeFeatureFactory;
@Mock(answer = Answers.RETURNS_DEEP_STUBS)
private PreferenceFragment mPreferenceFragment;
private Context mAppContext;
private Preference mPreference;
private ProgressiveDisclosureMixin mMixin;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
FakeFeatureFactory.setupForTest(mContext);
mAppContext = ShadowApplication.getInstance().getApplicationContext();
mFakeFeatureFactory = (FakeFeatureFactory) FeatureFactory.getFactory(mContext);
mMixin = new ProgressiveDisclosureMixin(mAppContext, mPreferenceFragment);
mPreference = new Preference(mAppContext);
mPreference.setKey("test");
when(mFakeFeatureFactory.dashboardFeatureProvider.isEnabled()).thenReturn(true);
}
@Test
public void shouldNotCollapse_lessPreferenceThanLimit() {
when(mPreferenceFragment.getPreferenceScreen().getPreferenceCount()).thenReturn(5);
mMixin.setTileLimit(10);
assertThat(mMixin.shouldCollapse(mPreferenceFragment.getPreferenceScreen())).isFalse();
}
@Test
public void shouldCollapse_morePreferenceThanLimit() {
when(mFakeFeatureFactory.dashboardFeatureProvider.isEnabled()).thenReturn(true);
when(mPreferenceFragment.getPreferenceScreen().getPreferenceCount()).thenReturn(5);
assertThat(mMixin.shouldCollapse(mPreferenceFragment.getPreferenceScreen())).isTrue();
}
@Test
public void findPreference_prefInCollapsedList_shouldFindIt() {
mMixin.addToCollapsedList(mPreference);
Preference pref = mMixin.findPreference(mPreference.getKey());
assertThat(pref).isNotNull();
assertThat(pref).isSameAs(mPreference);
}
@Test
public void findPreference_prefNotInCollapsedList_shouldNotFindIt() {
Preference pref = mMixin.findPreference(mPreference.getKey());
assertThat(pref).isNull();
}
@Test
public void findPreference_prefRemovedFromCollapsedList_shouldNotFindIt() {
mMixin.addToCollapsedList(mPreference);
mMixin.removePreference(mPreferenceFragment.getPreferenceScreen(), mPreference.getKey());
Preference pref = mMixin.findPreference(mPreference.getKey());
assertThat(pref).isNull();
}
@Test
public void removeLastPreference_shouldRemoveExpandButtonToo() {
mMixin.addToCollapsedList(mPreference);
// Collapsed
assertThat(mMixin.isCollapsed()).isTrue();
mMixin.removePreference(mPreferenceFragment.getPreferenceScreen(), mPreference.getKey());
// Removing expand button
verify(mPreferenceFragment.getPreferenceScreen()).removePreference(any(Preference.class));
// No longer collapsed
assertThat(mMixin.isCollapsed()).isFalse();
}
@Test
public void collapse_shouldDoNothingIfNotCollapsible() {
final PreferenceScreen screen = mPreferenceFragment.getPreferenceScreen();
when(screen.getPreferenceCount()).thenReturn(5);
mMixin.setTileLimit(15);
mMixin.collapse(screen);
assertThat(mMixin.isCollapsed()).isFalse();
verify(screen, never()).addPreference(any(Preference.class));
verify(screen, never()).removePreference(any(Preference.class));
}
@Test
public void collapse_shouldRemovePrefAndAddExpandButton() {
final PreferenceScreen screen = mPreferenceFragment.getPreferenceScreen();
when(screen.getPreferenceCount()).thenReturn(5);
when(screen.getPreference(anyInt())).thenReturn(mPreference);
mMixin.setTileLimit(2);
mMixin.collapse(screen);
assertThat(mMixin.isCollapsed()).isTrue();
verify(screen).addPreference(any(ExpandPreference.class));
verify(screen, times(3)).removePreference(any(Preference.class));
}
}