diff options
author | Chihhang Chuang <chihhangchuang@google.com> | 2018-03-29 17:26:04 +0800 |
---|---|---|
committer | Chihhang Chuang <chihhangchuang@google.com> | 2018-05-24 10:31:44 +0800 |
commit | 6719a9b73e7b72292a98db322a26396da6385db7 (patch) | |
tree | bf5c0c9710253c405745c0d168e795600cb72b7c /src/com/android/settings/nfc | |
parent | 5a0a7ef4bbeed9b3c54c8fec38c89a3827563e02 (diff) | |
download | packages_apps_Settings-6719a9b73e7b72292a98db322a26396da6385db7.tar.gz packages_apps_Settings-6719a9b73e7b72292a98db322a26396da6385db7.tar.bz2 packages_apps_Settings-6719a9b73e7b72292a98db322a26396da6385db7.zip |
Refactor nfc preference controller
- Remove BaseNfcPreferenceController.
- NfcPreferenceController inherit from TogglePreferenceController.
- AndroidBeamPreferenceController inherit from BasePreferenceController.
- Override getIntentFilter in NfcPreferenceController to listen changes.
- Add an API (hasAsyncUpdate) into BasePreferenceController to
distinguish the setting which is updated asynchronously.
Change-Id: I1abe4410169e305a0d6106e24c54e7f2e763fc91
Merged-In: I7c9c48ea7f1ad01a02524beabf9d30baa3db891f
Fixes: 67997761
Fixes: 74887543
Test: RunSettingsRoboTests
Diffstat (limited to 'src/com/android/settings/nfc')
6 files changed, 221 insertions, 199 deletions
diff --git a/src/com/android/settings/nfc/AndroidBeamEnabler.java b/src/com/android/settings/nfc/AndroidBeamEnabler.java index 66e42b6418..1808775353 100644 --- a/src/com/android/settings/nfc/AndroidBeamEnabler.java +++ b/src/com/android/settings/nfc/AndroidBeamEnabler.java @@ -20,7 +20,6 @@ import android.content.Context; import android.nfc.NfcAdapter; import android.os.UserHandle; import android.os.UserManager; -import android.support.v7.preference.Preference; import com.android.settings.R; import com.android.settingslib.RestrictedLockUtils; @@ -36,18 +35,14 @@ public class AndroidBeamEnabler extends BaseNfcEnabler { public AndroidBeamEnabler(Context context, RestrictedPreference preference) { super(context); - mPreference = preference; - mBeamDisallowedBySystem = RestrictedLockUtils.hasBaseUserRestriction(context, UserManager.DISALLOW_OUTGOING_BEAM, UserHandle.myUserId()); - if (!isNfcAvailable()) { // NFC is not supported mPreference.setEnabled(false); return; } - if (mBeamDisallowedBySystem) { mPreference.setEnabled(false); } diff --git a/src/com/android/settings/nfc/AndroidBeamPreferenceController.java b/src/com/android/settings/nfc/AndroidBeamPreferenceController.java index 6ae7fe5ccf..b4026de15a 100644 --- a/src/com/android/settings/nfc/AndroidBeamPreferenceController.java +++ b/src/com/android/settings/nfc/AndroidBeamPreferenceController.java @@ -16,34 +16,75 @@ package com.android.settings.nfc; import android.content.Context; +import android.nfc.NfcAdapter; +import android.support.v7.preference.Preference; import android.support.v7.preference.PreferenceScreen; -import com.android.settings.core.PreferenceControllerMixin; +import com.android.settings.core.BasePreferenceController; import com.android.settingslib.RestrictedPreference; import com.android.settingslib.core.lifecycle.LifecycleObserver; import com.android.settingslib.core.lifecycle.events.OnPause; import com.android.settingslib.core.lifecycle.events.OnResume; -public class AndroidBeamPreferenceController extends BaseNfcPreferenceController { +import java.util.List; + +public class AndroidBeamPreferenceController extends BasePreferenceController + implements LifecycleObserver, OnResume, OnPause { public static final String KEY_ANDROID_BEAM_SETTINGS = "android_beam_settings"; + private final NfcAdapter mNfcAdapter; + private AndroidBeamEnabler mAndroidBeamEnabler; + private NfcAirplaneModeObserver mAirplaneModeObserver; - public AndroidBeamPreferenceController(Context context) { - super(context); + public AndroidBeamPreferenceController(Context context, String key) { + super(context, key); + mNfcAdapter = NfcAdapter.getDefaultAdapter(context); } @Override public void displayPreference(PreferenceScreen screen) { super.displayPreference(screen); if (!isAvailable()) { + mAndroidBeamEnabler = null; return; } - mNfcEnabler = new AndroidBeamEnabler(mContext, (RestrictedPreference) mPreference); + final RestrictedPreference restrictedPreference = + (RestrictedPreference) screen.findPreference(getPreferenceKey()); + mAndroidBeamEnabler = new AndroidBeamEnabler(mContext, restrictedPreference); + + // Manually set dependencies for NFC when not toggleable. + if (!NfcPreferenceController.isToggleableInAirplaneMode(mContext)) { + mAirplaneModeObserver = new NfcAirplaneModeObserver(mContext, mNfcAdapter, + (Preference) restrictedPreference); + } } @Override - public String getPreferenceKey() { - return KEY_ANDROID_BEAM_SETTINGS; + @AvailabilityStatus + public int getAvailabilityStatus() { + return mNfcAdapter != null + ? AVAILABLE + : UNSUPPORTED_ON_DEVICE; + } + + @Override + public void onResume() { + if (mAirplaneModeObserver != null) { + mAirplaneModeObserver.register(); + } + if (mAndroidBeamEnabler != null) { + mAndroidBeamEnabler.resume(); + } + } + + @Override + public void onPause() { + if (mAirplaneModeObserver != null) { + mAirplaneModeObserver.unregister(); + } + if (mAndroidBeamEnabler != null) { + mAndroidBeamEnabler.pause(); + } } } diff --git a/src/com/android/settings/nfc/BaseNfcPreferenceController.java b/src/com/android/settings/nfc/BaseNfcPreferenceController.java deleted file mode 100644 index 33d75fab67..0000000000 --- a/src/com/android/settings/nfc/BaseNfcPreferenceController.java +++ /dev/null @@ -1,147 +0,0 @@ -/* - * Copyright (C) 2018 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.nfc; - -import android.content.Context; -import android.database.ContentObserver; -import android.net.Uri; -import android.nfc.NfcAdapter; -import android.nfc.NfcManager; -import android.os.Handler; -import android.provider.Settings; -import android.support.v7.preference.Preference; -import android.support.v7.preference.PreferenceScreen; - -import com.android.settings.core.PreferenceControllerMixin; -import com.android.settingslib.core.AbstractPreferenceController; -import com.android.settingslib.core.lifecycle.LifecycleObserver; -import com.android.settingslib.core.lifecycle.events.OnPause; -import com.android.settingslib.core.lifecycle.events.OnResume; - -import java.util.List; - -public abstract class BaseNfcPreferenceController extends AbstractPreferenceController - implements PreferenceControllerMixin, LifecycleObserver, OnResume, OnPause { - - protected BaseNfcEnabler mNfcEnabler; - private NfcAdapter mNfcAdapter; - private int mAirplaneMode; - private AirplaneModeObserver mAirplaneModeObserver; - protected Preference mPreference; - - public BaseNfcPreferenceController(Context context) { - super(context); - mNfcAdapter = NfcAdapter.getDefaultAdapter(context); - } - - @Override - public void displayPreference(PreferenceScreen screen) { - super.displayPreference(screen); - - if (!isAvailable()) { - mNfcEnabler = null; - return; - } - - mPreference = screen.findPreference(getPreferenceKey()); - - // Manually set dependencies for NFC when not toggleable. - if (!isToggleableInAirplaneMode(mContext)) { - mAirplaneModeObserver = new AirplaneModeObserver(); - updateNfcPreference(); - } - } - - @Override - public void updateNonIndexableKeys(List<String> keys) { - if (!isAvailable()) { - keys.add(getPreferenceKey()); - } - } - - @Override - public boolean isAvailable() { - return mNfcAdapter != null; - } - - public abstract String getPreferenceKey(); - - @Override - public void onResume() { - if (mAirplaneModeObserver != null) { - mAirplaneModeObserver.register(); - } - if (mNfcEnabler != null) { - mNfcEnabler.resume(); - } - } - - @Override - public void onPause() { - if (mAirplaneModeObserver != null) { - mAirplaneModeObserver.unregister(); - } - if (mNfcEnabler != null) { - mNfcEnabler.pause(); - } - } - - private void updateNfcPreference() { - final int airplaneMode = Settings.Global.getInt( - mContext.getContentResolver(), Settings.Global.AIRPLANE_MODE_ON, mAirplaneMode); - if (airplaneMode == mAirplaneMode) { - return; - } - mAirplaneMode = airplaneMode; - boolean toggleable = mAirplaneMode != 1; - if (toggleable) { - mNfcAdapter.enable(); - } else { - mNfcAdapter.disable(); - } - mPreference.setEnabled(toggleable); - } - - public static boolean isToggleableInAirplaneMode(Context context) { - String toggleable = Settings.Global.getString(context.getContentResolver(), - Settings.Global.AIRPLANE_MODE_TOGGLEABLE_RADIOS); - return toggleable != null && toggleable.contains(Settings.Global.RADIO_NFC); - } - - private final class AirplaneModeObserver extends ContentObserver { - private final Uri AIRPLANE_MODE_URI = - Settings.Global.getUriFor(Settings.Global.AIRPLANE_MODE_ON); - - private AirplaneModeObserver() { - super(new Handler()); - } - - public void register() { - mContext.getContentResolver().registerContentObserver(AIRPLANE_MODE_URI, false, this); - } - - public void unregister() { - mContext.getContentResolver().unregisterContentObserver(this); - } - - @Override - public void onChange(boolean selfChange, Uri uri) { - super.onChange(selfChange, uri); - updateNfcPreference(); - } - } - -} diff --git a/src/com/android/settings/nfc/NfcAirplaneModeObserver.java b/src/com/android/settings/nfc/NfcAirplaneModeObserver.java new file mode 100644 index 0000000000..723d814391 --- /dev/null +++ b/src/com/android/settings/nfc/NfcAirplaneModeObserver.java @@ -0,0 +1,81 @@ +/* + * Copyright (C) 2018 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.nfc; + +import android.content.Context; +import android.database.ContentObserver; +import android.net.Uri; +import android.nfc.NfcAdapter; +import android.os.Handler; +import android.os.Looper; +import android.provider.Settings; +import android.support.annotation.VisibleForTesting; +import android.support.v7.preference.Preference; + +/** + * NfcAirplaneModeObserver is a helper to manage the Nfc on/off when airplane mode status + * is changed. + */ +public class NfcAirplaneModeObserver extends ContentObserver { + + private final Context mContext; + private final NfcAdapter mNfcAdapter; + private final Preference mPreference; + private int mAirplaneMode; + + @VisibleForTesting + final static Uri AIRPLANE_MODE_URI = + Settings.Global.getUriFor(Settings.Global.AIRPLANE_MODE_ON); + + public NfcAirplaneModeObserver(Context context, NfcAdapter nfcAdapter, Preference preference) { + super(new Handler(Looper.getMainLooper())); + mContext = context; + mNfcAdapter = nfcAdapter; + mPreference = preference; + updateNfcPreference(); + } + + public void register() { + mContext.getContentResolver().registerContentObserver(AIRPLANE_MODE_URI, false, this); + } + + public void unregister() { + mContext.getContentResolver().unregisterContentObserver(this); + } + + @Override + public void onChange(boolean selfChange, Uri uri) { + super.onChange(selfChange, uri); + updateNfcPreference(); + } + + private void updateNfcPreference() { + final int airplaneMode = Settings.Global.getInt( + mContext.getContentResolver(), Settings.Global.AIRPLANE_MODE_ON, mAirplaneMode); + if (airplaneMode == mAirplaneMode) { + return; + } + + mAirplaneMode = airplaneMode; + boolean toggleable = mAirplaneMode != 1; + if (toggleable) { + mNfcAdapter.enable(); + } else { + mNfcAdapter.disable(); + } + mPreference.setEnabled(toggleable); + } +} diff --git a/src/com/android/settings/nfc/NfcEnabler.java b/src/com/android/settings/nfc/NfcEnabler.java index 29cef99355..f39a0a1a46 100644 --- a/src/com/android/settings/nfc/NfcEnabler.java +++ b/src/com/android/settings/nfc/NfcEnabler.java @@ -18,52 +18,20 @@ package com.android.settings.nfc; import android.content.Context; import android.nfc.NfcAdapter; -import android.support.v7.preference.Preference; import android.support.v14.preference.SwitchPreference; /** * NfcEnabler is a helper to manage the Nfc on/off checkbox preference. It turns on/off Nfc * and ensures the summary of the preference reflects the current state. */ -public class NfcEnabler extends BaseNfcEnabler implements Preference.OnPreferenceChangeListener { +public class NfcEnabler extends BaseNfcEnabler { private final SwitchPreference mPreference; public NfcEnabler(Context context, SwitchPreference preference) { super(context); - mPreference = preference; } - public void resume() { - super.resume(); - if (isNfcAvailable()) { - mPreference.setOnPreferenceChangeListener(this); - } - } - - public void pause() { - super.pause(); - if (isNfcAvailable()) { - mPreference.setOnPreferenceChangeListener(null); - } - } - - public boolean onPreferenceChange(Preference preference, Object value) { - // Turn NFC on/off - - final boolean desiredState = (Boolean) value; - mPreference.setChecked(desiredState); - mPreference.setEnabled(false); - - if (desiredState) { - mNfcAdapter.enable(); - } else { - mNfcAdapter.disable(); - } - - return false; - } - @Override protected void handleNfcStateChanged(int newState) { switch (newState) { diff --git a/src/com/android/settings/nfc/NfcPreferenceController.java b/src/com/android/settings/nfc/NfcPreferenceController.java index a0678e0afa..a5d7c768ec 100644 --- a/src/com/android/settings/nfc/NfcPreferenceController.java +++ b/src/com/android/settings/nfc/NfcPreferenceController.java @@ -16,35 +16,119 @@ package com.android.settings.nfc; import android.content.Context; +import android.content.IntentFilter; +import android.nfc.NfcAdapter; +import android.provider.Settings; +import android.text.TextUtils; + +import android.support.v7.preference.Preference; import android.support.v7.preference.PreferenceScreen; import android.support.v14.preference.SwitchPreference; -import com.android.settings.core.PreferenceControllerMixin; +import com.android.settings.core.TogglePreferenceController; import com.android.settingslib.core.lifecycle.LifecycleObserver; import com.android.settingslib.core.lifecycle.events.OnPause; import com.android.settingslib.core.lifecycle.events.OnResume; +import java.util.List; -public class NfcPreferenceController extends BaseNfcPreferenceController { +public class NfcPreferenceController extends TogglePreferenceController + implements LifecycleObserver, OnResume, OnPause { public static final String KEY_TOGGLE_NFC = "toggle_nfc"; + private final NfcAdapter mNfcAdapter; + private NfcEnabler mNfcEnabler; + private NfcAirplaneModeObserver mAirplaneModeObserver; - public NfcPreferenceController(Context context) { - super(context); + public NfcPreferenceController(Context context, String key) { + super(context, key); + mNfcAdapter = NfcAdapter.getDefaultAdapter(context); } @Override public void displayPreference(PreferenceScreen screen) { super.displayPreference(screen); if (!isAvailable()) { + mNfcEnabler = null; return; } - mNfcEnabler = new NfcEnabler(mContext, (SwitchPreference) mPreference); + final SwitchPreference switchPreference = + (SwitchPreference) screen.findPreference(getPreferenceKey()); + + mNfcEnabler = new NfcEnabler(mContext, switchPreference); + + // Manually set dependencies for NFC when not toggleable. + if (!isToggleableInAirplaneMode(mContext)) { + mAirplaneModeObserver = new NfcAirplaneModeObserver(mContext, + mNfcAdapter, (Preference) switchPreference); + } + } + + @Override + public boolean isChecked() { + return mNfcAdapter.isEnabled(); + } + + @Override + public boolean setChecked(boolean isChecked) { + if (isChecked) { + mNfcAdapter.enable(); + } else { + mNfcAdapter.disable(); + } + return true; + } + + @Override + @AvailabilityStatus + public int getAvailabilityStatus() { + return mNfcAdapter != null + ? AVAILABLE + : UNSUPPORTED_ON_DEVICE; + } + + @Override + public IntentFilter getIntentFilter() { + final IntentFilter filter = new IntentFilter(); + filter.addAction(NfcAdapter.ACTION_ADAPTER_STATE_CHANGED); + filter.addAction(NfcAdapter.EXTRA_ADAPTER_STATE); + return filter; + } + + @Override + public boolean hasAsyncUpdate() { + return true; + } + + @Override + public boolean isSliceable() { + return TextUtils.equals(getPreferenceKey(), KEY_TOGGLE_NFC); + } + + @Override + public void onResume() { + if (mAirplaneModeObserver != null) { + mAirplaneModeObserver.register(); + } + if (mNfcEnabler != null) { + mNfcEnabler.resume(); + } } @Override - public String getPreferenceKey() { - return KEY_TOGGLE_NFC; + public void onPause() { + if (mAirplaneModeObserver != null) { + mAirplaneModeObserver.unregister(); + } + if (mNfcEnabler != null) { + mNfcEnabler.pause(); + } + } + + public static boolean isToggleableInAirplaneMode(Context context) { + final String toggleable = Settings.Global.getString(context.getContentResolver(), + Settings.Global.AIRPLANE_MODE_TOGGLEABLE_RADIOS); + return toggleable != null && toggleable.contains(Settings.Global.RADIO_NFC); } } |