SystemUI demo mode.

Control the status bar visuals via a simple intent protocol.
Useful for comprehensive visual testing reachable assets
and the various bar modes.

Protected behind a global system setting.  To enable:
  adb shell settings put global sysui_demo_allowed 1

Remove obsolete sync failing asset, and tighten up
BluetoothController to represent reality.

Bug:10502089
Change-Id: I28443af3d6b22fcb7b367ef70e1d95fc23ebd407
diff --git a/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java b/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java
index 1165b8d..6a0f6e3 100755
--- a/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java
+++ b/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java
@@ -29,11 +29,12 @@
 import android.graphics.Typeface;
 import android.graphics.drawable.Drawable;
 import android.os.BatteryManager;
+import android.os.Bundle;
 import android.provider.Settings;
 import android.util.AttributeSet;
 import android.view.View;
 
-public class BatteryMeterView extends View {
+public class BatteryMeterView extends View implements DemoMode {
     public static final String TAG = BatteryMeterView.class.getSimpleName();
     public static final String ACTION_LEVEL_TEST = "com.android.systemui.BATTERY_LEVEL_TEST";
 
@@ -204,7 +205,6 @@
     }
 
     private int getColorForLevel(int percent) {
-        if (mTracker.plugged) return mChargeColor;
         int thresh, color = 0;
         for (int i=0; i<mColors.length; i+=2) {
             thresh = mColors[i];
@@ -216,7 +216,8 @@
 
     @Override
     public void draw(Canvas c) {
-        final int level = mTracker.level;
+        BatteryTracker tracker = mDemoMode ? mDemoTracker : mTracker;
+        final int level = tracker.level;
         float drawFrac = (float) level / 100f;
         final int pt = getPaddingTop();
         final int pl = getPaddingLeft();
@@ -245,8 +246,8 @@
         c.drawRect(frame, mFramePaint);
 
         // fill 'er up
-        final int pct = mTracker.level;
-        final int color = getColorForLevel(pct);
+        final int pct = tracker.level;
+        final int color = tracker.plugged ? mChargeColor : getColorForLevel(pct);
         mBatteryPaint.setColor(color);
 
         if (level >= FULL) {
@@ -270,16 +271,16 @@
             final float x = mWidth * 0.5f;
             final float y = (mHeight + mWarningTextHeight) * 0.48f;
             c.drawText(mWarningString, x, y, mWarningTextPaint);
-        } else if (mTracker.plugged) {
+        } else if (tracker.plugged) {
             final Rect r = new Rect(
                     (int)frame.left + width / 4,  (int)frame.top + height / 5,
                     (int)frame.right - width / 4, (int)frame.bottom - height / 6);
             mLightning.setBounds(r);
             mLightning.draw(c);
-        } else if (mShowPercent && !(mTracker.level == 100 && !SHOW_100_PERCENT)) {
+        } else if (mShowPercent && !(tracker.level == 100 && !SHOW_100_PERCENT)) {
             mTextPaint.setTextSize(height *
                     (SINGLE_DIGIT_PERCENT ? 0.75f
-                            : (mTracker.level == 100 ? 0.38f : 0.5f)));
+                            : (tracker.level == 100 ? 0.38f : 0.5f)));
             mTextHeight = -mTextPaint.getFontMetrics().ascent;
 
             final String str = String.valueOf(SINGLE_DIGIT_PERCENT ? (pct/10) : pct);
@@ -302,4 +303,29 @@
 //            c.drawRect(1, 1, mWidth, mHeight, pt);
         }
     }
+
+    private boolean mDemoMode;
+    private BatteryTracker mDemoTracker = new BatteryTracker();
+
+    @Override
+    public void dispatchDemoCommand(String command, Bundle args) {
+        if (!mDemoMode && command.equals(COMMAND_ENTER)) {
+            mDemoMode = true;
+            mDemoTracker.level = mTracker.level;
+            mDemoTracker.plugged = mTracker.plugged;
+        } else if (mDemoMode && command.equals(COMMAND_EXIT)) {
+            mDemoMode = false;
+            postInvalidate();
+        } else if (mDemoMode && command.equals(COMMAND_BATTERY)) {
+           String level = args.getString("level");
+           String plugged = args.getString("plugged");
+           if (level != null) {
+               mDemoTracker.level = Math.min(Math.max(Integer.parseInt(level), 0), 100);
+           }
+           if (plugged != null) {
+               mDemoTracker.plugged = Boolean.parseBoolean(plugged);
+           }
+           postInvalidate();
+        }
+    }
 }