1abe1974a11364b577e94966ca87047d7889c8edfJason Monk/*
2abe1974a11364b577e94966ca87047d7889c8edfJason Monk * Copyright (C) 2015 The Android Open Source Project
3abe1974a11364b577e94966ca87047d7889c8edfJason Monk *
4abe1974a11364b577e94966ca87047d7889c8edfJason Monk * Licensed under the Apache License, Version 2.0 (the "License");
5abe1974a11364b577e94966ca87047d7889c8edfJason Monk * you may not use this file except in compliance with the License.
6abe1974a11364b577e94966ca87047d7889c8edfJason Monk * You may obtain a copy of the License at
7abe1974a11364b577e94966ca87047d7889c8edfJason Monk *
8abe1974a11364b577e94966ca87047d7889c8edfJason Monk *      http://www.apache.org/licenses/LICENSE-2.0
9abe1974a11364b577e94966ca87047d7889c8edfJason Monk *
10abe1974a11364b577e94966ca87047d7889c8edfJason Monk * Unless required by applicable law or agreed to in writing, software
11abe1974a11364b577e94966ca87047d7889c8edfJason Monk * distributed under the License is distributed on an "AS IS" BASIS,
12abe1974a11364b577e94966ca87047d7889c8edfJason Monk * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13abe1974a11364b577e94966ca87047d7889c8edfJason Monk * See the License for the specific language governing permissions and
14abe1974a11364b577e94966ca87047d7889c8edfJason Monk * limitations under the License.
15abe1974a11364b577e94966ca87047d7889c8edfJason Monk */
16abe1974a11364b577e94966ca87047d7889c8edfJason Monkpackage com.android.systemui.qs.tiles;
17abe1974a11364b577e94966ca87047d7889c8edfJason Monk
186f4179c3b8788456095ec79fd35e7c1a3d0589a0Evan Lairdimport android.content.Context;
19abe1974a11364b577e94966ca87047d7889c8edfJason Monkimport android.content.Intent;
206f4179c3b8788456095ec79fd35e7c1a3d0589a0Evan Lairdimport android.graphics.drawable.Drawable;
2176471a5d9ec3a5d66c43f6afa5d7274c6d58a8cajackqdyuleiimport android.service.quicksettings.Tile;
22e5c3ed186484820b48fa4ee722c40f96f9ff5b84Jason Monkimport android.widget.Switch;
23383db5ebcc3a4a615faf249bf4f126f42e80b82eTamas Berghammerimport com.android.internal.logging.nano.MetricsProto.MetricsEvent;
246f4179c3b8788456095ec79fd35e7c1a3d0589a0Evan Lairdimport com.android.settingslib.graph.BatteryMeterDrawableBase;
259c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monkimport com.android.systemui.Dependency;
26abe1974a11364b577e94966ca87047d7889c8edfJason Monkimport com.android.systemui.R;
27702e2ebf9fbfb715c1d9b716683c9e4d182b575eJason Monkimport com.android.systemui.plugins.qs.QSTile.BooleanState;
28d70f423d093c3728c3ed2d3859195e94cd3b97eeJason Monkimport com.android.systemui.qs.QSHost;
29702e2ebf9fbfb715c1d9b716683c9e4d182b575eJason Monkimport com.android.systemui.qs.tileimpl.QSTileImpl;
30abe1974a11364b577e94966ca87047d7889c8edfJason Monkimport com.android.systemui.statusbar.policy.BatteryController;
31abe1974a11364b577e94966ca87047d7889c8edfJason Monk
32702e2ebf9fbfb715c1d9b716683c9e4d182b575eJason Monkpublic class BatterySaverTile extends QSTileImpl<BooleanState> implements
33e5c3ed186484820b48fa4ee722c40f96f9ff5b84Jason Monk        BatteryController.BatteryStateChangeCallback {
34abe1974a11364b577e94966ca87047d7889c8edfJason Monk
35abe1974a11364b577e94966ca87047d7889c8edfJason Monk    private final BatteryController mBatteryController;
36abe1974a11364b577e94966ca87047d7889c8edfJason Monk
37abe1974a11364b577e94966ca87047d7889c8edfJason Monk    private int mLevel;
38c06fbb12984a3d3e4c80ab9f819841acae5b0133Jason Monk    private boolean mPowerSave;
39c06fbb12984a3d3e4c80ab9f819841acae5b0133Jason Monk    private boolean mCharging;
408b2ce60ba84d9361ca056468c5f9092123a16ce2Jason Monk    private boolean mPluggedIn;
41abe1974a11364b577e94966ca87047d7889c8edfJason Monk
42702e2ebf9fbfb715c1d9b716683c9e4d182b575eJason Monk    public BatterySaverTile(QSHost host) {
43abe1974a11364b577e94966ca87047d7889c8edfJason Monk        super(host);
449c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk        mBatteryController = Dependency.get(BatteryController.class);
45abe1974a11364b577e94966ca87047d7889c8edfJason Monk    }
46abe1974a11364b577e94966ca87047d7889c8edfJason Monk
47abe1974a11364b577e94966ca87047d7889c8edfJason Monk    @Override
48e5c3ed186484820b48fa4ee722c40f96f9ff5b84Jason Monk    public BooleanState newTileState() {
49e5c3ed186484820b48fa4ee722c40f96f9ff5b84Jason Monk        return new BooleanState();
50c06fbb12984a3d3e4c80ab9f819841acae5b0133Jason Monk    }
51c06fbb12984a3d3e4c80ab9f819841acae5b0133Jason Monk
52c06fbb12984a3d3e4c80ab9f819841acae5b0133Jason Monk    @Override
53abe1974a11364b577e94966ca87047d7889c8edfJason Monk    public int getMetricsCategory() {
54f6e9228b8a97603d3ceb8f0d61e8d87cf19bd21fChris Wren        return MetricsEvent.QS_BATTERY_TILE;
55abe1974a11364b577e94966ca87047d7889c8edfJason Monk    }
56abe1974a11364b577e94966ca87047d7889c8edfJason Monk
57abe1974a11364b577e94966ca87047d7889c8edfJason Monk    @Override
581c6116cbbb0c8000b576443e4b13026b1d8529d9Jason Monk    public void handleSetListening(boolean listening) {
59abe1974a11364b577e94966ca87047d7889c8edfJason Monk        if (listening) {
608852905b0b3837e326127c6dfef6f699124ce715Jason Monk            mBatteryController.addCallback(this);
61abe1974a11364b577e94966ca87047d7889c8edfJason Monk        } else {
628852905b0b3837e326127c6dfef6f699124ce715Jason Monk            mBatteryController.removeCallback(this);
63abe1974a11364b577e94966ca87047d7889c8edfJason Monk        }
64abe1974a11364b577e94966ca87047d7889c8edfJason Monk    }
65abe1974a11364b577e94966ca87047d7889c8edfJason Monk
66abe1974a11364b577e94966ca87047d7889c8edfJason Monk    @Override
6776c67aa361f65dfb2f5e03d06cc1ccebce9cecd9Jason Monk    public Intent getLongClickIntent() {
6876c67aa361f65dfb2f5e03d06cc1ccebce9cecd9Jason Monk        return new Intent(Intent.ACTION_POWER_USAGE_SUMMARY);
6976c67aa361f65dfb2f5e03d06cc1ccebce9cecd9Jason Monk    }
7076c67aa361f65dfb2f5e03d06cc1ccebce9cecd9Jason Monk
7176c67aa361f65dfb2f5e03d06cc1ccebce9cecd9Jason Monk    @Override
72abe1974a11364b577e94966ca87047d7889c8edfJason Monk    protected void handleClick() {
733250885c9feb9b42d60058a823c57a027c0dcf58Jason Monk        mBatteryController.setPowerSaveMode(!mPowerSave);
743250885c9feb9b42d60058a823c57a027c0dcf58Jason Monk    }
753250885c9feb9b42d60058a823c57a027c0dcf58Jason Monk
763250885c9feb9b42d60058a823c57a027c0dcf58Jason Monk    @Override
7739c98e652fd3e0e3ea3a334d60ba6ee979985978Jason Monk    public CharSequence getTileLabel() {
78d70f423d093c3728c3ed2d3859195e94cd3b97eeJason Monk        return mContext.getString(R.string.battery_detail_switch_title);
7939c98e652fd3e0e3ea3a334d60ba6ee979985978Jason Monk    }
8039c98e652fd3e0e3ea3a334d60ba6ee979985978Jason Monk
8139c98e652fd3e0e3ea3a334d60ba6ee979985978Jason Monk    @Override
82e5c3ed186484820b48fa4ee722c40f96f9ff5b84Jason Monk    protected void handleUpdateState(BooleanState state, Object arg) {
83afa5f27dc664c08c4f4bc2b5fbbe027b3e80b98ejackqdyulei        state.state = mPluggedIn ? Tile.STATE_UNAVAILABLE
843250885c9feb9b42d60058a823c57a027c0dcf58Jason Monk                : mPowerSave ? Tile.STATE_ACTIVE : Tile.STATE_INACTIVE;
856f4179c3b8788456095ec79fd35e7c1a3d0589a0Evan Laird        BatterySaverIcon bsi = new BatterySaverIcon();
866f4179c3b8788456095ec79fd35e7c1a3d0589a0Evan Laird        bsi.mState = state.state;
876f4179c3b8788456095ec79fd35e7c1a3d0589a0Evan Laird        state.icon = bsi;
883250885c9feb9b42d60058a823c57a027c0dcf58Jason Monk        state.label = mContext.getString(R.string.battery_detail_switch_title);
89e5c3ed186484820b48fa4ee722c40f96f9ff5b84Jason Monk        state.contentDescription = state.label;
90e5c3ed186484820b48fa4ee722c40f96f9ff5b84Jason Monk        state.value = mPowerSave;
91702e2ebf9fbfb715c1d9b716683c9e4d182b575eJason Monk        state.expandedAccessibilityClassName = Switch.class.getName();
92abe1974a11364b577e94966ca87047d7889c8edfJason Monk    }
93abe1974a11364b577e94966ca87047d7889c8edfJason Monk
94abe1974a11364b577e94966ca87047d7889c8edfJason Monk    @Override
95abe1974a11364b577e94966ca87047d7889c8edfJason Monk    public void onBatteryLevelChanged(int level, boolean pluggedIn, boolean charging) {
96abe1974a11364b577e94966ca87047d7889c8edfJason Monk        mLevel = level;
978b2ce60ba84d9361ca056468c5f9092123a16ce2Jason Monk        mPluggedIn = pluggedIn;
98c06fbb12984a3d3e4c80ab9f819841acae5b0133Jason Monk        mCharging = charging;
993250885c9feb9b42d60058a823c57a027c0dcf58Jason Monk        refreshState(level);
100abe1974a11364b577e94966ca87047d7889c8edfJason Monk    }
101abe1974a11364b577e94966ca87047d7889c8edfJason Monk
102abe1974a11364b577e94966ca87047d7889c8edfJason Monk    @Override
103c06fbb12984a3d3e4c80ab9f819841acae5b0133Jason Monk    public void onPowerSaveChanged(boolean isPowerSave) {
104c06fbb12984a3d3e4c80ab9f819841acae5b0133Jason Monk        mPowerSave = isPowerSave;
1058b2ce60ba84d9361ca056468c5f9092123a16ce2Jason Monk        refreshState(null);
106abe1974a11364b577e94966ca87047d7889c8edfJason Monk    }
1076f4179c3b8788456095ec79fd35e7c1a3d0589a0Evan Laird
1086f4179c3b8788456095ec79fd35e7c1a3d0589a0Evan Laird    public static class BatterySaverIcon extends Icon {
1096f4179c3b8788456095ec79fd35e7c1a3d0589a0Evan Laird        private int mState;
1106f4179c3b8788456095ec79fd35e7c1a3d0589a0Evan Laird
1116f4179c3b8788456095ec79fd35e7c1a3d0589a0Evan Laird        @Override
1126f4179c3b8788456095ec79fd35e7c1a3d0589a0Evan Laird        public Drawable getDrawable(Context context) {
11381905164906b49ac4c5d84761088e9164fd9877cEvan Laird            BatterySaverDrawable b =
11481905164906b49ac4c5d84761088e9164fd9877cEvan Laird                    new BatterySaverDrawable(context, QSTileImpl.getColorForState(context, mState));
1156f4179c3b8788456095ec79fd35e7c1a3d0589a0Evan Laird            b.mState = mState;
1166f4179c3b8788456095ec79fd35e7c1a3d0589a0Evan Laird            final int pad = context.getResources()
1176f4179c3b8788456095ec79fd35e7c1a3d0589a0Evan Laird                    .getDimensionPixelSize(R.dimen.qs_tile_divider_height);
1186f4179c3b8788456095ec79fd35e7c1a3d0589a0Evan Laird            b.setPadding(pad, pad, pad, pad);
1196f4179c3b8788456095ec79fd35e7c1a3d0589a0Evan Laird            return b;
1206f4179c3b8788456095ec79fd35e7c1a3d0589a0Evan Laird        }
1216f4179c3b8788456095ec79fd35e7c1a3d0589a0Evan Laird    }
1226f4179c3b8788456095ec79fd35e7c1a3d0589a0Evan Laird
1236f4179c3b8788456095ec79fd35e7c1a3d0589a0Evan Laird    private static class BatterySaverDrawable extends BatteryMeterDrawableBase {
1246f4179c3b8788456095ec79fd35e7c1a3d0589a0Evan Laird        private int mState;
1256f4179c3b8788456095ec79fd35e7c1a3d0589a0Evan Laird        private static final int MAX_BATTERY = 100;
1266f4179c3b8788456095ec79fd35e7c1a3d0589a0Evan Laird
1276f4179c3b8788456095ec79fd35e7c1a3d0589a0Evan Laird        BatterySaverDrawable(Context context, int frameColor) {
1286f4179c3b8788456095ec79fd35e7c1a3d0589a0Evan Laird            super(context, frameColor);
1296f4179c3b8788456095ec79fd35e7c1a3d0589a0Evan Laird            // Show as full so it's always uniform color
1306f4179c3b8788456095ec79fd35e7c1a3d0589a0Evan Laird            super.setBatteryLevel(MAX_BATTERY);
1316f4179c3b8788456095ec79fd35e7c1a3d0589a0Evan Laird            setPowerSave(true);
1326f4179c3b8788456095ec79fd35e7c1a3d0589a0Evan Laird            setCharging(false);
1339eb4610db728a051b6725d7efb76790e9e1f3520Evan Laird            setPowerSaveAsColorError(false);
13481905164906b49ac4c5d84761088e9164fd9877cEvan Laird            mPowerSaveAsColorError = true;
13581905164906b49ac4c5d84761088e9164fd9877cEvan Laird            mFramePaint.setColor(0);
13681905164906b49ac4c5d84761088e9164fd9877cEvan Laird            mPowersavePaint.setColor(frameColor);
13781905164906b49ac4c5d84761088e9164fd9877cEvan Laird            mFramePaint.setStrokeWidth(mPowersavePaint.getStrokeWidth());
13881905164906b49ac4c5d84761088e9164fd9877cEvan Laird            mPlusPaint.setColor(frameColor);
1396f4179c3b8788456095ec79fd35e7c1a3d0589a0Evan Laird        }
1406f4179c3b8788456095ec79fd35e7c1a3d0589a0Evan Laird
1416f4179c3b8788456095ec79fd35e7c1a3d0589a0Evan Laird        @Override
1426f4179c3b8788456095ec79fd35e7c1a3d0589a0Evan Laird        protected int batteryColorForLevel(int level) {
14381905164906b49ac4c5d84761088e9164fd9877cEvan Laird            return 0;
1446f4179c3b8788456095ec79fd35e7c1a3d0589a0Evan Laird        }
1456f4179c3b8788456095ec79fd35e7c1a3d0589a0Evan Laird
1466f4179c3b8788456095ec79fd35e7c1a3d0589a0Evan Laird        @Override
1476f4179c3b8788456095ec79fd35e7c1a3d0589a0Evan Laird        public void setBatteryLevel(int val) {
1486f4179c3b8788456095ec79fd35e7c1a3d0589a0Evan Laird            // Don't change the actual level, otherwise this won't draw correctly
1496f4179c3b8788456095ec79fd35e7c1a3d0589a0Evan Laird        }
1506f4179c3b8788456095ec79fd35e7c1a3d0589a0Evan Laird    }
1516f4179c3b8788456095ec79fd35e7c1a3d0589a0Evan Laird}
152