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}