19a4ce137eb5b73f9d7b097a26ae1c523c5b070e9Jason Monk/* 29a4ce137eb5b73f9d7b097a26ae1c523c5b070e9Jason Monk * Copyright (C) 2016 The Android Open Source Project 39a4ce137eb5b73f9d7b097a26ae1c523c5b070e9Jason Monk * 49a4ce137eb5b73f9d7b097a26ae1c523c5b070e9Jason Monk * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file 59a4ce137eb5b73f9d7b097a26ae1c523c5b070e9Jason Monk * except in compliance with the License. You may obtain a copy of the License at 69a4ce137eb5b73f9d7b097a26ae1c523c5b070e9Jason Monk * 79a4ce137eb5b73f9d7b097a26ae1c523c5b070e9Jason Monk * http://www.apache.org/licenses/LICENSE-2.0 89a4ce137eb5b73f9d7b097a26ae1c523c5b070e9Jason Monk * 99a4ce137eb5b73f9d7b097a26ae1c523c5b070e9Jason Monk * Unless required by applicable law or agreed to in writing, software distributed under the 109a4ce137eb5b73f9d7b097a26ae1c523c5b070e9Jason Monk * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 119a4ce137eb5b73f9d7b097a26ae1c523c5b070e9Jason Monk * KIND, either express or implied. See the License for the specific language governing 129a4ce137eb5b73f9d7b097a26ae1c523c5b070e9Jason Monk * permissions and limitations under the License. 139a4ce137eb5b73f9d7b097a26ae1c523c5b070e9Jason Monk */ 149a4ce137eb5b73f9d7b097a26ae1c523c5b070e9Jason Monk 159a4ce137eb5b73f9d7b097a26ae1c523c5b070e9Jason Monkpackage com.android.systemui.qs.tiles; 169a4ce137eb5b73f9d7b097a26ae1c523c5b070e9Jason Monk 170281a9908f2b59cf83a10abbb8b5b49feddc513aFelipe Lemeimport android.content.DialogInterface; 1876c67aa361f65dfb2f5e03d06cc1ccebce9cecd9Jason Monkimport android.content.Intent; 1920aef8a2914478a85aa679ec31bf739c7818eb3cJulia Reynoldsimport android.widget.Switch; 207d822ff33c9ac708072a4258ea9ca19fb39a254aFelipe Leme 217d822ff33c9ac708072a4258ea9ca19fb39a254aFelipe Lemeimport com.android.internal.logging.MetricsLogger; 229a4ce137eb5b73f9d7b097a26ae1c523c5b070e9Jason Monkimport com.android.internal.logging.MetricsProto.MetricsEvent; 230281a9908f2b59cf83a10abbb8b5b49feddc513aFelipe Lemeimport com.android.systemui.Prefs; 249a4ce137eb5b73f9d7b097a26ae1c523c5b070e9Jason Monkimport com.android.systemui.R; 259a4ce137eb5b73f9d7b097a26ae1c523c5b070e9Jason Monkimport com.android.systemui.qs.QSTile; 260281a9908f2b59cf83a10abbb8b5b49feddc513aFelipe Lemeimport com.android.systemui.statusbar.phone.SystemUIDialog; 279a4ce137eb5b73f9d7b097a26ae1c523c5b070e9Jason Monkimport com.android.systemui.statusbar.policy.DataSaverController; 289a4ce137eb5b73f9d7b097a26ae1c523c5b070e9Jason Monk 299a4ce137eb5b73f9d7b097a26ae1c523c5b070e9Jason Monkpublic class DataSaverTile extends QSTile<QSTile.BooleanState> implements 309a4ce137eb5b73f9d7b097a26ae1c523c5b070e9Jason Monk DataSaverController.Listener{ 319a4ce137eb5b73f9d7b097a26ae1c523c5b070e9Jason Monk 329a4ce137eb5b73f9d7b097a26ae1c523c5b070e9Jason Monk private final DataSaverController mDataSaverController; 339a4ce137eb5b73f9d7b097a26ae1c523c5b070e9Jason Monk 349a4ce137eb5b73f9d7b097a26ae1c523c5b070e9Jason Monk public DataSaverTile(Host host) { 359a4ce137eb5b73f9d7b097a26ae1c523c5b070e9Jason Monk super(host); 369a4ce137eb5b73f9d7b097a26ae1c523c5b070e9Jason Monk mDataSaverController = host.getNetworkController().getDataSaverController(); 379a4ce137eb5b73f9d7b097a26ae1c523c5b070e9Jason Monk } 389a4ce137eb5b73f9d7b097a26ae1c523c5b070e9Jason Monk 399a4ce137eb5b73f9d7b097a26ae1c523c5b070e9Jason Monk @Override 4062b63a02d7ca630e3ad39991ea6550cab57e5d22Jason Monk public BooleanState newTileState() { 419a4ce137eb5b73f9d7b097a26ae1c523c5b070e9Jason Monk return new BooleanState(); 429a4ce137eb5b73f9d7b097a26ae1c523c5b070e9Jason Monk } 439a4ce137eb5b73f9d7b097a26ae1c523c5b070e9Jason Monk 449a4ce137eb5b73f9d7b097a26ae1c523c5b070e9Jason Monk @Override 459a4ce137eb5b73f9d7b097a26ae1c523c5b070e9Jason Monk public void setListening(boolean listening) { 469a4ce137eb5b73f9d7b097a26ae1c523c5b070e9Jason Monk if (listening) { 479a4ce137eb5b73f9d7b097a26ae1c523c5b070e9Jason Monk mDataSaverController.addListener(this); 489a4ce137eb5b73f9d7b097a26ae1c523c5b070e9Jason Monk } else { 499a4ce137eb5b73f9d7b097a26ae1c523c5b070e9Jason Monk mDataSaverController.remListener(this); 509a4ce137eb5b73f9d7b097a26ae1c523c5b070e9Jason Monk } 519a4ce137eb5b73f9d7b097a26ae1c523c5b070e9Jason Monk } 529a4ce137eb5b73f9d7b097a26ae1c523c5b070e9Jason Monk 539a4ce137eb5b73f9d7b097a26ae1c523c5b070e9Jason Monk @Override 5476c67aa361f65dfb2f5e03d06cc1ccebce9cecd9Jason Monk public Intent getLongClickIntent() { 5576c67aa361f65dfb2f5e03d06cc1ccebce9cecd9Jason Monk return CellularTile.CELLULAR_SETTINGS; 5676c67aa361f65dfb2f5e03d06cc1ccebce9cecd9Jason Monk } 5776c67aa361f65dfb2f5e03d06cc1ccebce9cecd9Jason Monk 5876c67aa361f65dfb2f5e03d06cc1ccebce9cecd9Jason Monk @Override 599a4ce137eb5b73f9d7b097a26ae1c523c5b070e9Jason Monk protected void handleClick() { 60ac0dbbbb8a4c5917cb07680021406c17b3333b98Felipe Leme if (mState.value 61ac0dbbbb8a4c5917cb07680021406c17b3333b98Felipe Leme || Prefs.getBoolean(mContext, Prefs.Key.QS_DATA_SAVER_DIALOG_SHOWN, false)) { 620281a9908f2b59cf83a10abbb8b5b49feddc513aFelipe Leme // Do it right away. 630281a9908f2b59cf83a10abbb8b5b49feddc513aFelipe Leme toggleDataSaver(); 640281a9908f2b59cf83a10abbb8b5b49feddc513aFelipe Leme return; 650281a9908f2b59cf83a10abbb8b5b49feddc513aFelipe Leme } 660281a9908f2b59cf83a10abbb8b5b49feddc513aFelipe Leme // Shows dialog first 670281a9908f2b59cf83a10abbb8b5b49feddc513aFelipe Leme SystemUIDialog dialog = new SystemUIDialog(mContext); 680281a9908f2b59cf83a10abbb8b5b49feddc513aFelipe Leme dialog.setTitle(com.android.internal.R.string.data_saver_enable_title); 690281a9908f2b59cf83a10abbb8b5b49feddc513aFelipe Leme dialog.setMessage(com.android.internal.R.string.data_saver_description); 700281a9908f2b59cf83a10abbb8b5b49feddc513aFelipe Leme dialog.setPositiveButton(com.android.internal.R.string.data_saver_enable_button, 710281a9908f2b59cf83a10abbb8b5b49feddc513aFelipe Leme new DialogInterface.OnClickListener() { 720281a9908f2b59cf83a10abbb8b5b49feddc513aFelipe Leme @Override 730281a9908f2b59cf83a10abbb8b5b49feddc513aFelipe Leme public void onClick(DialogInterface dialog, int which) { 740281a9908f2b59cf83a10abbb8b5b49feddc513aFelipe Leme toggleDataSaver(); 750281a9908f2b59cf83a10abbb8b5b49feddc513aFelipe Leme } 760281a9908f2b59cf83a10abbb8b5b49feddc513aFelipe Leme }); 770281a9908f2b59cf83a10abbb8b5b49feddc513aFelipe Leme dialog.setNegativeButton(com.android.internal.R.string.cancel, null); 780281a9908f2b59cf83a10abbb8b5b49feddc513aFelipe Leme dialog.setShowForAllUsers(true); 790281a9908f2b59cf83a10abbb8b5b49feddc513aFelipe Leme dialog.show(); 800281a9908f2b59cf83a10abbb8b5b49feddc513aFelipe Leme Prefs.putBoolean(mContext, Prefs.Key.QS_DATA_SAVER_DIALOG_SHOWN, true); 810281a9908f2b59cf83a10abbb8b5b49feddc513aFelipe Leme } 820281a9908f2b59cf83a10abbb8b5b49feddc513aFelipe Leme 830281a9908f2b59cf83a10abbb8b5b49feddc513aFelipe Leme private void toggleDataSaver() { 849a4ce137eb5b73f9d7b097a26ae1c523c5b070e9Jason Monk mState.value = !mDataSaverController.isDataSaverEnabled(); 857d822ff33c9ac708072a4258ea9ca19fb39a254aFelipe Leme MetricsLogger.action(mContext, getMetricsCategory(), mState.value); 869a4ce137eb5b73f9d7b097a26ae1c523c5b070e9Jason Monk mDataSaverController.setDataSaverEnabled(mState.value); 879a4ce137eb5b73f9d7b097a26ae1c523c5b070e9Jason Monk refreshState(mState.value); 889a4ce137eb5b73f9d7b097a26ae1c523c5b070e9Jason Monk } 899a4ce137eb5b73f9d7b097a26ae1c523c5b070e9Jason Monk 909a4ce137eb5b73f9d7b097a26ae1c523c5b070e9Jason Monk @Override 9139c98e652fd3e0e3ea3a334d60ba6ee979985978Jason Monk public CharSequence getTileLabel() { 9239c98e652fd3e0e3ea3a334d60ba6ee979985978Jason Monk return mContext.getString(R.string.data_saver); 9339c98e652fd3e0e3ea3a334d60ba6ee979985978Jason Monk } 9439c98e652fd3e0e3ea3a334d60ba6ee979985978Jason Monk 9539c98e652fd3e0e3ea3a334d60ba6ee979985978Jason Monk @Override 969a4ce137eb5b73f9d7b097a26ae1c523c5b070e9Jason Monk protected void handleUpdateState(BooleanState state, Object arg) { 979a4ce137eb5b73f9d7b097a26ae1c523c5b070e9Jason Monk state.value = arg instanceof Boolean ? (Boolean) arg 989a4ce137eb5b73f9d7b097a26ae1c523c5b070e9Jason Monk : mDataSaverController.isDataSaverEnabled(); 999a4ce137eb5b73f9d7b097a26ae1c523c5b070e9Jason Monk state.label = mContext.getString(R.string.data_saver); 10020aef8a2914478a85aa679ec31bf739c7818eb3cJulia Reynolds state.contentDescription = state.label; 1019a4ce137eb5b73f9d7b097a26ae1c523c5b070e9Jason Monk state.icon = ResourceIcon.get(state.value ? R.drawable.ic_data_saver 1029a4ce137eb5b73f9d7b097a26ae1c523c5b070e9Jason Monk : R.drawable.ic_data_saver_off); 10320aef8a2914478a85aa679ec31bf739c7818eb3cJulia Reynolds state.minimalAccessibilityClassName = state.expandedAccessibilityClassName 10420aef8a2914478a85aa679ec31bf739c7818eb3cJulia Reynolds = Switch.class.getName(); 1059a4ce137eb5b73f9d7b097a26ae1c523c5b070e9Jason Monk } 1069a4ce137eb5b73f9d7b097a26ae1c523c5b070e9Jason Monk 1079a4ce137eb5b73f9d7b097a26ae1c523c5b070e9Jason Monk @Override 1089a4ce137eb5b73f9d7b097a26ae1c523c5b070e9Jason Monk public int getMetricsCategory() { 1099a4ce137eb5b73f9d7b097a26ae1c523c5b070e9Jason Monk return MetricsEvent.QS_DATA_SAVER; 1109a4ce137eb5b73f9d7b097a26ae1c523c5b070e9Jason Monk } 1119a4ce137eb5b73f9d7b097a26ae1c523c5b070e9Jason Monk 1129a4ce137eb5b73f9d7b097a26ae1c523c5b070e9Jason Monk @Override 1133e5e84152f6c07b4fada3fea2e6d00aa59624b80Felipe Leme protected String composeChangeAnnouncement() { 1143e5e84152f6c07b4fada3fea2e6d00aa59624b80Felipe Leme if (mState.value) { 1153e5e84152f6c07b4fada3fea2e6d00aa59624b80Felipe Leme return mContext.getString(R.string.accessibility_quick_settings_data_saver_changed_on); 1163e5e84152f6c07b4fada3fea2e6d00aa59624b80Felipe Leme } else { 1173e5e84152f6c07b4fada3fea2e6d00aa59624b80Felipe Leme return mContext.getString(R.string.accessibility_quick_settings_data_saver_changed_off); 1183e5e84152f6c07b4fada3fea2e6d00aa59624b80Felipe Leme } 1193e5e84152f6c07b4fada3fea2e6d00aa59624b80Felipe Leme } 1203e5e84152f6c07b4fada3fea2e6d00aa59624b80Felipe Leme 1213e5e84152f6c07b4fada3fea2e6d00aa59624b80Felipe Leme @Override 1229a4ce137eb5b73f9d7b097a26ae1c523c5b070e9Jason Monk public void onDataSaverChanged(boolean isDataSaving) { 1239a4ce137eb5b73f9d7b097a26ae1c523c5b070e9Jason Monk refreshState(isDataSaving); 1249a4ce137eb5b73f9d7b097a26ae1c523c5b070e9Jason Monk } 1259a4ce137eb5b73f9d7b097a26ae1c523c5b070e9Jason Monk}