1 /* 2 * Copyright (C) 2016 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file 5 * except in compliance with the License. You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software distributed under the 10 * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 11 * KIND, either express or implied. See the License for the specific language governing 12 * permissions and limitations under the License. 13 */ 14 15 package com.android.systemui.qs.tiles; 16 17 import android.content.DialogInterface.OnClickListener; 18 import android.content.Intent; 19 import android.service.quicksettings.Tile; 20 import android.widget.Switch; 21 import com.android.internal.logging.nano.MetricsProto.MetricsEvent; 22 import com.android.systemui.Dependency; 23 import com.android.systemui.Prefs; 24 import com.android.systemui.R; 25 import com.android.systemui.plugins.qs.QSTile.BooleanState; 26 import com.android.systemui.qs.QSHost; 27 import com.android.systemui.qs.tileimpl.QSTileImpl; 28 import com.android.systemui.statusbar.phone.SystemUIDialog; 29 import com.android.systemui.statusbar.policy.DataSaverController; 30 import com.android.systemui.statusbar.policy.NetworkController; 31 32 public class DataSaverTile extends QSTileImpl<BooleanState> implements 33 DataSaverController.Listener{ 34 35 private final DataSaverController mDataSaverController; 36 37 public DataSaverTile(QSHost host) { 38 super(host); 39 mDataSaverController = Dependency.get(NetworkController.class).getDataSaverController(); 40 } 41 42 @Override 43 public BooleanState newTileState() { 44 return new BooleanState(); 45 } 46 47 @Override 48 public void handleSetListening(boolean listening) { 49 if (listening) { 50 mDataSaverController.addCallback(this); 51 } else { 52 mDataSaverController.removeCallback(this); 53 } 54 } 55 56 @Override 57 public Intent getLongClickIntent() { 58 return CellularTile.getCellularSettingIntent(); 59 } 60 @Override 61 protected void handleClick() { 62 if (mState.value 63 || Prefs.getBoolean(mContext, Prefs.Key.QS_DATA_SAVER_DIALOG_SHOWN, false)) { 64 // Do it right away. 65 toggleDataSaver(); 66 return; 67 } 68 // Shows dialog first 69 SystemUIDialog dialog = new SystemUIDialog(mContext); 70 dialog.setTitle(com.android.internal.R.string.data_saver_enable_title); 71 dialog.setMessage(com.android.internal.R.string.data_saver_description); 72 dialog.setPositiveButton(com.android.internal.R.string.data_saver_enable_button, 73 (OnClickListener) (dialogInterface, which) -> toggleDataSaver()); 74 dialog.setNegativeButton(com.android.internal.R.string.cancel, null); 75 dialog.setShowForAllUsers(true); 76 dialog.show(); 77 Prefs.putBoolean(mContext, Prefs.Key.QS_DATA_SAVER_DIALOG_SHOWN, true); 78 } 79 80 private void toggleDataSaver() { 81 mState.value = !mDataSaverController.isDataSaverEnabled(); 82 mDataSaverController.setDataSaverEnabled(mState.value); 83 refreshState(mState.value); 84 } 85 86 @Override 87 public CharSequence getTileLabel() { 88 return mContext.getString(R.string.data_saver); 89 } 90 91 @Override 92 protected void handleUpdateState(BooleanState state, Object arg) { 93 state.value = arg instanceof Boolean ? (Boolean) arg 94 : mDataSaverController.isDataSaverEnabled(); 95 state.state = state.value ? Tile.STATE_ACTIVE : Tile.STATE_INACTIVE; 96 state.label = mContext.getString(R.string.data_saver); 97 state.contentDescription = state.label; 98 state.icon = ResourceIcon.get(state.value ? R.drawable.ic_data_saver 99 : R.drawable.ic_data_saver_off); 100 state.expandedAccessibilityClassName = Switch.class.getName(); 101 } 102 103 @Override 104 public int getMetricsCategory() { 105 return MetricsEvent.QS_DATA_SAVER; 106 } 107 108 @Override 109 protected String composeChangeAnnouncement() { 110 if (mState.value) { 111 return mContext.getString(R.string.accessibility_quick_settings_data_saver_changed_on); 112 } else { 113 return mContext.getString(R.string.accessibility_quick_settings_data_saver_changed_off); 114 } 115 } 116 117 @Override 118 public void onDataSaverChanged(boolean isDataSaving) { 119 refreshState(isDataSaving); 120 } 121 } 122