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; 18 import android.content.Intent; 19 import android.service.quicksettings.Tile; 20 import android.widget.Switch; 21 22 import com.android.internal.logging.MetricsLogger; 23 import com.android.internal.logging.nano.MetricsProto.MetricsEvent; 24 import com.android.systemui.Dependency; 25 import com.android.systemui.Prefs; 26 import com.android.systemui.R; 27 import com.android.systemui.qs.QSHost; 28 import com.android.systemui.plugins.qs.QSTile.BooleanState; 29 import com.android.systemui.qs.tileimpl.QSTileImpl; 30 import com.android.systemui.statusbar.phone.SystemUIDialog; 31 import com.android.systemui.statusbar.policy.DataSaverController; 32 import com.android.systemui.statusbar.policy.NetworkController; 33 34 public class DataSaverTile extends QSTileImpl<BooleanState> implements 35 DataSaverController.Listener{ 36 37 private final DataSaverController mDataSaverController; 38 39 public DataSaverTile(QSHost host) { 40 super(host); 41 mDataSaverController = Dependency.get(NetworkController.class).getDataSaverController(); 42 } 43 44 @Override 45 public BooleanState newTileState() { 46 return new BooleanState(); 47 } 48 49 @Override 50 public void setListening(boolean listening) { 51 if (listening) { 52 mDataSaverController.addCallback(this); 53 } else { 54 mDataSaverController.removeCallback(this); 55 } 56 } 57 58 @Override 59 public Intent getLongClickIntent() { 60 return CellularTile.CELLULAR_SETTINGS; 61 } 62 63 @Override 64 protected void handleClick() { 65 if (mState.value 66 || Prefs.getBoolean(mContext, Prefs.Key.QS_DATA_SAVER_DIALOG_SHOWN, false)) { 67 // Do it right away. 68 toggleDataSaver(); 69 return; 70 } 71 // Shows dialog first 72 SystemUIDialog dialog = new SystemUIDialog(mContext); 73 dialog.setTitle(com.android.internal.R.string.data_saver_enable_title); 74 dialog.setMessage(com.android.internal.R.string.data_saver_description); 75 dialog.setPositiveButton(com.android.internal.R.string.data_saver_enable_button, 76 new DialogInterface.OnClickListener() { 77 @Override 78 public void onClick(DialogInterface dialog, int which) { 79 toggleDataSaver(); 80 } 81 }); 82 dialog.setNegativeButton(com.android.internal.R.string.cancel, null); 83 dialog.setShowForAllUsers(true); 84 dialog.show(); 85 Prefs.putBoolean(mContext, Prefs.Key.QS_DATA_SAVER_DIALOG_SHOWN, true); 86 } 87 88 private void toggleDataSaver() { 89 mState.value = !mDataSaverController.isDataSaverEnabled(); 90 mDataSaverController.setDataSaverEnabled(mState.value); 91 refreshState(mState.value); 92 } 93 94 @Override 95 public CharSequence getTileLabel() { 96 return mContext.getString(R.string.data_saver); 97 } 98 99 @Override 100 protected void handleUpdateState(BooleanState state, Object arg) { 101 state.value = arg instanceof Boolean ? (Boolean) arg 102 : mDataSaverController.isDataSaverEnabled(); 103 state.state = state.value ? Tile.STATE_ACTIVE : Tile.STATE_INACTIVE; 104 state.label = mContext.getString(R.string.data_saver); 105 state.contentDescription = state.label; 106 state.icon = ResourceIcon.get(state.value ? R.drawable.ic_data_saver 107 : R.drawable.ic_data_saver_off); 108 state.expandedAccessibilityClassName = Switch.class.getName(); 109 } 110 111 @Override 112 public int getMetricsCategory() { 113 return MetricsEvent.QS_DATA_SAVER; 114 } 115 116 @Override 117 protected String composeChangeAnnouncement() { 118 if (mState.value) { 119 return mContext.getString(R.string.accessibility_quick_settings_data_saver_changed_on); 120 } else { 121 return mContext.getString(R.string.accessibility_quick_settings_data_saver_changed_off); 122 } 123 } 124 125 @Override 126 public void onDataSaverChanged(boolean isDataSaving) { 127 refreshState(isDataSaving); 128 } 129 }