sysui: refactor for extensibility.

1. Refactor the interfaces of the slider out side the ToggleSlider class.
2. BrightnessController now takes in only an IToggleSlider interface instead of
   the view.

Bug: 28172423
Change-Id: Iff463a30e149f17795ccaffca66040d64f44a643
(cherry picked from commit 89c0cb853175c66769d287b8d6cf82c7166e0e6e)
diff --git a/packages/SystemUI/res/layout/quick_settings_brightness_dialog.xml b/packages/SystemUI/res/layout/quick_settings_brightness_dialog.xml
index 5fde4f6..79a5e2f 100644
--- a/packages/SystemUI/res/layout/quick_settings_brightness_dialog.xml
+++ b/packages/SystemUI/res/layout/quick_settings_brightness_dialog.xml
@@ -30,7 +30,7 @@
         android:contentDescription="@null"
         android:visibility="gone" />
 
-    <com.android.systemui.settings.ToggleSlider
+    <com.android.systemui.settings.ToggleSliderView
         android:id="@+id/brightness_slider"
         android:layout_width="0dp"
         android:layout_height="wrap_content"
diff --git a/packages/SystemUI/res/values/attrs.xml b/packages/SystemUI/res/values/attrs.xml
index 1543360..41017e8 100644
--- a/packages/SystemUI/res/values/attrs.xml
+++ b/packages/SystemUI/res/values/attrs.xml
@@ -22,7 +22,7 @@
         <attr name="keyRepeat" format="boolean" />
         <attr name="android:contentDescription" />
     </declare-styleable>
-    <declare-styleable name="ToggleSlider">
+    <declare-styleable name="ToggleSliderView">
         <attr name="text" format="string" />
     </declare-styleable>
     <declare-styleable name="NotificationLinearLayout">
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java
index 05090c3..221da4e 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java
@@ -35,7 +35,7 @@
 import com.android.systemui.qs.customize.QSCustomizer;
 import com.android.systemui.qs.external.CustomTile;
 import com.android.systemui.settings.BrightnessController;
-import com.android.systemui.settings.ToggleSlider;
+import com.android.systemui.settings.ToggleSliderView;
 import com.android.systemui.statusbar.phone.QSTileHost;
 import com.android.systemui.statusbar.policy.BrightnessMirrorController;
 import com.android.systemui.tuner.TunerService;
@@ -94,7 +94,7 @@
 
         mBrightnessController = new BrightnessController(getContext(),
                 (ImageView) findViewById(R.id.brightness_icon),
-                (ToggleSlider) findViewById(R.id.brightness_slider));
+                (ToggleSliderView) findViewById(R.id.brightness_slider));
 
     }
 
@@ -158,8 +158,9 @@
 
     public void setBrightnessMirror(BrightnessMirrorController c) {
         super.onFinishInflate();
-        ToggleSlider brightnessSlider = (ToggleSlider) findViewById(R.id.brightness_slider);
-        ToggleSlider mirror = (ToggleSlider) c.getMirror().findViewById(R.id.brightness_slider);
+        ToggleSliderView brightnessSlider = (ToggleSliderView) findViewById(R.id.brightness_slider);
+        ToggleSliderView mirror = (ToggleSliderView) c.getMirror().findViewById(
+                R.id.brightness_slider);
         brightnessSlider.setMirror(mirror);
         brightnessSlider.setMirrorController(c);
     }
diff --git a/packages/SystemUI/src/com/android/systemui/settings/BrightnessController.java b/packages/SystemUI/src/com/android/systemui/settings/BrightnessController.java
index d5131be..a89fdbd 100644
--- a/packages/SystemUI/src/com/android/systemui/settings/BrightnessController.java
+++ b/packages/SystemUI/src/com/android/systemui/settings/BrightnessController.java
@@ -198,8 +198,8 @@
     }
 
     @Override
-    public void onChanged(ToggleSlider view, boolean tracking, boolean automatic, int value,
-            boolean stopTracking) {
+    public void onChanged(ToggleSlider toggleSlider, boolean tracking, boolean automatic,
+            int value, boolean stopTracking) {
         updateIcon(mAutomatic);
         if (mExternalChange) return;
 
diff --git a/packages/SystemUI/src/com/android/systemui/settings/BrightnessDialog.java b/packages/SystemUI/src/com/android/systemui/settings/BrightnessDialog.java
index 4952234..803fe48 100644
--- a/packages/SystemUI/src/com/android/systemui/settings/BrightnessDialog.java
+++ b/packages/SystemUI/src/com/android/systemui/settings/BrightnessDialog.java
@@ -46,7 +46,7 @@
         setContentView(R.layout.quick_settings_brightness_dialog);
 
         final ImageView icon = (ImageView) findViewById(R.id.brightness_icon);
-        final ToggleSlider slider = (ToggleSlider) findViewById(R.id.brightness_slider);
+        final ToggleSliderView slider = (ToggleSliderView) findViewById(R.id.brightness_slider);
         mBrightnessController = new BrightnessController(this, icon, slider);
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/settings/ToggleSlider.java b/packages/SystemUI/src/com/android/systemui/settings/ToggleSlider.java
index b263707..62abf3d 100644
--- a/packages/SystemUI/src/com/android/systemui/settings/ToggleSlider.java
+++ b/packages/SystemUI/src/com/android/systemui/settings/ToggleSlider.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2013 The Android Open Source Project
+ * 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.
@@ -11,187 +11,21 @@
  * 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.
+ * limitations under the License
  */
 
 package com.android.systemui.settings;
 
-import android.content.Context;
-import android.content.res.Resources;
-import android.content.res.TypedArray;
-import android.util.AttributeSet;
-import android.view.MotionEvent;
-import android.view.View;
-import android.widget.CompoundButton;
-import android.widget.CompoundButton.OnCheckedChangeListener;
-import android.widget.RelativeLayout;
-import android.widget.SeekBar;
-import android.widget.SeekBar.OnSeekBarChangeListener;
-import android.widget.TextView;
-
-import com.android.systemui.R;
-import com.android.systemui.statusbar.policy.BrightnessMirrorController;
-
-public class ToggleSlider extends RelativeLayout {
-    public interface Listener {
-        public void onInit(ToggleSlider v);
-        public void onChanged(ToggleSlider v, boolean tracking, boolean checked, int value,
-                boolean stopTracking);
+public interface ToggleSlider {
+    interface Listener {
+        void onInit(ToggleSlider control);
+        void onChanged(ToggleSlider slider, boolean tracking, boolean automatic, int value,
+                       boolean stopTracking);
     }
 
-    private Listener mListener;
-    private boolean mTracking;
-
-    private CompoundButton mToggle;
-    private ToggleSeekBar mSlider;
-    private TextView mLabel;
-
-    private ToggleSlider mMirror;
-    private BrightnessMirrorController mMirrorController;
-
-    public ToggleSlider(Context context) {
-        this(context, null);
-    }
-
-    public ToggleSlider(Context context, AttributeSet attrs) {
-        this(context, attrs, 0);
-    }
-
-    public ToggleSlider(Context context, AttributeSet attrs, int defStyle) {
-        super(context, attrs, defStyle);
-
-        View.inflate(context, R.layout.status_bar_toggle_slider, this);
-
-        final Resources res = context.getResources();
-        final TypedArray a = context.obtainStyledAttributes(
-                attrs, R.styleable.ToggleSlider, defStyle, 0);
-
-        mToggle = (CompoundButton) findViewById(R.id.toggle);
-        mToggle.setOnCheckedChangeListener(mCheckListener);
-
-        mSlider = (ToggleSeekBar) findViewById(R.id.slider);
-        mSlider.setOnSeekBarChangeListener(mSeekListener);
-
-        mLabel = (TextView) findViewById(R.id.label);
-        mLabel.setText(a.getString(R.styleable.ToggleSlider_text));
-
-        mSlider.setAccessibilityLabel(getContentDescription().toString());
-
-        a.recycle();
-    }
-
-    public void setMirror(ToggleSlider toggleSlider) {
-        mMirror = toggleSlider;
-        if (mMirror != null) {
-            mMirror.setChecked(mToggle.isChecked());
-            mMirror.setMax(mSlider.getMax());
-            mMirror.setValue(mSlider.getProgress());
-        }
-    }
-
-    public void setMirrorController(BrightnessMirrorController c) {
-        mMirrorController = c;
-    }
-
-    @Override
-    protected void onAttachedToWindow() {
-        super.onAttachedToWindow();
-        if (mListener != null) {
-            mListener.onInit(this);
-        }
-    }
-
-    public void setOnChangedListener(Listener l) {
-        mListener = l;
-    }
-
-    public void setChecked(boolean checked) {
-        mToggle.setChecked(checked);
-    }
-
-    public boolean isChecked() {
-        return mToggle.isChecked();
-    }
-
-    public void setMax(int max) {
-        mSlider.setMax(max);
-        if (mMirror != null) {
-            mMirror.setMax(max);
-        }
-    }
-
-    public void setValue(int value) {
-        mSlider.setProgress(value);
-        if (mMirror != null) {
-            mMirror.setValue(value);
-        }
-    }
-
-    @Override
-    public boolean dispatchTouchEvent(MotionEvent ev) {
-        if (mMirror != null) {
-            MotionEvent copy = ev.copy();
-            mMirror.dispatchTouchEvent(copy);
-            copy.recycle();
-        }
-        return super.dispatchTouchEvent(ev);
-    }
-
-    private final OnCheckedChangeListener mCheckListener = new OnCheckedChangeListener() {
-        @Override
-        public void onCheckedChanged(CompoundButton toggle, boolean checked) {
-            mSlider.setEnabled(!checked);
-
-            if (mListener != null) {
-                mListener.onChanged(
-                        ToggleSlider.this, mTracking, checked, mSlider.getProgress(), false);
-            }
-
-            if (mMirror != null) {
-                mMirror.mToggle.setChecked(checked);
-            }
-        }
-    };
-
-    private final OnSeekBarChangeListener mSeekListener = new OnSeekBarChangeListener() {
-        @Override
-        public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
-            if (mListener != null) {
-                mListener.onChanged(
-                        ToggleSlider.this, mTracking, mToggle.isChecked(), progress, false);
-            }
-        }
-
-        @Override
-        public void onStartTrackingTouch(SeekBar seekBar) {
-            mTracking = true;
-
-            if (mListener != null) {
-                mListener.onChanged(ToggleSlider.this, mTracking, mToggle.isChecked(),
-                        mSlider.getProgress(), false);
-            }
-
-            mToggle.setChecked(false);
-
-            if (mMirrorController != null) {
-                mMirrorController.showMirror();
-                mMirrorController.setLocation((View) getParent());
-            }
-        }
-
-        @Override
-        public void onStopTrackingTouch(SeekBar seekBar) {
-            mTracking = false;
-
-            if (mListener != null) {
-                mListener.onChanged(ToggleSlider.this, mTracking, mToggle.isChecked(),
-                        mSlider.getProgress(), true);
-            }
-
-            if (mMirrorController != null) {
-                mMirrorController.hideMirror();
-            }
-        }
-    };
+    void setOnChangedListener(Listener l);
+    default void setChecked(boolean checked) {}
+    default boolean isChecked() { return false; }
+    void setMax(int max);
+    void setValue(int value);
 }
-
diff --git a/packages/SystemUI/src/com/android/systemui/settings/ToggleSliderView.java b/packages/SystemUI/src/com/android/systemui/settings/ToggleSliderView.java
new file mode 100644
index 0000000..afe89ec
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/settings/ToggleSliderView.java
@@ -0,0 +1,195 @@
+/*
+ * Copyright (C) 2013 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.systemui.settings;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.content.res.TypedArray;
+import android.util.AttributeSet;
+import android.view.MotionEvent;
+import android.view.View;
+import android.widget.CompoundButton;
+import android.widget.CompoundButton.OnCheckedChangeListener;
+import android.widget.RelativeLayout;
+import android.widget.SeekBar;
+import android.widget.SeekBar.OnSeekBarChangeListener;
+import android.widget.TextView;
+
+import com.android.systemui.R;
+import com.android.systemui.statusbar.policy.BrightnessMirrorController;
+
+public class ToggleSliderView extends RelativeLayout implements ToggleSlider {
+    private Listener mListener;
+    private boolean mTracking;
+
+    private CompoundButton mToggle;
+    private ToggleSeekBar mSlider;
+    private TextView mLabel;
+
+    private ToggleSliderView mMirror;
+    private BrightnessMirrorController mMirrorController;
+
+    public ToggleSliderView(Context context) {
+        this(context, null);
+    }
+
+    public ToggleSliderView(Context context, AttributeSet attrs) {
+        this(context, attrs, 0);
+    }
+
+    public ToggleSliderView(Context context, AttributeSet attrs, int defStyle) {
+        super(context, attrs, defStyle);
+
+        View.inflate(context, R.layout.status_bar_toggle_slider, this);
+
+        final Resources res = context.getResources();
+        final TypedArray a = context.obtainStyledAttributes(
+                attrs, R.styleable.ToggleSliderView, defStyle, 0);
+
+        mToggle = (CompoundButton) findViewById(R.id.toggle);
+        mToggle.setOnCheckedChangeListener(mCheckListener);
+
+        mSlider = (ToggleSeekBar) findViewById(R.id.slider);
+        mSlider.setOnSeekBarChangeListener(mSeekListener);
+
+        mLabel = (TextView) findViewById(R.id.label);
+        mLabel.setText(a.getString(R.styleable.ToggleSliderView_text));
+
+        mSlider.setAccessibilityLabel(getContentDescription().toString());
+
+        a.recycle();
+    }
+
+    public void setMirror(ToggleSliderView toggleSlider) {
+        mMirror = toggleSlider;
+        if (mMirror != null) {
+            mMirror.setChecked(mToggle.isChecked());
+            mMirror.setMax(mSlider.getMax());
+            mMirror.setValue(mSlider.getProgress());
+        }
+    }
+
+    public void setMirrorController(BrightnessMirrorController c) {
+        mMirrorController = c;
+    }
+
+    @Override
+    protected void onAttachedToWindow() {
+        super.onAttachedToWindow();
+        if (mListener != null) {
+            mListener.onInit(this);
+        }
+    }
+
+    public void setOnChangedListener(Listener l) {
+        mListener = l;
+    }
+
+    @Override
+    public void setChecked(boolean checked) {
+        mToggle.setChecked(checked);
+    }
+
+    @Override
+    public boolean isChecked() {
+        return mToggle.isChecked();
+    }
+
+    @Override
+    public void setMax(int max) {
+        mSlider.setMax(max);
+        if (mMirror != null) {
+            mMirror.setMax(max);
+        }
+    }
+
+    @Override
+    public void setValue(int value) {
+        mSlider.setProgress(value);
+        if (mMirror != null) {
+            mMirror.setValue(value);
+        }
+    }
+
+    @Override
+    public boolean dispatchTouchEvent(MotionEvent ev) {
+        if (mMirror != null) {
+            MotionEvent copy = ev.copy();
+            mMirror.dispatchTouchEvent(copy);
+            copy.recycle();
+        }
+        return super.dispatchTouchEvent(ev);
+    }
+
+    private final OnCheckedChangeListener mCheckListener = new OnCheckedChangeListener() {
+        @Override
+        public void onCheckedChanged(CompoundButton toggle, boolean checked) {
+            mSlider.setEnabled(!checked);
+
+            if (mListener != null) {
+                mListener.onChanged(
+                        ToggleSliderView.this, mTracking, checked, mSlider.getProgress(), false);
+            }
+
+            if (mMirror != null) {
+                mMirror.mToggle.setChecked(checked);
+            }
+        }
+    };
+
+    private final OnSeekBarChangeListener mSeekListener = new OnSeekBarChangeListener() {
+        @Override
+        public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
+            if (mListener != null) {
+                mListener.onChanged(
+                        ToggleSliderView.this, mTracking, mToggle.isChecked(), progress, false);
+            }
+        }
+
+        @Override
+        public void onStartTrackingTouch(SeekBar seekBar) {
+            mTracking = true;
+
+            if (mListener != null) {
+                mListener.onChanged(ToggleSliderView.this, mTracking, mToggle.isChecked(),
+                        mSlider.getProgress(), false);
+            }
+
+            mToggle.setChecked(false);
+
+            if (mMirrorController != null) {
+                mMirrorController.showMirror();
+                mMirrorController.setLocation((View) getParent());
+            }
+        }
+
+        @Override
+        public void onStopTrackingTouch(SeekBar seekBar) {
+            mTracking = false;
+
+            if (mListener != null) {
+                mListener.onChanged(ToggleSliderView.this, mTracking, mToggle.isChecked(),
+                        mSlider.getProgress(), true);
+            }
+
+            if (mMirrorController != null) {
+                mMirrorController.hideMirror();
+            }
+        }
+    };
+}
+