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