1db4ed191deefeda79af5644634415597c1c70217Jason Monk/*
2db4ed191deefeda79af5644634415597c1c70217Jason Monk * Copyright (C) 2015 The Android Open Source Project
3db4ed191deefeda79af5644634415597c1c70217Jason Monk *
4db4ed191deefeda79af5644634415597c1c70217Jason Monk * Licensed under the Apache License, Version 2.0 (the "License");
5db4ed191deefeda79af5644634415597c1c70217Jason Monk * you may not use this file except in compliance with the License.
6db4ed191deefeda79af5644634415597c1c70217Jason Monk * You may obtain a copy of the License at
7db4ed191deefeda79af5644634415597c1c70217Jason Monk *
8db4ed191deefeda79af5644634415597c1c70217Jason Monk *      http://www.apache.org/licenses/LICENSE-2.0
9db4ed191deefeda79af5644634415597c1c70217Jason Monk *
10db4ed191deefeda79af5644634415597c1c70217Jason Monk * Unless required by applicable law or agreed to in writing, software
11db4ed191deefeda79af5644634415597c1c70217Jason Monk * distributed under the License is distributed on an "AS IS" BASIS,
12db4ed191deefeda79af5644634415597c1c70217Jason Monk * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13db4ed191deefeda79af5644634415597c1c70217Jason Monk * See the License for the specific language governing permissions and
14db4ed191deefeda79af5644634415597c1c70217Jason Monk * limitations under the License.
15db4ed191deefeda79af5644634415597c1c70217Jason Monk */
16db4ed191deefeda79af5644634415597c1c70217Jason Monk
17db4ed191deefeda79af5644634415597c1c70217Jason Monkpackage com.android.settings.dashboard.conditional;
18db4ed191deefeda79af5644634415597c1c70217Jason Monk
190f01c849cd6b546f216f9fac837693fc4a9c5138Doris Lingimport android.content.BroadcastReceiver;
20c93d18e29c4c0c82483d87345dbfc1afae1ed2fcFan Zhangimport android.content.Context;
210f01c849cd6b546f216f9fac837693fc4a9c5138Doris Lingimport android.content.IntentFilter;
22db4ed191deefeda79af5644634415597c1c70217Jason Monkimport android.graphics.drawable.Icon;
23db4ed191deefeda79af5644634415597c1c70217Jason Monkimport android.os.PersistableBundle;
24c93d18e29c4c0c82483d87345dbfc1afae1ed2fcFan Zhang
250f01c849cd6b546f216f9fac837693fc4a9c5138Doris Lingimport android.support.annotation.VisibleForTesting;
26265d3c2a0c36251bf8a9f571d7239b6dd404d942Tamas Berghammerimport com.android.internal.logging.nano.MetricsProto.MetricsEvent;
27c93d18e29c4c0c82483d87345dbfc1afae1ed2fcFan Zhangimport com.android.settings.core.instrumentation.MetricsFeatureProvider;
28c93d18e29c4c0c82483d87345dbfc1afae1ed2fcFan Zhangimport com.android.settings.overlay.FeatureFactory;
29db4ed191deefeda79af5644634415597c1c70217Jason Monk
30db4ed191deefeda79af5644634415597c1c70217Jason Monkpublic abstract class Condition {
31db4ed191deefeda79af5644634415597c1c70217Jason Monk
32db4ed191deefeda79af5644634415597c1c70217Jason Monk    private static final String KEY_SILENCE = "silence";
33db4ed191deefeda79af5644634415597c1c70217Jason Monk    private static final String KEY_ACTIVE = "active";
34db4ed191deefeda79af5644634415597c1c70217Jason Monk    private static final String KEY_LAST_STATE = "last_state";
35db4ed191deefeda79af5644634415597c1c70217Jason Monk
36db4ed191deefeda79af5644634415597c1c70217Jason Monk    protected final ConditionManager mManager;
37c93d18e29c4c0c82483d87345dbfc1afae1ed2fcFan Zhang    protected final MetricsFeatureProvider mMetricsFeatureProvider;
38b72163b9d0e4ed79327fe10fba0e0a187dd0de18Doris Ling    protected boolean mReceiverRegistered;
39db4ed191deefeda79af5644634415597c1c70217Jason Monk
40db4ed191deefeda79af5644634415597c1c70217Jason Monk    private boolean mIsSilenced;
41db4ed191deefeda79af5644634415597c1c70217Jason Monk    private boolean mIsActive;
42db4ed191deefeda79af5644634415597c1c70217Jason Monk    private long mLastStateChange;
43db4ed191deefeda79af5644634415597c1c70217Jason Monk
445673ced93cda4a48872c1452122ee278da3aa17aJason Monk    // All conditions must live in this package.
455673ced93cda4a48872c1452122ee278da3aa17aJason Monk    Condition(ConditionManager manager) {
46c93d18e29c4c0c82483d87345dbfc1afae1ed2fcFan Zhang       this(manager, FeatureFactory.getFactory(manager.getContext()).getMetricsFeatureProvider());
47c93d18e29c4c0c82483d87345dbfc1afae1ed2fcFan Zhang    }
48c93d18e29c4c0c82483d87345dbfc1afae1ed2fcFan Zhang
49c93d18e29c4c0c82483d87345dbfc1afae1ed2fcFan Zhang    Condition(ConditionManager manager, MetricsFeatureProvider metricsFeatureProvider) {
50db4ed191deefeda79af5644634415597c1c70217Jason Monk        mManager = manager;
51c93d18e29c4c0c82483d87345dbfc1afae1ed2fcFan Zhang        mMetricsFeatureProvider = metricsFeatureProvider;
52db4ed191deefeda79af5644634415597c1c70217Jason Monk    }
53db4ed191deefeda79af5644634415597c1c70217Jason Monk
54db4ed191deefeda79af5644634415597c1c70217Jason Monk    void restoreState(PersistableBundle bundle) {
55db4ed191deefeda79af5644634415597c1c70217Jason Monk        mIsSilenced = bundle.getBoolean(KEY_SILENCE);
56db4ed191deefeda79af5644634415597c1c70217Jason Monk        mIsActive = bundle.getBoolean(KEY_ACTIVE);
57db4ed191deefeda79af5644634415597c1c70217Jason Monk        mLastStateChange = bundle.getLong(KEY_LAST_STATE);
58db4ed191deefeda79af5644634415597c1c70217Jason Monk    }
59db4ed191deefeda79af5644634415597c1c70217Jason Monk
605673ced93cda4a48872c1452122ee278da3aa17aJason Monk    boolean saveState(PersistableBundle bundle) {
615673ced93cda4a48872c1452122ee278da3aa17aJason Monk        if (mIsSilenced) {
625673ced93cda4a48872c1452122ee278da3aa17aJason Monk            bundle.putBoolean(KEY_SILENCE, mIsSilenced);
635673ced93cda4a48872c1452122ee278da3aa17aJason Monk        }
645673ced93cda4a48872c1452122ee278da3aa17aJason Monk        if (mIsActive) {
655673ced93cda4a48872c1452122ee278da3aa17aJason Monk            bundle.putBoolean(KEY_ACTIVE, mIsActive);
665673ced93cda4a48872c1452122ee278da3aa17aJason Monk            bundle.putLong(KEY_LAST_STATE, mLastStateChange);
675673ced93cda4a48872c1452122ee278da3aa17aJason Monk        }
685673ced93cda4a48872c1452122ee278da3aa17aJason Monk        return mIsSilenced || mIsActive;
69db4ed191deefeda79af5644634415597c1c70217Jason Monk    }
70db4ed191deefeda79af5644634415597c1c70217Jason Monk
71db4ed191deefeda79af5644634415597c1c70217Jason Monk    protected void notifyChanged() {
72db4ed191deefeda79af5644634415597c1c70217Jason Monk        mManager.notifyChanged(this);
73db4ed191deefeda79af5644634415597c1c70217Jason Monk    }
74db4ed191deefeda79af5644634415597c1c70217Jason Monk
75db4ed191deefeda79af5644634415597c1c70217Jason Monk    public boolean isSilenced() {
76db4ed191deefeda79af5644634415597c1c70217Jason Monk        return mIsSilenced;
77db4ed191deefeda79af5644634415597c1c70217Jason Monk    }
78db4ed191deefeda79af5644634415597c1c70217Jason Monk
79db4ed191deefeda79af5644634415597c1c70217Jason Monk    public boolean isActive() {
80db4ed191deefeda79af5644634415597c1c70217Jason Monk        return mIsActive;
81db4ed191deefeda79af5644634415597c1c70217Jason Monk    }
82db4ed191deefeda79af5644634415597c1c70217Jason Monk
83db4ed191deefeda79af5644634415597c1c70217Jason Monk    protected void setActive(boolean active) {
84db4ed191deefeda79af5644634415597c1c70217Jason Monk        if (mIsActive == active) {
85db4ed191deefeda79af5644634415597c1c70217Jason Monk            return;
86db4ed191deefeda79af5644634415597c1c70217Jason Monk        }
87db4ed191deefeda79af5644634415597c1c70217Jason Monk        mIsActive = active;
88db4ed191deefeda79af5644634415597c1c70217Jason Monk        mLastStateChange = System.currentTimeMillis();
89db4ed191deefeda79af5644634415597c1c70217Jason Monk        if (mIsSilenced && !active) {
90db4ed191deefeda79af5644634415597c1c70217Jason Monk            mIsSilenced = false;
91db4ed191deefeda79af5644634415597c1c70217Jason Monk            onSilenceChanged(mIsSilenced);
92db4ed191deefeda79af5644634415597c1c70217Jason Monk        }
93db4ed191deefeda79af5644634415597c1c70217Jason Monk        notifyChanged();
94db4ed191deefeda79af5644634415597c1c70217Jason Monk    }
95db4ed191deefeda79af5644634415597c1c70217Jason Monk
96db4ed191deefeda79af5644634415597c1c70217Jason Monk    public void silence() {
97db4ed191deefeda79af5644634415597c1c70217Jason Monk        if (!mIsSilenced) {
98db4ed191deefeda79af5644634415597c1c70217Jason Monk            mIsSilenced = true;
99c93d18e29c4c0c82483d87345dbfc1afae1ed2fcFan Zhang            Context context = mManager.getContext();
100c93d18e29c4c0c82483d87345dbfc1afae1ed2fcFan Zhang            mMetricsFeatureProvider.action(context, MetricsEvent.ACTION_SETTINGS_CONDITION_DISMISS,
101c93d18e29c4c0c82483d87345dbfc1afae1ed2fcFan Zhang                    getMetricsConstant());
102db4ed191deefeda79af5644634415597c1c70217Jason Monk            onSilenceChanged(mIsSilenced);
103db4ed191deefeda79af5644634415597c1c70217Jason Monk            notifyChanged();
104db4ed191deefeda79af5644634415597c1c70217Jason Monk        }
105db4ed191deefeda79af5644634415597c1c70217Jason Monk    }
106db4ed191deefeda79af5644634415597c1c70217Jason Monk
1070f01c849cd6b546f216f9fac837693fc4a9c5138Doris Ling    @VisibleForTesting
1080f01c849cd6b546f216f9fac837693fc4a9c5138Doris Ling    void onSilenceChanged(boolean silenced) {
1090f01c849cd6b546f216f9fac837693fc4a9c5138Doris Ling        final BroadcastReceiver receiver = getReceiver();
1100f01c849cd6b546f216f9fac837693fc4a9c5138Doris Ling        if (receiver == null) {
111bebba4478db75f4ce5082dc4944028a4f382ab40Fan Zhang            return;
112bebba4478db75f4ce5082dc4944028a4f382ab40Fan Zhang        }
1130f01c849cd6b546f216f9fac837693fc4a9c5138Doris Ling        if (silenced) {
114b72163b9d0e4ed79327fe10fba0e0a187dd0de18Doris Ling            if (!mReceiverRegistered) {
115b72163b9d0e4ed79327fe10fba0e0a187dd0de18Doris Ling                mManager.getContext().registerReceiver(receiver, getIntentFilter());
116b72163b9d0e4ed79327fe10fba0e0a187dd0de18Doris Ling                mReceiverRegistered = true;
117b72163b9d0e4ed79327fe10fba0e0a187dd0de18Doris Ling            }
1180f01c849cd6b546f216f9fac837693fc4a9c5138Doris Ling        } else {
119b72163b9d0e4ed79327fe10fba0e0a187dd0de18Doris Ling            if (mReceiverRegistered) {
120b72163b9d0e4ed79327fe10fba0e0a187dd0de18Doris Ling                mManager.getContext().unregisterReceiver(receiver);
121b72163b9d0e4ed79327fe10fba0e0a187dd0de18Doris Ling                mReceiverRegistered = false;
122b72163b9d0e4ed79327fe10fba0e0a187dd0de18Doris Ling            }
12370ecea22076c53599932f2146bc25ddf3b49c6a6Jason Monk        }
12470ecea22076c53599932f2146bc25ddf3b49c6a6Jason Monk    }
12570ecea22076c53599932f2146bc25ddf3b49c6a6Jason Monk
1260f01c849cd6b546f216f9fac837693fc4a9c5138Doris Ling    protected BroadcastReceiver getReceiver() {
12770ecea22076c53599932f2146bc25ddf3b49c6a6Jason Monk        return null;
128db4ed191deefeda79af5644634415597c1c70217Jason Monk    }
129db4ed191deefeda79af5644634415597c1c70217Jason Monk
1300f01c849cd6b546f216f9fac837693fc4a9c5138Doris Ling    protected IntentFilter getIntentFilter() {
1310f01c849cd6b546f216f9fac837693fc4a9c5138Doris Ling        return null;
132bebba4478db75f4ce5082dc4944028a4f382ab40Fan Zhang    }
133bebba4478db75f4ce5082dc4944028a4f382ab40Fan Zhang
134db4ed191deefeda79af5644634415597c1c70217Jason Monk    public boolean shouldShow() {
135db4ed191deefeda79af5644634415597c1c70217Jason Monk        return isActive() && !isSilenced();
136db4ed191deefeda79af5644634415597c1c70217Jason Monk    }
137db4ed191deefeda79af5644634415597c1c70217Jason Monk
138db4ed191deefeda79af5644634415597c1c70217Jason Monk    long getLastChange() {
139db4ed191deefeda79af5644634415597c1c70217Jason Monk        return mLastStateChange;
140db4ed191deefeda79af5644634415597c1c70217Jason Monk    }
141db4ed191deefeda79af5644634415597c1c70217Jason Monk
1420f01c849cd6b546f216f9fac837693fc4a9c5138Doris Ling    public void onResume() {
1430f01c849cd6b546f216f9fac837693fc4a9c5138Doris Ling    }
1440f01c849cd6b546f216f9fac837693fc4a9c5138Doris Ling
1450f01c849cd6b546f216f9fac837693fc4a9c5138Doris Ling    public void onPause() {
1460f01c849cd6b546f216f9fac837693fc4a9c5138Doris Ling    }
1470f01c849cd6b546f216f9fac837693fc4a9c5138Doris Ling
148db4ed191deefeda79af5644634415597c1c70217Jason Monk    // State.
149db4ed191deefeda79af5644634415597c1c70217Jason Monk    public abstract void refreshState();
150db4ed191deefeda79af5644634415597c1c70217Jason Monk
151f20c718f192d680bc4941e544c218c5a204c35f9Jason Monk    public abstract int getMetricsConstant();
152f20c718f192d680bc4941e544c218c5a204c35f9Jason Monk
153db4ed191deefeda79af5644634415597c1c70217Jason Monk    // UI.
154db4ed191deefeda79af5644634415597c1c70217Jason Monk    public abstract Icon getIcon();
155db4ed191deefeda79af5644634415597c1c70217Jason Monk    public abstract CharSequence getTitle();
156db4ed191deefeda79af5644634415597c1c70217Jason Monk    public abstract CharSequence getSummary();
157db4ed191deefeda79af5644634415597c1c70217Jason Monk    public abstract CharSequence[] getActions();
158db4ed191deefeda79af5644634415597c1c70217Jason Monk
159db4ed191deefeda79af5644634415597c1c70217Jason Monk    public abstract void onPrimaryClick();
160db4ed191deefeda79af5644634415597c1c70217Jason Monk    public abstract void onActionClick(int index);
161db4ed191deefeda79af5644634415597c1c70217Jason Monk}
162