1764f45db9168b4f19623b72db8429016d1226cbeJason Monk/*
2764f45db9168b4f19623b72db8429016d1226cbeJason Monk * Copyright (C) 2016 The Android Open Source Project
3764f45db9168b4f19623b72db8429016d1226cbeJason Monk *
4764f45db9168b4f19623b72db8429016d1226cbeJason Monk * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
5764f45db9168b4f19623b72db8429016d1226cbeJason Monk * except in compliance with the License. You may obtain a copy of the License at
6764f45db9168b4f19623b72db8429016d1226cbeJason Monk *
7764f45db9168b4f19623b72db8429016d1226cbeJason Monk *      http://www.apache.org/licenses/LICENSE-2.0
8764f45db9168b4f19623b72db8429016d1226cbeJason Monk *
9764f45db9168b4f19623b72db8429016d1226cbeJason Monk * Unless required by applicable law or agreed to in writing, software distributed under the
10764f45db9168b4f19623b72db8429016d1226cbeJason Monk * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
11764f45db9168b4f19623b72db8429016d1226cbeJason Monk * KIND, either express or implied. See the License for the specific language governing
12764f45db9168b4f19623b72db8429016d1226cbeJason Monk * permissions and limitations under the License.
13764f45db9168b4f19623b72db8429016d1226cbeJason Monk */
14764f45db9168b4f19623b72db8429016d1226cbeJason Monk
15764f45db9168b4f19623b72db8429016d1226cbeJason Monkpackage com.android.settings.datausage;
16764f45db9168b4f19623b72db8429016d1226cbeJason Monk
17a8b0366a028b321e41ee40b3c1372de77254b24dJason Monkimport android.app.Application;
18764f45db9168b4f19623b72db8429016d1226cbeJason Monkimport android.os.Bundle;
19764f45db9168b4f19623b72db8429016d1226cbeJason Monkimport android.support.v7.preference.Preference;
20764f45db9168b4f19623b72db8429016d1226cbeJason Monkimport android.widget.Switch;
21cf2c0b1b97605f8526a8a56b96a981aaa88cd63bFelipe Leme
22265d3c2a0c36251bf8a9f571d7239b6dd404d942Tamas Berghammerimport com.android.internal.logging.nano.MetricsProto.MetricsEvent;
23764f45db9168b4f19623b72db8429016d1226cbeJason Monkimport com.android.settings.R;
24764f45db9168b4f19623b72db8429016d1226cbeJason Monkimport com.android.settings.SettingsActivity;
25764f45db9168b4f19623b72db8429016d1226cbeJason Monkimport com.android.settings.SettingsPreferenceFragment;
26a8b0366a028b321e41ee40b3c1372de77254b24dJason Monkimport com.android.settings.applications.AppStateBaseBridge.Callback;
27a8b0366a028b321e41ee40b3c1372de77254b24dJason Monkimport com.android.settings.datausage.DataSaverBackend.Listener;
28764f45db9168b4f19623b72db8429016d1226cbeJason Monkimport com.android.settings.widget.SwitchBar;
29a8b0366a028b321e41ee40b3c1372de77254b24dJason Monkimport com.android.settings.widget.SwitchBar.OnSwitchChangeListener;
30a8b0366a028b321e41ee40b3c1372de77254b24dJason Monkimport com.android.settingslib.applications.ApplicationsState;
31a8b0366a028b321e41ee40b3c1372de77254b24dJason Monkimport com.android.settingslib.applications.ApplicationsState.AppEntry;
32a8b0366a028b321e41ee40b3c1372de77254b24dJason Monkimport com.android.settingslib.applications.ApplicationsState.Callbacks;
33a8b0366a028b321e41ee40b3c1372de77254b24dJason Monkimport com.android.settingslib.applications.ApplicationsState.Session;
34a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk
35a8b0366a028b321e41ee40b3c1372de77254b24dJason Monkimport java.util.ArrayList;
36764f45db9168b4f19623b72db8429016d1226cbeJason Monk
37764f45db9168b4f19623b72db8429016d1226cbeJason Monkpublic class DataSaverSummary extends SettingsPreferenceFragment
38a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk        implements OnSwitchChangeListener, Listener, Callback, Callbacks {
39764f45db9168b4f19623b72db8429016d1226cbeJason Monk
40764f45db9168b4f19623b72db8429016d1226cbeJason Monk    private static final String KEY_UNRESTRICTED_ACCESS = "unrestricted_access";
41764f45db9168b4f19623b72db8429016d1226cbeJason Monk
42764f45db9168b4f19623b72db8429016d1226cbeJason Monk    private SwitchBar mSwitchBar;
43764f45db9168b4f19623b72db8429016d1226cbeJason Monk    private DataSaverBackend mDataSaverBackend;
44764f45db9168b4f19623b72db8429016d1226cbeJason Monk    private Preference mUnrestrictedAccess;
45a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk    private ApplicationsState mApplicationsState;
46a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk    private AppStateDataUsageBridge mDataUsageBridge;
47a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk    private Session mSession;
48764f45db9168b4f19623b72db8429016d1226cbeJason Monk
49484caa303561b2d22896f92d3ede9e5a03b9b131Felipe Leme    // Flag used to avoid infinite loop due if user switch it on/off too quicky.
50484caa303561b2d22896f92d3ede9e5a03b9b131Felipe Leme    private boolean mSwitching;
51484caa303561b2d22896f92d3ede9e5a03b9b131Felipe Leme
52764f45db9168b4f19623b72db8429016d1226cbeJason Monk    @Override
53764f45db9168b4f19623b72db8429016d1226cbeJason Monk    public void onCreate(Bundle icicle) {
54764f45db9168b4f19623b72db8429016d1226cbeJason Monk        super.onCreate(icicle);
55764f45db9168b4f19623b72db8429016d1226cbeJason Monk
56764f45db9168b4f19623b72db8429016d1226cbeJason Monk        addPreferencesFromResource(R.xml.data_saver);
57ac81f26e30352dd441c099012c4489701d9aee2fFan Zhang        mFooterPreferenceMixin.createFooterPreference()
58ac81f26e30352dd441c099012c4489701d9aee2fFan Zhang                .setTitle(com.android.internal.R.string.data_saver_description);
59764f45db9168b4f19623b72db8429016d1226cbeJason Monk        mUnrestrictedAccess = findPreference(KEY_UNRESTRICTED_ACCESS);
60a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk        mApplicationsState = ApplicationsState.getInstance(
61a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk                (Application) getContext().getApplicationContext());
62764f45db9168b4f19623b72db8429016d1226cbeJason Monk        mDataSaverBackend = new DataSaverBackend(getContext());
63a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk        mDataUsageBridge = new AppStateDataUsageBridge(mApplicationsState, this, mDataSaverBackend);
64a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk        mSession = mApplicationsState.newSession(this);
65764f45db9168b4f19623b72db8429016d1226cbeJason Monk    }
66764f45db9168b4f19623b72db8429016d1226cbeJason Monk
67764f45db9168b4f19623b72db8429016d1226cbeJason Monk    @Override
68764f45db9168b4f19623b72db8429016d1226cbeJason Monk    public void onActivityCreated(Bundle savedInstanceState) {
69764f45db9168b4f19623b72db8429016d1226cbeJason Monk        super.onActivityCreated(savedInstanceState);
70764f45db9168b4f19623b72db8429016d1226cbeJason Monk        mSwitchBar = ((SettingsActivity) getActivity()).getSwitchBar();
71764f45db9168b4f19623b72db8429016d1226cbeJason Monk        mSwitchBar.show();
72764f45db9168b4f19623b72db8429016d1226cbeJason Monk        mSwitchBar.addOnSwitchChangeListener(this);
73764f45db9168b4f19623b72db8429016d1226cbeJason Monk    }
74764f45db9168b4f19623b72db8429016d1226cbeJason Monk
75764f45db9168b4f19623b72db8429016d1226cbeJason Monk    @Override
76764f45db9168b4f19623b72db8429016d1226cbeJason Monk    public void onResume() {
77764f45db9168b4f19623b72db8429016d1226cbeJason Monk        super.onResume();
78764f45db9168b4f19623b72db8429016d1226cbeJason Monk        mDataSaverBackend.refreshWhitelist();
79c2ef27faf4afca6c4f6634b5de975a1bdadf0752Felipe Leme        mDataSaverBackend.refreshBlacklist();
801636fedebe00aac4c21c72afafd7430ef6719e78Jason Monk        mDataSaverBackend.addListener(this);
81a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk        mSession.resume();
82a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk        mDataUsageBridge.resume();
83764f45db9168b4f19623b72db8429016d1226cbeJason Monk    }
84764f45db9168b4f19623b72db8429016d1226cbeJason Monk
85764f45db9168b4f19623b72db8429016d1226cbeJason Monk    @Override
86764f45db9168b4f19623b72db8429016d1226cbeJason Monk    public void onPause() {
87764f45db9168b4f19623b72db8429016d1226cbeJason Monk        super.onPause();
881636fedebe00aac4c21c72afafd7430ef6719e78Jason Monk        mDataSaverBackend.remListener(this);
89a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk        mDataUsageBridge.pause();
90a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk        mSession.pause();
91764f45db9168b4f19623b72db8429016d1226cbeJason Monk    }
92764f45db9168b4f19623b72db8429016d1226cbeJason Monk
93764f45db9168b4f19623b72db8429016d1226cbeJason Monk    @Override
94764f45db9168b4f19623b72db8429016d1226cbeJason Monk    public void onSwitchChanged(Switch switchView, boolean isChecked) {
95484caa303561b2d22896f92d3ede9e5a03b9b131Felipe Leme        synchronized(this) {
96484caa303561b2d22896f92d3ede9e5a03b9b131Felipe Leme            if (mSwitching) {
97484caa303561b2d22896f92d3ede9e5a03b9b131Felipe Leme                return;
98484caa303561b2d22896f92d3ede9e5a03b9b131Felipe Leme            }
99484caa303561b2d22896f92d3ede9e5a03b9b131Felipe Leme            mSwitching = true;
100484caa303561b2d22896f92d3ede9e5a03b9b131Felipe Leme            mDataSaverBackend.setDataSaverEnabled(isChecked);
101484caa303561b2d22896f92d3ede9e5a03b9b131Felipe Leme        }
102764f45db9168b4f19623b72db8429016d1226cbeJason Monk    }
103764f45db9168b4f19623b72db8429016d1226cbeJason Monk
104764f45db9168b4f19623b72db8429016d1226cbeJason Monk    @Override
1056507613ebcd22e4691c2af92a5c161bd327db336Fan Zhang    public int getMetricsCategory() {
1063e19fc5600f739e7f172fb9331cfc0f4a884d4ceJason Monk        return MetricsEvent.DATA_SAVER_SUMMARY;
107764f45db9168b4f19623b72db8429016d1226cbeJason Monk    }
108764f45db9168b4f19623b72db8429016d1226cbeJason Monk
109764f45db9168b4f19623b72db8429016d1226cbeJason Monk    @Override
110cf2c0b1b97605f8526a8a56b96a981aaa88cd63bFelipe Leme    protected int getHelpResource() {
111cf2c0b1b97605f8526a8a56b96a981aaa88cd63bFelipe Leme        return R.string.help_url_data_saver;
112cf2c0b1b97605f8526a8a56b96a981aaa88cd63bFelipe Leme    }
113cf2c0b1b97605f8526a8a56b96a981aaa88cd63bFelipe Leme
114cf2c0b1b97605f8526a8a56b96a981aaa88cd63bFelipe Leme    @Override
115764f45db9168b4f19623b72db8429016d1226cbeJason Monk    public void onDataSaverChanged(boolean isDataSaving) {
116484caa303561b2d22896f92d3ede9e5a03b9b131Felipe Leme        synchronized(this) {
117484caa303561b2d22896f92d3ede9e5a03b9b131Felipe Leme            mSwitchBar.setChecked(isDataSaving);
118484caa303561b2d22896f92d3ede9e5a03b9b131Felipe Leme            mSwitching = false;
119484caa303561b2d22896f92d3ede9e5a03b9b131Felipe Leme        }
120764f45db9168b4f19623b72db8429016d1226cbeJason Monk    }
121a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk
122a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk    @Override
12385c63f348f7bdccd47266ec9bbd083d49105af53Felipe Leme    public void onWhitelistStatusChanged(int uid, boolean isWhitelisted) {
12485c63f348f7bdccd47266ec9bbd083d49105af53Felipe Leme    }
12585c63f348f7bdccd47266ec9bbd083d49105af53Felipe Leme
12685c63f348f7bdccd47266ec9bbd083d49105af53Felipe Leme    @Override
12785c63f348f7bdccd47266ec9bbd083d49105af53Felipe Leme    public void onBlacklistStatusChanged(int uid, boolean isBlacklisted) {
12885c63f348f7bdccd47266ec9bbd083d49105af53Felipe Leme    }
12985c63f348f7bdccd47266ec9bbd083d49105af53Felipe Leme
13085c63f348f7bdccd47266ec9bbd083d49105af53Felipe Leme    @Override
131a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk    public void onExtraInfoUpdated() {
1329d0542a314506de89cf24b1c7b3dde3a9899bf0cJason Monk        if (!isAdded()) {
1339d0542a314506de89cf24b1c7b3dde3a9899bf0cJason Monk            return;
1349d0542a314506de89cf24b1c7b3dde3a9899bf0cJason Monk        }
135a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk        int count = 0;
136a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk        final ArrayList<AppEntry> allApps = mSession.getAllApps();
137a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk        final int N = allApps.size();
138a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk        for (int i = 0; i < N; i++) {
139a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk            final AppEntry entry = allApps.get(i);
140a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk            if (!ApplicationsState.FILTER_DOWNLOADED_AND_LAUNCHER.filterApp(entry)) {
141a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk                continue;
142a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk            }
143a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk            if (entry.extraInfo != null && ((AppStateDataUsageBridge.DataUsageState)
144a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk                    entry.extraInfo).isDataSaverWhitelisted) {
145a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk                count++;
146a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk            }
147a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk        }
148a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk        mUnrestrictedAccess.setSummary(getResources().getQuantityString(
149a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk                R.plurals.data_saver_unrestricted_summary, count, count));
150a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk    }
151a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk
152a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk    @Override
153a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk    public void onRunningStateChanged(boolean running) {
154a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk
155a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk    }
156a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk
157a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk    @Override
158a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk    public void onPackageListChanged() {
159a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk
160a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk    }
161a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk
162a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk    @Override
163a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk    public void onRebuildComplete(ArrayList<AppEntry> apps) {
164a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk
165a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk    }
166a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk
167a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk    @Override
168a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk    public void onPackageIconChanged() {
169a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk
170a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk    }
171a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk
172a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk    @Override
173a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk    public void onPackageSizeChanged(String packageName) {
174a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk
175a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk    }
176a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk
177a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk    @Override
178a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk    public void onAllSizesComputed() {
179a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk
180a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk    }
181a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk
182a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk    @Override
183a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk    public void onLauncherInfoChanged() {
184a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk
185a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk    }
186a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk
187a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk    @Override
188a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk    public void onLoadEntriesCompleted() {
189a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk
190a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk    }
191764f45db9168b4f19623b72db8429016d1226cbeJason Monk}
192