| /* |
| * Copyright (C) 2015 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package com.android.settings.dashboard.conditional; |
| |
| import android.content.ComponentName; |
| import android.content.pm.PackageManager; |
| import android.graphics.drawable.Icon; |
| import android.os.PersistableBundle; |
| import com.android.internal.logging.MetricsLogger; |
| import com.android.internal.logging.MetricsProto.MetricsEvent; |
| |
| import static android.content.pm.PackageManager.DONT_KILL_APP; |
| |
| public abstract class Condition { |
| |
| private static final String KEY_SILENCE = "silence"; |
| private static final String KEY_ACTIVE = "active"; |
| private static final String KEY_LAST_STATE = "last_state"; |
| |
| protected final ConditionManager mManager; |
| |
| private boolean mIsSilenced; |
| private boolean mIsActive; |
| private long mLastStateChange; |
| |
| // All conditions must live in this package. |
| Condition(ConditionManager manager) { |
| mManager = manager; |
| Class<?> receiverClass = getReceiverClass(); |
| if (receiverClass != null && shouldAlwaysListenToBroadcast()) { |
| PackageManager pm = mManager.getContext().getPackageManager(); |
| pm.setComponentEnabledSetting(new ComponentName(mManager.getContext(), receiverClass), |
| PackageManager.COMPONENT_ENABLED_STATE_ENABLED, DONT_KILL_APP); |
| } |
| } |
| |
| void restoreState(PersistableBundle bundle) { |
| mIsSilenced = bundle.getBoolean(KEY_SILENCE); |
| mIsActive = bundle.getBoolean(KEY_ACTIVE); |
| mLastStateChange = bundle.getLong(KEY_LAST_STATE); |
| } |
| |
| boolean saveState(PersistableBundle bundle) { |
| if (mIsSilenced) { |
| bundle.putBoolean(KEY_SILENCE, mIsSilenced); |
| } |
| if (mIsActive) { |
| bundle.putBoolean(KEY_ACTIVE, mIsActive); |
| bundle.putLong(KEY_LAST_STATE, mLastStateChange); |
| } |
| return mIsSilenced || mIsActive; |
| } |
| |
| protected void notifyChanged() { |
| mManager.notifyChanged(this); |
| } |
| |
| public boolean isSilenced() { |
| return mIsSilenced; |
| } |
| |
| public boolean isActive() { |
| return mIsActive; |
| } |
| |
| protected void setActive(boolean active) { |
| if (mIsActive == active) { |
| return; |
| } |
| mIsActive = active; |
| mLastStateChange = System.currentTimeMillis(); |
| if (mIsSilenced && !active) { |
| mIsSilenced = false; |
| onSilenceChanged(mIsSilenced); |
| } |
| notifyChanged(); |
| } |
| |
| public void silence() { |
| if (!mIsSilenced) { |
| mIsSilenced = true; |
| MetricsLogger.action(mManager.getContext(), |
| MetricsEvent.ACTION_SETTINGS_CONDITION_DISMISS, getMetricsConstant()); |
| onSilenceChanged(mIsSilenced); |
| notifyChanged(); |
| } |
| } |
| |
| private void onSilenceChanged(boolean silenced) { |
| if (shouldAlwaysListenToBroadcast()) { |
| // Don't try to disable BroadcastReceiver if we want it always on. |
| return; |
| } |
| Class<?> clz = getReceiverClass(); |
| if (clz == null) { |
| return; |
| } |
| // Only need to listen for changes when its been silenced. |
| PackageManager pm = mManager.getContext().getPackageManager(); |
| pm.setComponentEnabledSetting(new ComponentName(mManager.getContext(), clz), |
| silenced ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED |
| : PackageManager.COMPONENT_ENABLED_STATE_DISABLED, |
| DONT_KILL_APP); |
| } |
| |
| protected Class<?> getReceiverClass() { |
| return null; |
| } |
| |
| protected boolean shouldAlwaysListenToBroadcast() { |
| return false; |
| } |
| |
| public boolean shouldShow() { |
| return isActive() && !isSilenced(); |
| } |
| |
| long getLastChange() { |
| return mLastStateChange; |
| } |
| |
| // State. |
| public abstract void refreshState(); |
| |
| public abstract int getMetricsConstant(); |
| |
| // UI. |
| public abstract Icon getIcon(); |
| public abstract CharSequence getTitle(); |
| public abstract CharSequence getSummary(); |
| public abstract CharSequence[] getActions(); |
| |
| public abstract void onPrimaryClick(); |
| public abstract void onActionClick(int index); |
| } |