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