summaryrefslogtreecommitdiffstats
path: root/src/com/android/settings/nfc
diff options
context:
space:
mode:
authorChihhang Chuang <chihhangchuang@google.com>2018-03-29 17:26:04 +0800
committerChihhang Chuang <chihhangchuang@google.com>2018-05-24 10:31:44 +0800
commit6719a9b73e7b72292a98db322a26396da6385db7 (patch)
treebf5c0c9710253c405745c0d168e795600cb72b7c /src/com/android/settings/nfc
parent5a0a7ef4bbeed9b3c54c8fec38c89a3827563e02 (diff)
downloadpackages_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')
-rw-r--r--src/com/android/settings/nfc/AndroidBeamEnabler.java5
-rw-r--r--src/com/android/settings/nfc/AndroidBeamPreferenceController.java55
-rw-r--r--src/com/android/settings/nfc/BaseNfcPreferenceController.java147
-rw-r--r--src/com/android/settings/nfc/NfcAirplaneModeObserver.java81
-rw-r--r--src/com/android/settings/nfc/NfcEnabler.java34
-rw-r--r--src/com/android/settings/nfc/NfcPreferenceController.java98
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);
}
}