OSDN Git Service

Merge "Use standard displayPreference" into pi-dev
authorTreeHugger Robot <treehugger-gerrit@google.com>
Wed, 23 May 2018 18:44:28 +0000 (18:44 +0000)
committerAndroid (Google) Code Review <android-gerrit@google.com>
Wed, 23 May 2018 18:44:28 +0000 (18:44 +0000)
15 files changed:
res/layout/wifi_dialog.xml
res/xml/battery_saver_settings.xml
src/com/android/settings/fuelgauge/batterysaver/BatterySaverButtonPreferenceController.java
src/com/android/settings/fuelgauge/batterysaver/BatterySaverSettings.java
src/com/android/settings/slices/SliceBuilderUtils.java
src/com/android/settings/widget/TwoStateButtonPreference.java
src/com/android/settings/widget/TwoStateButtonPreferenceController.java [deleted file]
src/com/android/settings/wifi/WifiConfigController.java
src/com/android/settings/wifi/calling/WifiCallingSliceHelper.java
tests/robotests/src/com/android/settings/fuelgauge/batterysaver/BatterySaverButtonPreferenceControllerTest.java
tests/robotests/src/com/android/settings/slices/SliceBuilderUtilsTest.java
tests/robotests/src/com/android/settings/testutils/SliceTester.java
tests/robotests/src/com/android/settings/widget/TwoStateButtonPreferenceTest.java [moved from tests/robotests/src/com/android/settings/widget/TwoStateButtonPreferenceControllerTest.java with 60% similarity]
tests/robotests/src/com/android/settings/wifi/WifiConfigControllerTest.java
tests/robotests/src/com/android/settings/wifi/calling/WifiCallingSliceHelperTest.java

index fe891e1..2330727 100644 (file)
             <LinearLayout android:id="@+id/hidden_settings_field"
                           android:layout_width="match_parent"
                           android:layout_height="wrap_content"
+                          android:visibility="gone"
                           style="@style/wifi_item">
 
                 <TextView android:id="@+id/hidden_settings_title"
index 116079d..0460459 100644 (file)
     xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:settings="http://schemas.android.com/apk/res-auto"
     android:title="@string/battery_saver"
-    android:key="battery_saver">
+    android:key="battery_saver_page">
 
     <!-- Turn on automatically -->
     <SwitchPreference
         android:key="auto_battery_saver"
         android:title="@string/battery_saver_auto_title"
-        settings:controller="com.android.settings.fuelgauge.batterysaver.AutoBatterySaverPreferenceController"/>
+        settings:controller="com.android.settings.fuelgauge.batterysaver.AutoBatterySaverPreferenceController" />
 
     <com.android.settings.widget.SeekBarPreference
         android:key="battery_saver_seek_bar"
         android:title="@string/battery_saver_seekbar_title_placeholder"
         android:max="75"
-        android:min="5"/>
+        android:min="5" />
 
     <com.android.settings.widget.TwoStateButtonPreference
-        android:key="battery_saver_button_container"
+        android:key="battery_saver"
+        android:title="@string/battery_saver"
         android:selectable="false"
         settings:textOn="@string/battery_saver_button_turn_on"
-        settings:textOff="@string/battery_saver_button_turn_off"/>
+        settings:textOff="@string/battery_saver_button_turn_off"
+        settings:platform_slice="true"
+        settings:controller="com.android.settings.fuelgauge.batterysaver.BatterySaverButtonPreferenceController" />
 
     <PreferenceCategory
         android:key="battery_saver_footer">
         <com.android.settingslib.widget.FooterPreference
             android:key="battery_saver_footer_preference"
             android:title="@*android:string/battery_saver_description"
-            android:selectable="false"/>
+            android:selectable="false" />
     </PreferenceCategory>
 
 </PreferenceScreen>
index b23a5f0..9485868 100644 (file)
@@ -18,12 +18,12 @@ package com.android.settings.fuelgauge.batterysaver;
 
 import android.content.Context;
 import android.os.PowerManager;
-import android.support.annotation.VisibleForTesting;
 import android.support.v7.preference.Preference;
+import android.support.v7.preference.PreferenceScreen;
 
+import com.android.settings.core.TogglePreferenceController;
 import com.android.settings.fuelgauge.BatterySaverReceiver;
-import com.android.settings.widget.TwoStateButtonPreferenceController;
-import com.android.settingslib.core.lifecycle.Lifecycle;
+import com.android.settings.widget.TwoStateButtonPreference;
 import com.android.settingslib.core.lifecycle.LifecycleObserver;
 import com.android.settingslib.core.lifecycle.events.OnStart;
 import com.android.settingslib.core.lifecycle.events.OnStop;
@@ -33,21 +33,29 @@ import com.android.settingslib.fuelgauge.BatterySaverUtils;
  * Controller to update the battery saver button
  */
 public class BatterySaverButtonPreferenceController extends
-        TwoStateButtonPreferenceController implements
+        TogglePreferenceController implements
         LifecycleObserver, OnStart, OnStop, BatterySaverReceiver.BatterySaverListener {
-    private static final String KEY = "battery_saver_button_container";
-    private BatterySaverReceiver mBatterySaverReceiver;
-    @VisibleForTesting
-    PowerManager mPowerManager;
 
-    public BatterySaverButtonPreferenceController(Context context, Lifecycle lifecycle) {
-        super(context, KEY);
+    private final BatterySaverReceiver mBatterySaverReceiver;
+    private final PowerManager mPowerManager;
+
+    private TwoStateButtonPreference mPreference;
+
+    public BatterySaverButtonPreferenceController(Context context, String key) {
+        super(context, key);
         mPowerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
         mBatterySaverReceiver = new BatterySaverReceiver(context);
         mBatterySaverReceiver.setBatterySaverListener(this);
-        if (lifecycle != null) {
-            lifecycle.addObserver(this);
-        }
+    }
+
+    @Override
+    public int getAvailabilityStatus() {
+        return AVAILABLE;
+    }
+
+    @Override
+    public boolean isSliceable() {
+        return true;
     }
 
     @Override
@@ -61,29 +69,43 @@ public class BatterySaverButtonPreferenceController extends
     }
 
     @Override
-    public void updateState(Preference preference) {
-        super.updateState(preference);
-        setButtonVisibility(!mPowerManager.isPowerSaveMode());
+    public void displayPreference(PreferenceScreen screen) {
+        super.displayPreference(screen);
+        mPreference = (TwoStateButtonPreference) screen.findPreference(getPreferenceKey());
     }
 
     @Override
-    public int getAvailabilityStatus() {
-        return AVAILABLE;
+    public boolean isChecked() {
+        return mPowerManager.isPowerSaveMode();
     }
 
     @Override
-    public void onButtonClicked(boolean stateOn) {
+    public boolean setChecked(boolean stateOn) {
         // This screen already shows a warning, so we don't need another warning.
-        BatterySaverUtils.setPowerSaveMode(mContext,  stateOn, /*needFirstTimeWarning*/ false);
+        return BatterySaverUtils.setPowerSaveMode(mContext, stateOn,
+                false /* needFirstTimeWarning */);
+    }
+
+    @Override
+    public void updateState(Preference preference) {
+        super.updateState(preference);
+        if (mPreference != null) {
+            mPreference.setChecked(isChecked());
+        }
     }
 
     @Override
     public void onPowerSaveModeChanged() {
-        setButtonVisibility(!mPowerManager.isPowerSaveMode());
+        final boolean isChecked = isChecked();
+        if (mPreference != null && mPreference.isChecked() != isChecked) {
+            mPreference.setChecked(isChecked);
+        }
     }
 
     @Override
     public void onBatteryChanged(boolean pluggedIn) {
-        setButtonEnabled(!pluggedIn);
+        if (mPreference != null) {
+            mPreference.setButtonEnabled(!pluggedIn);
+        }
     }
 }
index 8009e95..26f9e17 100644 (file)
@@ -73,7 +73,6 @@ public class BatterySaverSettings extends DashboardFragment {
         final List<AbstractPreferenceController> controllers = new ArrayList<>();
         controllers.add(new AutoBatterySaverPreferenceController(context));
         controllers.add(new AutoBatterySeekBarPreferenceController(context, lifecycle));
-        controllers.add(new BatterySaverButtonPreferenceController(context, lifecycle));
         return controllers;
     }
 
index feb7042..5158bdb 100644 (file)
@@ -86,8 +86,13 @@ public class SliceBuilderUtils {
         FeatureFactory.getFactory(context).getMetricsFeatureProvider()
                 .action(context, MetricsEvent.ACTION_SETTINGS_SLICE_REQUESTED, sliceNamePair);
 
-        if (controller.getAvailabilityStatus() != AVAILABLE) {
-            return buildUnavailableSlice(context, sliceData, controller);
+        if (!controller.isAvailable()) {
+            // Cannot guarantee setting page is accessible, let the presenter handle error case.
+            return null;
+        }
+
+        if (controller.getAvailabilityStatus() == DISABLED_DEPENDENT_SETTING) {
+            return buildUnavailableSlice(context, sliceData);
         }
 
         switch (sliceData.getSliceType()) {
@@ -177,14 +182,6 @@ public class SliceBuilderUtils {
     }
 
     /**
-     * @return {@link PendingIntent} to the Settings home page.
-     */
-    public static PendingIntent getSettingsIntent(Context context) {
-        final Intent intent = new Intent(Settings.ACTION_SETTINGS);
-        return PendingIntent.getActivity(context, 0 /* requestCode */, intent, 0 /* flags */);
-    }
-
-    /**
      * @return the summary text for a {@link Slice} built for {@param sliceData}.
      */
     public static CharSequence getSubtitleText(Context context,
@@ -355,40 +352,20 @@ public class SliceBuilderUtils {
         return keywords;
     }
 
-    private static Slice buildUnavailableSlice(Context context, SliceData data,
-            BasePreferenceController controller) {
+    private static Slice buildUnavailableSlice(Context context, SliceData data) {
         final String title = data.getTitle();
         final List<String> keywords = buildSliceKeywords(data);
         @ColorInt final int color = Utils.getColorAccent(context);
-        final String summary;
-        final SliceAction primaryAction;
+        final CharSequence summary = context.getText(R.string.disabled_dependent_setting_summary);
         final IconCompat icon = IconCompat.createWithResource(context, data.getIconResource());
-
-        switch (controller.getAvailabilityStatus()) {
-            case UNSUPPORTED_ON_DEVICE:
-                summary = context.getString(R.string.unsupported_setting_summary);
-                primaryAction = new SliceAction(getSettingsIntent(context), icon, title);
-                break;
-            case DISABLED_FOR_USER:
-                summary = context.getString(R.string.disabled_for_user_setting_summary);
-                primaryAction = new SliceAction(getContentPendingIntent(context, data), icon,
-                        title);
-                break;
-            case DISABLED_DEPENDENT_SETTING:
-                summary = context.getString(R.string.disabled_dependent_setting_summary);
-                primaryAction = new SliceAction(getContentPendingIntent(context, data), icon,
-                        title);
-                break;
-            case CONDITIONALLY_UNAVAILABLE:
-            default:
-                summary = context.getString(R.string.unknown_unavailability_setting_summary);
-                primaryAction = new SliceAction(getSettingsIntent(context), icon, title);
-        }
+        final SliceAction primaryAction = new SliceAction(getContentPendingIntent(context, data),
+                icon, title);
 
         return new ListBuilder(context, data.getUri(), ListBuilder.INFINITY)
                 .setAccentColor(color)
                 .addRow(builder -> builder
                         .setTitle(title)
+                        .setTitleItem(icon)
                         .setSubtitle(summary)
                         .setPrimaryAction(primaryAction))
                 .setKeywords(keywords)
index 6b5fbbb..78d4874 100644 (file)
@@ -18,8 +18,10 @@ package com.android.settings.widget;
 
 import android.content.Context;
 import android.content.res.TypedArray;
+import android.support.annotation.VisibleForTesting;
 import android.support.v4.content.res.TypedArrayUtils;
 import android.util.AttributeSet;
+import android.view.View;
 import android.widget.Button;
 
 import com.android.settings.R;
@@ -28,12 +30,21 @@ import com.android.settings.applications.LayoutPreference;
 /**
  * Preference that presents a button with two states(On vs Off)
  */
-public class TwoStateButtonPreference extends LayoutPreference {
+public class TwoStateButtonPreference extends LayoutPreference implements
+        View.OnClickListener {
+
+    private boolean mIsChecked;
+    private final Button mButtonOn;
+    private final Button mButtonOff;
+
     public TwoStateButtonPreference(Context context, AttributeSet attrs) {
         super(context, attrs, TypedArrayUtils.getAttr(
                 context, R.attr.twoStateButtonPreferenceStyle, android.R.attr.preferenceStyle));
 
-        if (attrs != null) {
+        if (attrs == null) {
+            mButtonOn = null;
+            mButtonOff = null;
+        } else {
             final TypedArray styledAttrs = context.obtainStyledAttributes(attrs,
                     R.styleable.TwoStateButtonPreference);
             final int textOnId = styledAttrs.getResourceId(
@@ -44,19 +55,52 @@ public class TwoStateButtonPreference extends LayoutPreference {
                     R.string.summary_placeholder);
             styledAttrs.recycle();
 
-            final Button buttonOn = getStateOnButton();
-            buttonOn.setText(textOnId);
-            final Button buttonOff = getStateOffButton();
-            buttonOff.setText(textOffId);
+            mButtonOn = findViewById(R.id.state_on_button);
+            mButtonOn.setText(textOnId);
+            mButtonOn.setOnClickListener(this);
+            mButtonOff = findViewById(R.id.state_off_button);
+            mButtonOff.setText(textOffId);
+            mButtonOff.setOnClickListener(this);
+            setChecked(isChecked());
         }
     }
 
-    public Button getStateOnButton() {
-        return findViewById(R.id.state_on_button);
+    @Override
+    public void onClick(View v) {
+        final boolean stateOn = v.getId() == R.id.state_on_button;
+        setChecked(stateOn);
+        callChangeListener(stateOn);
+    }
+
+    public void setChecked(boolean checked) {
+        // Update state
+        mIsChecked = checked;
+        // And update UI
+        if (checked) {
+            mButtonOn.setVisibility(View.GONE);
+            mButtonOff.setVisibility(View.VISIBLE);
+        } else {
+            mButtonOn.setVisibility(View.VISIBLE);
+            mButtonOff.setVisibility(View.GONE);
+        }
     }
 
+    public boolean isChecked() {
+        return mIsChecked;
+    }
+
+    public void setButtonEnabled(boolean enabled) {
+        mButtonOn.setEnabled(enabled);
+        mButtonOff.setEnabled(enabled);
+    }
+
+    @VisibleForTesting
+    public Button getStateOnButton() {
+        return mButtonOn;
+    }
 
+    @VisibleForTesting
     public Button getStateOffButton() {
-        return findViewById(R.id.state_off_button);
+        return mButtonOff;
     }
 }
\ No newline at end of file
diff --git a/src/com/android/settings/widget/TwoStateButtonPreferenceController.java b/src/com/android/settings/widget/TwoStateButtonPreferenceController.java
deleted file mode 100644 (file)
index 47699ef..0000000
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Copyright (C) 2018 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.widget;
-
-import android.content.Context;
-import android.support.v7.preference.PreferenceScreen;
-import android.view.View;
-import android.widget.Button;
-
-import com.android.settings.R;
-import com.android.settings.core.BasePreferenceController;
-
-/**
- * Controller to update the button with two states(On vs Off).
- */
-public abstract class TwoStateButtonPreferenceController extends BasePreferenceController
-        implements View.OnClickListener {
-    private Button mButtonOn;
-    private Button mButtonOff;
-
-    public TwoStateButtonPreferenceController(Context context, String key) {
-        super(context, key);
-    }
-
-    @Override
-    public void displayPreference(PreferenceScreen screen) {
-        super.displayPreference(screen);
-        final TwoStateButtonPreference preference =
-                (TwoStateButtonPreference) screen.findPreference(getPreferenceKey());
-        mButtonOn = preference.getStateOnButton();
-        mButtonOn.setOnClickListener(this);
-        mButtonOff = preference.getStateOffButton();
-        mButtonOff.setOnClickListener(this);
-    }
-
-    protected void setButtonVisibility(boolean stateOn) {
-        if (stateOn) {
-            mButtonOff.setVisibility(View.GONE);
-            mButtonOn.setVisibility(View.VISIBLE);
-        } else {
-            mButtonOff.setVisibility(View.VISIBLE);
-            mButtonOn.setVisibility(View.GONE);
-        }
-    }
-
-    protected void setButtonEnabled(boolean enabled) {
-        mButtonOn.setEnabled(enabled);
-        mButtonOff.setEnabled(enabled);
-    }
-
-    @Override
-    public void onClick(View v) {
-        final boolean stateOn = v.getId() == R.id.state_on_button;
-        onButtonClicked(stateOn);
-    }
-
-    /**
-     * Callback when button is clicked
-     *
-     * @param stateOn {@code true} if stateOn button is clicked, otherwise it means stateOff
-     *                button is clicked
-     */
-    public abstract void onButtonClicked(boolean stateOn);
-}
\ No newline at end of file
index 79196f1..26e7b57 100644 (file)
@@ -220,8 +220,6 @@ public class WifiConfigController implements TextWatcher,
         mMeteredSettingsSpinner = mView.findViewById(R.id.metered_settings);
         mHiddenSettingsSpinner = mView.findViewById(R.id.hidden_settings);
         mHiddenSettingsSpinner.setOnItemSelectedListener(this);
-        mHiddenSettingsSpinner.setVisibility(View.GONE);
-        mHiddenSettingsSpinner.setEnabled(false);
         mHiddenWarningView = mView.findViewById(R.id.hidden_settings_warning);
         mHiddenWarningView.setVisibility(
                 mHiddenSettingsSpinner.getSelectedItemPosition() == NOT_HIDDEN_NETWORK
@@ -241,8 +239,7 @@ public class WifiConfigController implements TextWatcher,
             showProxyFields();
             mView.findViewById(R.id.wifi_advanced_toggle).setVisibility(View.VISIBLE);
             // Hidden option can be changed only when the user adds a network manually.
-            mHiddenSettingsSpinner.setVisibility(View.VISIBLE);
-            mHiddenSettingsSpinner.setEnabled(true);
+            mView.findViewById(R.id.hidden_settings_field).setVisibility(View.VISIBLE);
             ((CheckBox) mView.findViewById(R.id.wifi_advanced_togglebox))
                     .setOnCheckedChangeListener(this);
 
index a554e74..cec8545 100644 (file)
@@ -25,6 +25,7 @@ import android.content.Context;
 import android.content.Intent;
 import android.net.Uri;
 import android.os.PersistableBundle;
+import android.provider.Settings;
 import android.support.v4.graphics.drawable.IconCompat;
 import android.telephony.CarrierConfigManager;
 import android.telephony.SubscriptionManager;
@@ -121,7 +122,7 @@ public class WifiCallingSliceHelper {
             return getNonActionableWifiCallingSlice(
                     mContext.getString(R.string.wifi_calling_settings_title),
                     mContext.getString(R.string.wifi_calling_not_supported, carrierName),
-                    sliceUri, SliceBuilderUtils.getSettingsIntent(mContext));
+                    sliceUri, getSettingsIntent(mContext));
         }
 
         final ImsManager imsManager = getImsManager(subId);
@@ -132,7 +133,7 @@ public class WifiCallingSliceHelper {
             return getNonActionableWifiCallingSlice(
                     mContext.getString(R.string.wifi_calling_settings_title),
                     mContext.getString(R.string.wifi_calling_not_supported, carrierName),
-                    sliceUri, SliceBuilderUtils.getSettingsIntent(mContext));
+                    sliceUri, getSettingsIntent(mContext));
         }
 
         try {
@@ -338,6 +339,14 @@ public class WifiCallingSliceHelper {
         return intent;
     }
 
+    /**
+     * @return {@link PendingIntent} to the Settings home page.
+     */
+    public static PendingIntent getSettingsIntent(Context context) {
+        final Intent intent = new Intent(Settings.ACTION_SETTINGS);
+        return PendingIntent.getActivity(context, 0 /* requestCode */, intent, 0 /* flags */);
+    }
+
     private PendingIntent getBroadcastIntent(String action) {
         final Intent intent = new Intent(action);
         intent.setClass(mContext, SliceBroadcastReceiver.class);
index 14f6533..641a15f 100644 (file)
@@ -21,17 +21,13 @@ import static org.mockito.Matchers.anyString;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.spy;
 
-import android.arch.lifecycle.LifecycleOwner;
 import android.content.Context;
 import android.os.PowerManager;
 import android.support.v7.preference.PreferenceScreen;
-import android.view.View;
 import android.widget.Button;
 
-import com.android.settings.R;
 import com.android.settings.testutils.SettingsRobolectricTestRunner;
 import com.android.settings.widget.TwoStateButtonPreference;
-import com.android.settingslib.core.lifecycle.Lifecycle;
 
 import org.junit.Before;
 import org.junit.Test;
@@ -41,6 +37,7 @@ import org.mockito.MockitoAnnotations;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
 import org.robolectric.shadows.ShadowPowerManager;
+import org.robolectric.util.ReflectionHelpers;
 
 @RunWith(SettingsRobolectricTestRunner.class)
 @Config(shadows = ShadowPowerManager.class)
@@ -48,67 +45,58 @@ public class BatterySaverButtonPreferenceControllerTest {
 
     private BatterySaverButtonPreferenceController mController;
     private Context mContext;
-    private Lifecycle mLifecycle;
-    private LifecycleOwner mLifecycleOwner;
     private Button mButtonOn;
     private Button mButtonOff;
     private PowerManager mPowerManager;
-    @Mock
     private TwoStateButtonPreference mPreference;
+
     @Mock
     private PreferenceScreen mPreferenceScreen;
 
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
-
-        mLifecycleOwner = () -> mLifecycle;
-        mLifecycle = new Lifecycle(mLifecycleOwner);
         mContext = spy(RuntimeEnvironment.application);
-        mPowerManager = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
-        doReturn(mPreference).when(mPreferenceScreen).findPreference(anyString());
-
         mButtonOn = new Button(mContext);
-        mButtonOn.setId(R.id.state_on_button);
-        doReturn(mButtonOn).when(mPreference).getStateOnButton();
         mButtonOff = new Button(mContext);
-        mButtonOff.setId(R.id.state_off_button);
-        doReturn(mButtonOff).when(mPreference).getStateOffButton();
+        mPowerManager = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
+        mPreference = spy(new TwoStateButtonPreference(mContext, null /* AttributeSet */));
+        ReflectionHelpers.setField(mPreference, "mButtonOn", mButtonOn);
+        ReflectionHelpers.setField(mPreference, "mButtonOff", mButtonOff);
+        doReturn(mPreference).when(mPreferenceScreen).findPreference(anyString());
 
-        mController = new BatterySaverButtonPreferenceController(mContext, mLifecycle);
+        mController = new BatterySaverButtonPreferenceController(mContext, "test_key");
         mController.displayPreference(mPreferenceScreen);
     }
 
     @Test
-    public void testUpdateState_lowPowerOn_displayButtonOff() {
+    public void updateState_lowPowerOn_preferenceIsChecked() {
         mPowerManager.setPowerSaveMode(true);
 
         mController.updateState(mPreference);
 
-        assertThat(mButtonOn.getVisibility()).isEqualTo(View.GONE);
-        assertThat(mButtonOff.getVisibility()).isEqualTo(View.VISIBLE);
+        assertThat(mPreference.isChecked()).isTrue();
     }
 
     @Test
-    public void testUpdateState_lowPowerOff_displayButtonOn() {
+    public void testUpdateState_lowPowerOff_preferenceIsUnchecked() {
         mPowerManager.setPowerSaveMode(false);
 
         mController.updateState(mPreference);
 
-        assertThat(mButtonOn.getVisibility()).isEqualTo(View.VISIBLE);
-        assertThat(mButtonOff.getVisibility()).isEqualTo(View.GONE);
+        assertThat(mPreference.isChecked()).isFalse();
     }
 
     @Test
-    public void testOnClick_clickButtonOn_setPowerSaveMode() {
-        mController.onClick(mButtonOn);
+    public void setChecked_on_setPowerSaveMode() {
+        mController.setChecked(true);
 
         assertThat(mPowerManager.isPowerSaveMode()).isTrue();
     }
 
     @Test
-    public void testOnClick_clickButtonOff_clearPowerSaveMode() {
-        mController.onClick(mButtonOff);
+    public void setChecked_off_unsetPowerSaveMode() {
+        mController.setChecked(false);
 
         assertThat(mPowerManager.isPowerSaveMode()).isFalse();
     }
index 00e8fe1..96e475e 100644 (file)
@@ -336,7 +336,7 @@ public class SliceBuilderUtilsTest {
 
         final Slice slice = SliceBuilderUtils.buildSlice(mContext, data);
 
-        SliceTester.testSettingsUnavailableSlice(mContext, slice, data);
+        assertThat(slice).isNull();
     }
 
     @Test
@@ -349,7 +349,7 @@ public class SliceBuilderUtilsTest {
 
         final Slice slice = SliceBuilderUtils.buildSlice(mContext, data);
 
-        SliceTester.testSettingsUnavailableSlice(mContext, slice, data);
+        assertThat(slice).isNull();
     }
 
     @Test
@@ -394,7 +394,7 @@ public class SliceBuilderUtilsTest {
                 .isEqualTo(MetricsEvent.FIELD_SETTINGS_PREFERENCE_CHANGE_NAME);
         assertThat(capturedLoggingPair.second)
                 .isEqualTo(data.getKey());
-        SliceTester.testSettingsUnavailableSlice(mContext, slice, data);
+        assertThat(slice).isNull();
     }
 
     @Test
@@ -408,16 +408,6 @@ public class SliceBuilderUtilsTest {
         assertThat(intentData).isEqualTo(expectedUri);
     }
 
-    @Test
-    public void getSettingsIntent_createsIntentToSettings() {
-        final Intent intent = new Intent(Settings.ACTION_SETTINGS);
-        final PendingIntent expectedIntent = PendingIntent.getActivity(mContext, 0, intent, 0);
-
-        final PendingIntent settingsIntent = SliceBuilderUtils.getSettingsIntent(mContext);
-
-        assertThat(expectedIntent).isEqualTo(settingsIntent);
-    }
-
     private SliceData getDummyData() {
         return getDummyData(TOGGLE_CONTROLLER, SUMMARY, SliceData.SliceType.SWITCH, SCREEN_TITLE);
     }
index f617aa9..6653d00 100644 (file)
@@ -191,20 +191,8 @@ public class SliceTester {
         assertThat(toggles).isEmpty();
 
         final PendingIntent primaryPendingIntent = metadata.getPrimaryAction().getAction();
-        final int availabilityStatus = SliceBuilderUtils.getPreferenceController(context,
-                sliceData).getAvailabilityStatus();
-        switch (availabilityStatus) {
-            case UNSUPPORTED_ON_DEVICE:
-            case CONDITIONALLY_UNAVAILABLE:
-                assertThat(primaryPendingIntent).isEqualTo(
-                        SliceBuilderUtils.getSettingsIntent(context));
-                break;
-            case DISABLED_FOR_USER:
-            case DISABLED_DEPENDENT_SETTING:
-                assertThat(primaryPendingIntent).isEqualTo(
-                        SliceBuilderUtils.getContentPendingIntent(context, sliceData));
-                break;
-        }
+        assertThat(primaryPendingIntent).isEqualTo(SliceBuilderUtils.getContentPendingIntent(
+                context, sliceData));
 
         final List<SliceItem> sliceItems = slice.getItems();
         assertTitle(sliceItems, sliceData.getTitle());
 package com.android.settings.widget;
 
 import static com.google.common.truth.Truth.assertThat;
-import static org.mockito.Matchers.anyString;
-import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
 
 import android.content.Context;
-import android.support.v7.preference.PreferenceScreen;
 import android.view.View;
 import android.widget.Button;
 
+import com.android.settings.R;
 import com.android.settings.testutils.SettingsRobolectricTestRunner;
 
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
-import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 import org.robolectric.RuntimeEnvironment;
+import org.robolectric.util.ReflectionHelpers;
 
 @RunWith(SettingsRobolectricTestRunner.class)
-public class TwoStateButtonPreferenceControllerTest {
+public class TwoStateButtonPreferenceTest {
 
-    private static final String KEY = "pref_key";
-
-    @Mock
-    private PreferenceScreen mPreferenceScreen;
-    @Mock
     private TwoStateButtonPreference mPreference;
-    private TwoStateButtonPreferenceController mController;
     private Context mContext;
     private Button mButtonOn;
     private Button mButtonOff;
@@ -53,35 +46,34 @@ public class TwoStateButtonPreferenceControllerTest {
     public void setUp() {
         MockitoAnnotations.initMocks(this);
         mContext = spy(RuntimeEnvironment.application);
-        doReturn(mPreference).when(mPreferenceScreen).findPreference(anyString());
+        mPreference = spy(new TwoStateButtonPreference(mContext, null /* AttributeSet */));
         mButtonOn = new Button(mContext);
-        doReturn(mButtonOn).when(mPreference).getStateOnButton();
+        mButtonOn.setId(R.id.state_on_button);
         mButtonOff = new Button(mContext);
-        doReturn(mButtonOff).when(mPreference).getStateOffButton();
-
-        mController = new TestButtonsPreferenceController(mContext, KEY);
-        mController.displayPreference(mPreferenceScreen);
+        mButtonOff.setId(R.id.state_off_button);
+        ReflectionHelpers.setField(mPreference, "mButtonOn", mButtonOn);
+        ReflectionHelpers.setField(mPreference, "mButtonOff", mButtonOff);
     }
 
     @Test
     public void testSetButtonVisibility_stateOn_onlyShowButtonOn() {
-        mController.setButtonVisibility(true /* stateOn */);
+        mPreference.setChecked(true /* stateOn */);
 
-        assertThat(mButtonOn.getVisibility()).isEqualTo(View.VISIBLE);
-        assertThat(mButtonOff.getVisibility()).isEqualTo(View.GONE);
+        assertThat(mButtonOn.getVisibility()).isEqualTo(View.GONE);
+        assertThat(mButtonOff.getVisibility()).isEqualTo(View.VISIBLE);
     }
 
     @Test
     public void testSetButtonVisibility_stateOff_onlyShowButtonOff() {
-        mController.setButtonVisibility(false /* stateOn */);
+        mPreference.setChecked(false /* stateOn */);
 
-        assertThat(mButtonOn.getVisibility()).isEqualTo(View.GONE);
-        assertThat(mButtonOff.getVisibility()).isEqualTo(View.VISIBLE);
+        assertThat(mButtonOn.getVisibility()).isEqualTo(View.VISIBLE);
+        assertThat(mButtonOff.getVisibility()).isEqualTo(View.GONE);
     }
 
     @Test
     public void testSetButtonEnabled_enabled_buttonEnabled() {
-        mController.setButtonEnabled(true /* enabled */);
+        mPreference.setButtonEnabled(true /* enabled */);
 
         assertThat(mButtonOn.isEnabled()).isTrue();
         assertThat(mButtonOff.isEnabled()).isTrue();
@@ -89,30 +81,18 @@ public class TwoStateButtonPreferenceControllerTest {
 
     @Test
     public void testSetButtonEnabled_disabled_buttonDisabled() {
-        mController.setButtonEnabled(false /* enabled */);
+        mPreference.setButtonEnabled(false /* enabled */);
 
         assertThat(mButtonOn.isEnabled()).isFalse();
         assertThat(mButtonOff.isEnabled()).isFalse();
     }
 
-    /**
-     * Controller to test methods in {@link TwoStateButtonPreferenceController}
-     */
-    public static class TestButtonsPreferenceController
-        extends TwoStateButtonPreferenceController {
-
-        TestButtonsPreferenceController(Context context, String key) {
-            super(context, key);
-        }
-
-        @Override
-        public void onButtonClicked(boolean stateOn) {
-            //do nothing
-        }
-
-        @Override
-        public int getAvailabilityStatus() {
-            return AVAILABLE;
-        }
+    @Test
+    public void onClick_shouldPropagateChangeToListener() {
+        mPreference.onClick(mButtonOn);
+        verify(mPreference).callChangeListener(true);
+
+        mPreference.onClick(mButtonOff);
+        verify(mPreference).callChangeListener(false);
     }
 }
index ddbc851..43e87d8 100644 (file)
@@ -259,26 +259,13 @@ public class WifiConfigControllerTest {
     }
 
     @Test
-    public void hiddenView_isDisabledWhenAppropriate() {
-        View hiddenSpinner = mView.findViewById(R.id.hidden_settings);
-        assertThat(hiddenSpinner.isEnabled()).isFalse();
+    public void hiddenField_visibilityUpdatesCorrectly() {
+        View hiddenField = mView.findViewById(R.id.hidden_settings_field);
+        assertThat(hiddenField.getVisibility()).isEqualTo(View.GONE);
 
         mController = new TestWifiConfigController(mConfigUiBase, mView, null /* accessPoint */,
                 WifiConfigUiBase.MODE_CONNECT);
-        assertThat(hiddenSpinner.isEnabled()).isTrue();
-    }
-
-
-    @Test
-    public void hiddenSpinner_visibilityUpdatesCorrectly() {
-        View hiddenSpinner = mView.findViewById(R.id.hidden_settings);
-        assertThat(hiddenSpinner.isEnabled()).isFalse();
-        assertThat(hiddenSpinner.getVisibility()).isEqualTo(View.GONE);
-
-        mController = new TestWifiConfigController(mConfigUiBase, mView, null /* accessPoint */,
-                WifiConfigUiBase.MODE_CONNECT);
-        assertThat(hiddenSpinner.isEnabled()).isTrue();
-        assertThat(hiddenSpinner.getVisibility()).isEqualTo(View.VISIBLE);
+        assertThat(hiddenField.getVisibility()).isEqualTo(View.VISIBLE);
     }
 
     public class TestWifiConfigController extends WifiConfigController {
index ac3ff3f..21f6daa 100644 (file)
@@ -114,7 +114,7 @@ public class WifiCallingSliceHelperTest {
         final Slice slice = mWfcSliceHelper.createWifiCallingSlice(mWfcURI);
 
         testWifiCallingSettingsUnavailableSlice(slice, null,
-                SliceBuilderUtils.getSettingsIntent(mContext));
+                WifiCallingSliceHelper.getSettingsIntent(mContext));
     }
 
     @Test
@@ -125,7 +125,7 @@ public class WifiCallingSliceHelperTest {
 
         assertThat(mWfcSliceHelper.getDefaultVoiceSubId()).isEqualTo(1);
         testWifiCallingSettingsUnavailableSlice(slice, null,
-                SliceBuilderUtils.getSettingsIntent(mContext));
+                WifiCallingSliceHelper.getSettingsIntent(mContext));
     }
 
     @Test