Update app usage page with 3 radio button control

 - Improve the UX from 2 different preference column to 3 radio button,
 make the restriction state more easy to control and recognize
 Screenshot: https://screenshot.googleplex.com/4nCBnF5FzwePqrL.png

Bug: 178197718
Test: make SettingsRoboTests
Change-Id: Ic354ac91e5496c0e44c5b44142627ac8a090e30f
diff --git a/res/xml/power_usage_detail.xml b/res/xml/power_usage_detail.xml
index 95c1038..4746625 100644
--- a/res/xml/power_usage_detail.xml
+++ b/res/xml/power_usage_detail.xml
@@ -34,6 +34,30 @@
         android:title="@string/battery_detail_manage_title"
         settings:allowDividerAbove="true">
 
+        <com.android.settingslib.widget.RadioButtonPreference
+            android:key="unrestricted_pref"
+            android:summary="@string/manager_battery_usage_unrestricted_summary"
+            android:title="@string/manager_battery_usage_unrestricted_title"
+            settings:controller="com.android.settings.fuelgauge.UnrestrictedPreferenceController"/>
+
+        <com.android.settingslib.widget.RadioButtonPreference
+            android:key="optimized_pref"
+            android:summary="@string/manager_battery_usage_optimized_summary"
+            android:title="@string/manager_battery_usage_optimized_title"
+            settings:controller="com.android.settings.fuelgauge.OptimizedPreferenceController"/>
+
+        <com.android.settingslib.widget.RadioButtonPreference
+            android:key="restricted_pref"
+            android:summary="@string/manager_battery_usage_restricted_summary"
+            android:title="@string/restricted_true_label"
+            settings:controller="com.android.settings.fuelgauge.RestrictedPreferenceController"/>
+
+    </PreferenceCategory>
+
+    <PreferenceCategory
+        android:title="@string/battery_detail_manage_title"
+        settings:allowDividerAbove="true">
+
         <com.android.settingslib.RestrictedPreference
             android:key="background_activity"
             android:title="@string/background_activity_title"
diff --git a/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java b/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java
index f4bdfb3..79b5479 100644
--- a/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java
+++ b/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java
@@ -48,6 +48,7 @@
 import com.android.settingslib.core.AbstractPreferenceController;
 import com.android.settingslib.utils.StringUtil;
 import com.android.settingslib.widget.LayoutPreference;
+import com.android.settingslib.widget.RadioButtonPreference;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -60,7 +61,7 @@
  */
 public class AdvancedPowerUsageDetail extends DashboardFragment implements
         ButtonActionDialogFragment.AppButtonsDialogListener,
-        BatteryTipPreferenceController.BatteryTipListener {
+        BatteryTipPreferenceController.BatteryTipListener, RadioButtonPreference.OnClickListener {
 
     public static final String TAG = "AdvancedPowerDetail";
     public static final String EXTRA_UID = "extra_uid";
@@ -75,6 +76,9 @@
     private static final String KEY_PREF_FOREGROUND = "app_usage_foreground";
     private static final String KEY_PREF_BACKGROUND = "app_usage_background";
     private static final String KEY_PREF_HEADER = "header_view";
+    private static final String KEY_PREF_UNRESTRICTED = "unrestricted_pref";
+    private static final String KEY_PREF_OPTIMIZED = "optimized_pref";
+    private static final String KEY_PREF_RESTRICTED = "restricted_pref";
 
     private static final int REQUEST_UNINSTALL = 0;
     private static final int REQUEST_REMOVE_DEVICE_ADMIN = 1;
@@ -92,8 +96,17 @@
     Preference mForegroundPreference;
     @VisibleForTesting
     Preference mBackgroundPreference;
+    @VisibleForTesting
+    RadioButtonPreference mRestrictedPreference;
+    @VisibleForTesting
+    RadioButtonPreference mOptimizePreference;
+    @VisibleForTesting
+    RadioButtonPreference mUnrestrictedPreference;
     private AppButtonsPreferenceController mAppButtonsPreferenceController;
     private BackgroundActivityPreferenceController mBackgroundActivityPreferenceController;
+    private UnrestrictedPreferenceController mUnrestrictedPreferenceController;
+    private OptimizedPreferenceController mOptimizedPreferenceController;
+    private RestrictedPreferenceController mRestrictedPreferenceController;
 
     private String mPackageName;
 
@@ -176,6 +189,13 @@
         mBackgroundPreference = findPreference(KEY_PREF_BACKGROUND);
         mHeaderPreference = (LayoutPreference) findPreference(KEY_PREF_HEADER);
 
+        mUnrestrictedPreference  = findPreference(KEY_PREF_UNRESTRICTED);
+        mOptimizePreference  = findPreference(KEY_PREF_OPTIMIZED);
+        mRestrictedPreference  = findPreference(KEY_PREF_RESTRICTED);
+        mUnrestrictedPreference.setOnClickListener(this);
+        mOptimizePreference.setOnClickListener(this);
+        mRestrictedPreference.setOnClickListener(this);
+
         if (mPackageName != null) {
             mAppEntry = mState.getEntry(mPackageName, UserHandle.myUserId());
         }
@@ -274,6 +294,15 @@
                 (SettingsActivity) getActivity(), this, getSettingsLifecycle(), packageName, mState,
                 REQUEST_UNINSTALL, REQUEST_REMOVE_DEVICE_ADMIN);
         controllers.add(mAppButtonsPreferenceController);
+        mUnrestrictedPreferenceController =
+                new UnrestrictedPreferenceController(context, uid, packageName);
+        mOptimizedPreferenceController =
+                new OptimizedPreferenceController(context, uid, packageName);
+        mRestrictedPreferenceController =
+                new RestrictedPreferenceController(context, uid, packageName);
+        controllers.add(mUnrestrictedPreferenceController);
+        controllers.add(mOptimizedPreferenceController);
+        controllers.add(mRestrictedPreferenceController);
 
         return controllers;
     }
@@ -298,4 +327,15 @@
         mBackgroundActivityPreferenceController.updateSummary(
                 findPreference(mBackgroundActivityPreferenceController.getPreferenceKey()));
     }
+
+    @Override
+    public void onRadioButtonClicked(RadioButtonPreference selected) {
+        updatePreferenceState(mUnrestrictedPreference, selected.getKey());
+        updatePreferenceState(mOptimizePreference, selected.getKey());
+        updatePreferenceState(mRestrictedPreference, selected.getKey());
+    }
+
+    private void updatePreferenceState(RadioButtonPreference preference, String selectedKey) {
+        preference.setChecked(selectedKey.equals(preference.getKey()));
+    }
 }
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java b/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java
index 7f76c70..8eb7212 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java
@@ -58,6 +58,7 @@
 import com.android.settingslib.applications.instantapps.InstantAppDataProvider;
 import com.android.settingslib.core.lifecycle.Lifecycle;
 import com.android.settingslib.widget.LayoutPreference;
+import com.android.settingslib.widget.RadioButtonPreference;
 
 import org.junit.After;
 import org.junit.Before;
@@ -96,6 +97,9 @@
     private static final long PROCSTATE_TOP_TIME_US = PROCSTATE_TOP_TIME_MS * 1000;
     private static final long PHONE_FOREGROUND_TIME_MS = 250 * 1000;
     private static final long PHONE_BACKGROUND_TIME_MS = 0;
+    private static final String KEY_PREF_UNRESTRICTED = "unrestricted_pref";
+    private static final String KEY_PREF_OPTIMIZED = "optimized_pref";
+    private static final String KEY_PREF_RESTRICTED = "restricted_pref";
 
     @Mock(answer = Answers.RETURNS_DEEP_STUBS)
     private FragmentActivity mActivity;
@@ -124,6 +128,9 @@
     private Context mContext;
     private Preference mForegroundPreference;
     private Preference mBackgroundPreference;
+    private RadioButtonPreference mRestrictedPreference;
+    private RadioButtonPreference mOptimizePreference;
+    private RadioButtonPreference mUnrestrictedPreference;
     private AdvancedPowerUsageDetail mFragment;
     private SettingsActivity mTestActivity;
 
@@ -194,8 +201,14 @@
 
         mForegroundPreference = new Preference(mContext);
         mBackgroundPreference = new Preference(mContext);
+        mRestrictedPreference = new RadioButtonPreference(mContext);
+        mOptimizePreference = new RadioButtonPreference(mContext);
+        mUnrestrictedPreference = new RadioButtonPreference(mContext);
         mFragment.mForegroundPreference = mForegroundPreference;
         mFragment.mBackgroundPreference = mBackgroundPreference;
+        mFragment.mRestrictedPreference = mRestrictedPreference;
+        mFragment.mOptimizePreference = mOptimizePreference;
+        mFragment.mUnrestrictedPreference = mUnrestrictedPreference;
     }
 
     @After
@@ -352,4 +365,16 @@
         assertThat(mForegroundPreference.getSummary().toString()).isEqualTo("Used for 0 min");
         assertThat(mBackgroundPreference.getSummary().toString()).isEqualTo("Active for 0 min");
     }
+
+    @Test
+    public void testOnRadioButtonClicked_clickOptimizePref_optimizePreferenceChecked() {
+        mOptimizePreference.setKey(KEY_PREF_OPTIMIZED);
+        mRestrictedPreference.setKey(KEY_PREF_RESTRICTED);
+        mUnrestrictedPreference.setKey(KEY_PREF_UNRESTRICTED);
+        mFragment.onRadioButtonClicked(mOptimizePreference);
+
+        assertThat(mOptimizePreference.isChecked()).isTrue();
+        assertThat(mRestrictedPreference.isChecked()).isFalse();
+        assertThat(mUnrestrictedPreference.isChecked()).isFalse();
+    }
 }