1/*
2 * Copyright (C) 2015 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16package com.android.systemui.qs.tiles;
17
18import android.content.Context;
19import android.content.Intent;
20import android.graphics.drawable.Drawable;
21import android.service.quicksettings.Tile;
22import android.widget.Switch;
23import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
24import com.android.settingslib.graph.BatteryMeterDrawableBase;
25import com.android.systemui.Dependency;
26import com.android.systemui.R;
27import com.android.systemui.plugins.qs.QSTile.BooleanState;
28import com.android.systemui.qs.QSHost;
29import com.android.systemui.qs.tileimpl.QSTileImpl;
30import com.android.systemui.statusbar.policy.BatteryController;
31
32public class BatterySaverTile extends QSTileImpl<BooleanState> implements
33        BatteryController.BatteryStateChangeCallback {
34
35    private final BatteryController mBatteryController;
36
37    private int mLevel;
38    private boolean mPowerSave;
39    private boolean mCharging;
40    private boolean mPluggedIn;
41
42    public BatterySaverTile(QSHost host) {
43        super(host);
44        mBatteryController = Dependency.get(BatteryController.class);
45    }
46
47    @Override
48    public BooleanState newTileState() {
49        return new BooleanState();
50    }
51
52    @Override
53    public int getMetricsCategory() {
54        return MetricsEvent.QS_BATTERY_TILE;
55    }
56
57    @Override
58    public void handleSetListening(boolean listening) {
59        if (listening) {
60            mBatteryController.addCallback(this);
61        } else {
62            mBatteryController.removeCallback(this);
63        }
64    }
65
66    @Override
67    public Intent getLongClickIntent() {
68        return new Intent(Intent.ACTION_POWER_USAGE_SUMMARY);
69    }
70
71    @Override
72    protected void handleClick() {
73        mBatteryController.setPowerSaveMode(!mPowerSave);
74    }
75
76    @Override
77    public CharSequence getTileLabel() {
78        return mContext.getString(R.string.battery_detail_switch_title);
79    }
80
81    @Override
82    protected void handleUpdateState(BooleanState state, Object arg) {
83        state.state = mPluggedIn ? Tile.STATE_UNAVAILABLE
84                : mPowerSave ? Tile.STATE_ACTIVE : Tile.STATE_INACTIVE;
85        BatterySaverIcon bsi = new BatterySaverIcon();
86        bsi.mState = state.state;
87        state.icon = bsi;
88        state.label = mContext.getString(R.string.battery_detail_switch_title);
89        state.contentDescription = state.label;
90        state.value = mPowerSave;
91        state.expandedAccessibilityClassName = Switch.class.getName();
92    }
93
94    @Override
95    public void onBatteryLevelChanged(int level, boolean pluggedIn, boolean charging) {
96        mLevel = level;
97        mPluggedIn = pluggedIn;
98        mCharging = charging;
99        refreshState(level);
100    }
101
102    @Override
103    public void onPowerSaveChanged(boolean isPowerSave) {
104        mPowerSave = isPowerSave;
105        refreshState(null);
106    }
107
108    public static class BatterySaverIcon extends Icon {
109        private int mState;
110
111        @Override
112        public Drawable getDrawable(Context context) {
113            BatterySaverDrawable b =
114                    new BatterySaverDrawable(context, QSTileImpl.getColorForState(context, mState));
115            b.mState = mState;
116            final int pad = context.getResources()
117                    .getDimensionPixelSize(R.dimen.qs_tile_divider_height);
118            b.setPadding(pad, pad, pad, pad);
119            return b;
120        }
121    }
122
123    private static class BatterySaverDrawable extends BatteryMeterDrawableBase {
124        private int mState;
125        private static final int MAX_BATTERY = 100;
126
127        BatterySaverDrawable(Context context, int frameColor) {
128            super(context, frameColor);
129            // Show as full so it's always uniform color
130            super.setBatteryLevel(MAX_BATTERY);
131            setPowerSave(true);
132            setCharging(false);
133            setPowerSaveAsColorError(false);
134            mPowerSaveAsColorError = true;
135            mFramePaint.setColor(0);
136            mPowersavePaint.setColor(frameColor);
137            mFramePaint.setStrokeWidth(mPowersavePaint.getStrokeWidth());
138            mPlusPaint.setColor(frameColor);
139        }
140
141        @Override
142        protected int batteryColorForLevel(int level) {
143            return 0;
144        }
145
146        @Override
147        public void setBatteryLevel(int val) {
148            // Don't change the actual level, otherwise this won't draw correctly
149        }
150    }
151}
152