Fix ListView being too eager too scroll

ListView is always too eager to scroll, so just stop using it.

Bug: 21853796
Change-Id: Id37d89b0312597a9fb65a33f151af34b3f395d91
diff --git a/res/layout/ignore_optimizations_content.xml b/res/layout/ignore_optimizations_content.xml
new file mode 100644
index 0000000..4641f0e
--- /dev/null
+++ b/res/layout/ignore_optimizations_content.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 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:paddingTop="8dp"
+    android:paddingBottom="8dp"
+    android:orientation="vertical">
+
+    <include
+        layout="@layout/radio_with_summary"
+        android:id="@+id/ignore_on" />
+
+    <include
+        layout="@layout/radio_with_summary"
+        android:id="@+id/ignore_off" />
+
+</LinearLayout>
diff --git a/res/layout/radio_with_summary.xml b/res/layout/radio_with_summary.xml
index 2010207..9c37050 100644
--- a/res/layout/radio_with_summary.xml
+++ b/res/layout/radio_with_summary.xml
@@ -20,6 +20,7 @@
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:orientation="vertical"
+    android:background="?android:attr/selectableItemBackground"
     android:minHeight="?android:attr/listPreferredItemHeightSmall">
 
     <CheckedTextView
diff --git a/src/com/android/settings/fuelgauge/HighPowerDetail.java b/src/com/android/settings/fuelgauge/HighPowerDetail.java
index c57a461..8c75868 100644
--- a/src/com/android/settings/fuelgauge/HighPowerDetail.java
+++ b/src/com/android/settings/fuelgauge/HighPowerDetail.java
@@ -16,7 +16,6 @@
 
 package com.android.settings.fuelgauge;
 
-import android.app.Activity;
 import android.app.AlertDialog;
 import android.app.Dialog;
 import android.app.DialogFragment;
@@ -27,18 +26,20 @@
 import android.content.pm.PackageManager;
 import android.content.pm.PackageManager.NameNotFoundException;
 import android.os.Bundle;
-import android.util.Pair;
-import android.util.SparseBooleanArray;
+import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
-import android.widget.ArrayAdapter;
+import android.view.ViewGroup.LayoutParams;
+import android.widget.Checkable;
+import android.widget.LinearLayout;
 import android.widget.TextView;
 
 import com.android.settings.R;
 import com.android.settings.applications.AppInfoBase;
 import com.android.settingslib.applications.ApplicationsState.AppEntry;
 
-public class HighPowerDetail extends DialogFragment implements OnClickListener {
+public class HighPowerDetail extends DialogFragment implements OnClickListener,
+        View.OnClickListener {
 
     private static final String ARG_DEFAULT_ON = "default_on";
 
@@ -47,8 +48,9 @@
     private String mPackageName;
     private CharSequence mLabel;
     private boolean mDefaultOn;
-    private Adapter mAdapter;
-    private int mSelectedIndex;
+    private boolean mIsEnabled;
+    private Checkable mOptionOn;
+    private Checkable mOptionOff;
 
     @Override
     public void onCreate(Bundle savedInstanceState) {
@@ -62,15 +64,20 @@
             mLabel = mPackageName;
         }
         mDefaultOn = getArguments().getBoolean(ARG_DEFAULT_ON);
-        mAdapter = new Adapter(getContext(), R.layout.radio_with_summary);
-        mAdapter.add(new Pair<String, String>(getString(R.string.ignore_optimizations_on),
-                getString(R.string.ignore_optimizations_on_desc)));
-        mAdapter.add(new Pair<String, String>(getString(R.string.ignore_optimizations_off),
-                getString(R.string.ignore_optimizations_off_desc)));
-        mSelectedIndex = mDefaultOn || mBackend.isWhitelisted(mPackageName) ? 0 : 1;
-        if (mBackend.isSysWhitelisted(mPackageName)) {
-            mAdapter.setEnabled(1, false);
+        mIsEnabled = mDefaultOn || mBackend.isWhitelisted(mPackageName);
+    }
+
+    public Checkable setup(View view, boolean on) {
+        ((TextView) view.findViewById(android.R.id.title)).setText(on
+                ? R.string.ignore_optimizations_on : R.string.ignore_optimizations_off);
+        ((TextView) view.findViewById(android.R.id.summary)).setText(on
+                ? R.string.ignore_optimizations_on_desc : R.string.ignore_optimizations_off_desc);
+        view.setClickable(true);
+        view.setOnClickListener(this);
+        if (!on && mBackend.isSysWhitelisted(mPackageName)) {
+            view.setEnabled(false);
         }
+        return (Checkable) view;
     }
 
     @Override
@@ -78,7 +85,7 @@
         AlertDialog.Builder b = new AlertDialog.Builder(getContext())
                 .setTitle(getString(R.string.ignore_optimizations_title, mLabel))
                 .setNegativeButton(R.string.cancel, null)
-                .setSingleChoiceItems(mAdapter, mSelectedIndex, this);
+                .setView(R.layout.ignore_optimizations_content);
         if (!mBackend.isSysWhitelisted(mPackageName)) {
             b.setPositiveButton(R.string.done, this);
         }
@@ -86,9 +93,33 @@
     }
 
     @Override
+    public void onStart() {
+        super.onStart();
+        mOptionOn = setup(getDialog().findViewById(R.id.ignore_on), true);
+        mOptionOff = setup(getDialog().findViewById(R.id.ignore_off), false);
+        updateViews();
+    }
+
+    private void updateViews() {
+        mOptionOn.setChecked(mIsEnabled);
+        mOptionOff.setChecked(!mIsEnabled);
+    }
+
+    @Override
+    public void onClick(View v) {
+        if (v == mOptionOn) {
+            mIsEnabled = true;
+            updateViews();
+        } else if (v == mOptionOff) {
+            mIsEnabled = false;
+            updateViews();
+        }
+    }
+
+    @Override
     public void onClick(DialogInterface dialog, int which) {
         if (which == DialogInterface.BUTTON_POSITIVE) {
-            boolean newValue = mSelectedIndex == 0;
+            boolean newValue = mIsEnabled;
             boolean oldValue = mBackend.isWhitelisted(mPackageName);
             if (newValue != oldValue) {
                 if (newValue) {
@@ -97,8 +128,6 @@
                     mBackend.removeApp(mPackageName);
                 }
             }
-        } else {
-            mSelectedIndex = which;
         }
     }
 
@@ -130,29 +159,4 @@
         fragment.setTargetFragment(caller, requestCode);
         fragment.show(caller.getFragmentManager(), HighPowerDetail.class.getSimpleName());
     }
-
-    private class Adapter extends ArrayAdapter<Pair<String, String>> {
-        private final SparseBooleanArray mEnabled = new SparseBooleanArray();
-
-        public Adapter(Context context, int resource) {
-            super(context, resource, android.R.id.title);
-        }
-
-        public void setEnabled(int index, boolean enabled) {
-            mEnabled.put(index, enabled);
-        }
-
-        public boolean isEnabled(int position) {
-            return mEnabled.get(position, true);
-        }
-
-        @Override
-        public View getView(int position, View convertView, ViewGroup parent) {
-            View view = super.getView(position, convertView, parent);
-            ((TextView) view.findViewById(android.R.id.title)).setText(getItem(position).first);
-            ((TextView) view.findViewById(android.R.id.summary)).setText(getItem(position).second);
-            view.setEnabled(isEnabled(position));
-            return view;
-        }
-    }
 }