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 17a8981f35ac043b9f4b54c14094216e0f081e7759Rajeev Kumarimport android.content.DialogInterface.OnClickListener; 1876c67aa361f65dfb2f5e03d06cc1ccebce9cecd9Jason Monkimport android.content.Intent; 193250885c9feb9b42d60058a823c57a027c0dcf58Jason Monkimport android.service.quicksettings.Tile; 2020aef8a2914478a85aa679ec31bf739c7818eb3cJulia Reynoldsimport android.widget.Switch; 21383db5ebcc3a4a615faf249bf4f126f42e80b82eTamas Berghammerimport com.android.internal.logging.nano.MetricsProto.MetricsEvent; 229c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monkimport com.android.systemui.Dependency; 230281a9908f2b59cf83a10abbb8b5b49feddc513aFelipe Lemeimport com.android.systemui.Prefs; 249a4ce137eb5b73f9d7b097a26ae1c523c5b070e9Jason Monkimport com.android.systemui.R; 25702e2ebf9fbfb715c1d9b716683c9e4d182b575eJason Monkimport com.android.systemui.plugins.qs.QSTile.BooleanState; 26a8981f35ac043b9f4b54c14094216e0f081e7759Rajeev Kumarimport com.android.systemui.qs.QSHost; 27702e2ebf9fbfb715c1d9b716683c9e4d182b575eJason Monkimport com.android.systemui.qs.tileimpl.QSTileImpl; 280281a9908f2b59cf83a10abbb8b5b49feddc513aFelipe Lemeimport com.android.systemui.statusbar.phone.SystemUIDialog; 299a4ce137eb5b73f9d7b097a26ae1c523c5b070e9Jason Monkimport com.android.systemui.statusbar.policy.DataSaverController; 309c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monkimport com.android.systemui.statusbar.policy.NetworkController; 319a4ce137eb5b73f9d7b097a26ae1c523c5b070e9Jason Monk 32702e2ebf9fbfb715c1d9b716683c9e4d182b575eJason Monkpublic class DataSaverTile extends QSTileImpl<BooleanState> implements 339a4ce137eb5b73f9d7b097a26ae1c523c5b070e9Jason Monk DataSaverController.Listener{ 349a4ce137eb5b73f9d7b097a26ae1c523c5b070e9Jason Monk 359a4ce137eb5b73f9d7b097a26ae1c523c5b070e9Jason Monk private final DataSaverController mDataSaverController; 369a4ce137eb5b73f9d7b097a26ae1c523c5b070e9Jason Monk 37702e2ebf9fbfb715c1d9b716683c9e4d182b575eJason Monk public DataSaverTile(QSHost host) { 389a4ce137eb5b73f9d7b097a26ae1c523c5b070e9Jason Monk super(host); 399c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk mDataSaverController = Dependency.get(NetworkController.class).getDataSaverController(); 409a4ce137eb5b73f9d7b097a26ae1c523c5b070e9Jason Monk } 419a4ce137eb5b73f9d7b097a26ae1c523c5b070e9Jason Monk 429a4ce137eb5b73f9d7b097a26ae1c523c5b070e9Jason Monk @Override 4362b63a02d7ca630e3ad39991ea6550cab57e5d22Jason Monk public BooleanState newTileState() { 449a4ce137eb5b73f9d7b097a26ae1c523c5b070e9Jason Monk return new BooleanState(); 459a4ce137eb5b73f9d7b097a26ae1c523c5b070e9Jason Monk } 469a4ce137eb5b73f9d7b097a26ae1c523c5b070e9Jason Monk 479a4ce137eb5b73f9d7b097a26ae1c523c5b070e9Jason Monk @Override 481c6116cbbb0c8000b576443e4b13026b1d8529d9Jason Monk public void handleSetListening(boolean listening) { 499a4ce137eb5b73f9d7b097a26ae1c523c5b070e9Jason Monk if (listening) { 508852905b0b3837e326127c6dfef6f699124ce715Jason Monk mDataSaverController.addCallback(this); 519a4ce137eb5b73f9d7b097a26ae1c523c5b070e9Jason Monk } else { 528852905b0b3837e326127c6dfef6f699124ce715Jason Monk mDataSaverController.removeCallback(this); 539a4ce137eb5b73f9d7b097a26ae1c523c5b070e9Jason Monk } 549a4ce137eb5b73f9d7b097a26ae1c523c5b070e9Jason Monk } 559a4ce137eb5b73f9d7b097a26ae1c523c5b070e9Jason Monk 569a4ce137eb5b73f9d7b097a26ae1c523c5b070e9Jason Monk @Override 5776c67aa361f65dfb2f5e03d06cc1ccebce9cecd9Jason Monk public Intent getLongClickIntent() { 5853f3f15654a12a820e08cd5d42b5f94d061598abRohan Shah return CellularTile.getCellularSettingIntent(); 5976c67aa361f65dfb2f5e03d06cc1ccebce9cecd9Jason Monk } 6076c67aa361f65dfb2f5e03d06cc1ccebce9cecd9Jason Monk @Override 619a4ce137eb5b73f9d7b097a26ae1c523c5b070e9Jason Monk protected void handleClick() { 62ac0dbbbb8a4c5917cb07680021406c17b3333b98Felipe Leme if (mState.value 63ac0dbbbb8a4c5917cb07680021406c17b3333b98Felipe Leme || Prefs.getBoolean(mContext, Prefs.Key.QS_DATA_SAVER_DIALOG_SHOWN, false)) { 640281a9908f2b59cf83a10abbb8b5b49feddc513aFelipe Leme // Do it right away. 650281a9908f2b59cf83a10abbb8b5b49feddc513aFelipe Leme toggleDataSaver(); 660281a9908f2b59cf83a10abbb8b5b49feddc513aFelipe Leme return; 670281a9908f2b59cf83a10abbb8b5b49feddc513aFelipe Leme } 680281a9908f2b59cf83a10abbb8b5b49feddc513aFelipe Leme // Shows dialog first 690281a9908f2b59cf83a10abbb8b5b49feddc513aFelipe Leme SystemUIDialog dialog = new SystemUIDialog(mContext); 700281a9908f2b59cf83a10abbb8b5b49feddc513aFelipe Leme dialog.setTitle(com.android.internal.R.string.data_saver_enable_title); 710281a9908f2b59cf83a10abbb8b5b49feddc513aFelipe Leme dialog.setMessage(com.android.internal.R.string.data_saver_description); 720281a9908f2b59cf83a10abbb8b5b49feddc513aFelipe Leme dialog.setPositiveButton(com.android.internal.R.string.data_saver_enable_button, 73a8981f35ac043b9f4b54c14094216e0f081e7759Rajeev Kumar (OnClickListener) (dialogInterface, which) -> toggleDataSaver()); 740281a9908f2b59cf83a10abbb8b5b49feddc513aFelipe Leme dialog.setNegativeButton(com.android.internal.R.string.cancel, null); 750281a9908f2b59cf83a10abbb8b5b49feddc513aFelipe Leme dialog.setShowForAllUsers(true); 760281a9908f2b59cf83a10abbb8b5b49feddc513aFelipe Leme dialog.show(); 770281a9908f2b59cf83a10abbb8b5b49feddc513aFelipe Leme Prefs.putBoolean(mContext, Prefs.Key.QS_DATA_SAVER_DIALOG_SHOWN, true); 780281a9908f2b59cf83a10abbb8b5b49feddc513aFelipe Leme } 790281a9908f2b59cf83a10abbb8b5b49feddc513aFelipe Leme 800281a9908f2b59cf83a10abbb8b5b49feddc513aFelipe Leme private void toggleDataSaver() { 819a4ce137eb5b73f9d7b097a26ae1c523c5b070e9Jason Monk mState.value = !mDataSaverController.isDataSaverEnabled(); 829a4ce137eb5b73f9d7b097a26ae1c523c5b070e9Jason Monk mDataSaverController.setDataSaverEnabled(mState.value); 839a4ce137eb5b73f9d7b097a26ae1c523c5b070e9Jason Monk refreshState(mState.value); 849a4ce137eb5b73f9d7b097a26ae1c523c5b070e9Jason Monk } 859a4ce137eb5b73f9d7b097a26ae1c523c5b070e9Jason Monk 869a4ce137eb5b73f9d7b097a26ae1c523c5b070e9Jason Monk @Override 8739c98e652fd3e0e3ea3a334d60ba6ee979985978Jason Monk public CharSequence getTileLabel() { 8839c98e652fd3e0e3ea3a334d60ba6ee979985978Jason Monk return mContext.getString(R.string.data_saver); 8939c98e652fd3e0e3ea3a334d60ba6ee979985978Jason Monk } 9039c98e652fd3e0e3ea3a334d60ba6ee979985978Jason Monk 9139c98e652fd3e0e3ea3a334d60ba6ee979985978Jason Monk @Override 929a4ce137eb5b73f9d7b097a26ae1c523c5b070e9Jason Monk protected void handleUpdateState(BooleanState state, Object arg) { 939a4ce137eb5b73f9d7b097a26ae1c523c5b070e9Jason Monk state.value = arg instanceof Boolean ? (Boolean) arg 949a4ce137eb5b73f9d7b097a26ae1c523c5b070e9Jason Monk : mDataSaverController.isDataSaverEnabled(); 953250885c9feb9b42d60058a823c57a027c0dcf58Jason Monk state.state = state.value ? Tile.STATE_ACTIVE : Tile.STATE_INACTIVE; 969a4ce137eb5b73f9d7b097a26ae1c523c5b070e9Jason Monk state.label = mContext.getString(R.string.data_saver); 9720aef8a2914478a85aa679ec31bf739c7818eb3cJulia Reynolds state.contentDescription = state.label; 989a4ce137eb5b73f9d7b097a26ae1c523c5b070e9Jason Monk state.icon = ResourceIcon.get(state.value ? R.drawable.ic_data_saver 999a4ce137eb5b73f9d7b097a26ae1c523c5b070e9Jason Monk : R.drawable.ic_data_saver_off); 100702e2ebf9fbfb715c1d9b716683c9e4d182b575eJason Monk state.expandedAccessibilityClassName = Switch.class.getName(); 1019a4ce137eb5b73f9d7b097a26ae1c523c5b070e9Jason Monk } 1029a4ce137eb5b73f9d7b097a26ae1c523c5b070e9Jason Monk 1039a4ce137eb5b73f9d7b097a26ae1c523c5b070e9Jason Monk @Override 1049a4ce137eb5b73f9d7b097a26ae1c523c5b070e9Jason Monk public int getMetricsCategory() { 1059a4ce137eb5b73f9d7b097a26ae1c523c5b070e9Jason Monk return MetricsEvent.QS_DATA_SAVER; 1069a4ce137eb5b73f9d7b097a26ae1c523c5b070e9Jason Monk } 1079a4ce137eb5b73f9d7b097a26ae1c523c5b070e9Jason Monk 1089a4ce137eb5b73f9d7b097a26ae1c523c5b070e9Jason Monk @Override 1093e5e84152f6c07b4fada3fea2e6d00aa59624b80Felipe Leme protected String composeChangeAnnouncement() { 1103e5e84152f6c07b4fada3fea2e6d00aa59624b80Felipe Leme if (mState.value) { 1113e5e84152f6c07b4fada3fea2e6d00aa59624b80Felipe Leme return mContext.getString(R.string.accessibility_quick_settings_data_saver_changed_on); 1123e5e84152f6c07b4fada3fea2e6d00aa59624b80Felipe Leme } else { 1133e5e84152f6c07b4fada3fea2e6d00aa59624b80Felipe Leme return mContext.getString(R.string.accessibility_quick_settings_data_saver_changed_off); 1143e5e84152f6c07b4fada3fea2e6d00aa59624b80Felipe Leme } 1153e5e84152f6c07b4fada3fea2e6d00aa59624b80Felipe Leme } 1163e5e84152f6c07b4fada3fea2e6d00aa59624b80Felipe Leme 1173e5e84152f6c07b4fada3fea2e6d00aa59624b80Felipe Leme @Override 1189a4ce137eb5b73f9d7b097a26ae1c523c5b070e9Jason Monk public void onDataSaverChanged(boolean isDataSaving) { 1199a4ce137eb5b73f9d7b097a26ae1c523c5b070e9Jason Monk refreshState(isDataSaving); 1209a4ce137eb5b73f9d7b097a26ae1c523c5b070e9Jason Monk } 121a8981f35ac043b9f4b54c14094216e0f081e7759Rajeev Kumar} 122