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