diff --git a/src/com/android/settings/WirelessSettings.java b/src/com/android/settings/WirelessSettings.java index 5f7c759fb2d..cac964db69f 100644 --- a/src/com/android/settings/WirelessSettings.java +++ b/src/com/android/settings/WirelessSettings.java @@ -24,14 +24,11 @@ import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.net.ConnectivityManager; -import android.nfc.NfcAdapter; -import android.nfc.NfcManager; import android.os.Bundle; import android.os.UserHandle; import android.os.UserManager; import android.provider.SearchIndexableResource; import android.provider.Settings; -import android.support.v14.preference.SwitchPreference; import android.support.v7.preference.Preference; import android.support.v7.preference.PreferenceScreen; import android.telephony.TelephonyManager; @@ -46,7 +43,7 @@ import com.android.settings.network.ProxyPreferenceController; import com.android.settings.network.TetherPreferenceController; import com.android.settings.network.VpnPreferenceController; import com.android.settings.network.WifiCallingPreferenceController; -import com.android.settings.nfc.NfcEnabler; +import com.android.settings.nfc.NfcPreferenceController; import com.android.settings.search.BaseSearchIndexProvider; import com.android.settings.search.Indexable; import com.android.settingslib.RestrictedLockUtils; @@ -64,12 +61,8 @@ public class WirelessSettings extends SettingsPreferenceFragment implements Inde MobilePlanPreferenceController.MobilePlanPreferenceHost { private static final String TAG = "WirelessSettings"; - private static final String KEY_TOGGLE_NFC = "toggle_nfc"; private static final String KEY_WIMAX_SETTINGS = "wimax_settings"; - private static final String KEY_ANDROID_BEAM_SETTINGS = "android_beam_settings"; - private NfcEnabler mNfcEnabler; - private NfcAdapter mNfcAdapter; private UserManager mUm; private AirplaneModePreferenceController mAirplaneModePreferenceController; @@ -80,6 +73,7 @@ public class WirelessSettings extends SettingsPreferenceFragment implements Inde private WifiCallingPreferenceController mWifiCallingPreferenceController; private ProxyPreferenceController mProxyPreferenceController; private MobilePlanPreferenceController mMobilePlanPreferenceController; + private NfcPreferenceController mNfcPreferenceController; /** * Invoked on each preference click in this hierarchy, overrides @@ -159,6 +153,7 @@ public class WirelessSettings extends SettingsPreferenceFragment implements Inde mNetworkResetPreferenceController = new NetworkResetPreferenceController(activity); mProxyPreferenceController = new ProxyPreferenceController(activity); mMobilePlanPreferenceController = new MobilePlanPreferenceController(activity, this); + mNfcPreferenceController = new NfcPreferenceController(activity); mMobilePlanPreferenceController.onCreate(savedInstanceState); @@ -170,12 +165,7 @@ public class WirelessSettings extends SettingsPreferenceFragment implements Inde mNetworkResetPreferenceController.displayPreference(screen); mProxyPreferenceController.displayPreference(screen); mMobilePlanPreferenceController.displayPreference(screen); - - SwitchPreference nfc = (SwitchPreference) findPreference(KEY_TOGGLE_NFC); - RestrictedPreference androidBeam = (RestrictedPreference) findPreference( - KEY_ANDROID_BEAM_SETTINGS); - - mNfcEnabler = new NfcEnabler(activity, nfc, androidBeam); + mNfcPreferenceController.displayPreference(screen); String toggleable = Settings.Global.getString(activity.getContentResolver(), Settings.Global.AIRPLANE_MODE_TOGGLEABLE_RADIOS); @@ -195,22 +185,6 @@ public class WirelessSettings extends SettingsPreferenceFragment implements Inde ps.setDependency(AirplaneModePreferenceController.KEY_TOGGLE_AIRPLANE); } } - - // Manually set dependencies for NFC when not toggleable. - if (toggleable == null || !toggleable.contains(Settings.Global.RADIO_NFC)) { - findPreference(KEY_TOGGLE_NFC).setDependency( - AirplaneModePreferenceController.KEY_TOGGLE_AIRPLANE); - findPreference(KEY_ANDROID_BEAM_SETTINGS).setDependency( - AirplaneModePreferenceController.KEY_TOGGLE_AIRPLANE); - } - - // Remove NFC if not available - mNfcAdapter = NfcAdapter.getDefaultAdapter(activity); - if (mNfcAdapter == null) { - getPreferenceScreen().removePreference(nfc); - getPreferenceScreen().removePreference(androidBeam); - mNfcEnabler = null; - } } @Override @@ -218,9 +192,7 @@ public class WirelessSettings extends SettingsPreferenceFragment implements Inde super.onResume(); mAirplaneModePreferenceController.onResume(); - if (mNfcEnabler != null) { - mNfcEnabler.resume(); - } + mNfcPreferenceController.onResume(); } @Override @@ -233,9 +205,7 @@ public class WirelessSettings extends SettingsPreferenceFragment implements Inde public void onPause() { super.onPause(); mAirplaneModePreferenceController.onPause(); - if (mNfcEnabler != null) { - mNfcEnabler.pause(); - } + mNfcPreferenceController.onPause(); } @Override @@ -287,16 +257,7 @@ public class WirelessSettings extends SettingsPreferenceFragment implements Inde new VpnPreferenceController(context).updateNonIndexableKeys(result); - // Remove NFC if not available - final NfcManager manager = (NfcManager) - context.getSystemService(Context.NFC_SERVICE); - if (manager != null) { - NfcAdapter adapter = manager.getDefaultAdapter(); - if (adapter == null) { - result.add(KEY_TOGGLE_NFC); - result.add(KEY_ANDROID_BEAM_SETTINGS); - } - } + new NfcPreferenceController(context).updateNonIndexableKeys(result); new MobilePlanPreferenceController(context, null /* MobilePlanClickHandler */) .updateNonIndexableKeys(result); new MobileNetworkPreferenceController(context).updateNonIndexableKeys(result); diff --git a/src/com/android/settings/connecteddevice/ConnectedDeviceDashboardFragment.java b/src/com/android/settings/connecteddevice/ConnectedDeviceDashboardFragment.java index 771f9bab539..b913669ec8d 100644 --- a/src/com/android/settings/connecteddevice/ConnectedDeviceDashboardFragment.java +++ b/src/com/android/settings/connecteddevice/ConnectedDeviceDashboardFragment.java @@ -20,8 +20,10 @@ import android.content.Context; import com.android.settings.R; import com.android.settings.core.PreferenceController; import com.android.settings.dashboard.DashboardFragment; +import com.android.settings.nfc.NfcPreferenceController; import com.android.settingslib.drawer.CategoryKey; +import java.util.ArrayList; import java.util.List; public class ConnectedDeviceDashboardFragment extends DashboardFragment { @@ -50,7 +52,12 @@ public class ConnectedDeviceDashboardFragment extends DashboardFragment { @Override protected List getPreferenceControllers(Context context) { - return null; + final NfcPreferenceController nfcPreferenceController = + new NfcPreferenceController(context); + getLifecycle().addObserver(nfcPreferenceController); + final List controllers = new ArrayList<>(); + controllers.add(nfcPreferenceController); + return controllers; } } \ No newline at end of file diff --git a/src/com/android/settings/nfc/NfcPreferenceController.java b/src/com/android/settings/nfc/NfcPreferenceController.java new file mode 100644 index 00000000000..0d31fe6f393 --- /dev/null +++ b/src/com/android/settings/nfc/NfcPreferenceController.java @@ -0,0 +1,172 @@ +/* + * Copyright (C) 2016 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.v14.preference.SwitchPreference; +import android.support.v7.preference.Preference; +import android.support.v7.preference.PreferenceScreen; + +import com.android.settings.core.PreferenceController; +import com.android.settings.core.lifecycle.LifecycleObserver; +import com.android.settings.core.lifecycle.events.OnPause; +import com.android.settings.core.lifecycle.events.OnResume; +import com.android.settings.network.AirplaneModePreferenceController; +import com.android.settings.overlay.FeatureFactory; +import com.android.settingslib.RestrictedPreference; + +import java.util.List; + +public class NfcPreferenceController extends PreferenceController + implements LifecycleObserver, OnResume, OnPause { + + private static final String KEY_TOGGLE_NFC = "toggle_nfc"; + private static final String KEY_ANDROID_BEAM_SETTINGS = "android_beam_settings"; + + private NfcEnabler mNfcEnabler; + private NfcAdapter mNfcAdapter; + private final Handler mHandler = new Handler(); + private int mAirplaneMode; + private AirplaneModeObserver mAirplaneModeObserver; + private SwitchPreference mNfcPreference; + private RestrictedPreference mBeamPreference; + + public NfcPreferenceController(Context context) { + super(context); + mNfcAdapter = NfcAdapter.getDefaultAdapter(context); + } + + @Override + public void displayPreference(PreferenceScreen screen) { + if (!isAvailable()) { + removePreference(screen, KEY_TOGGLE_NFC); + removePreference(screen, KEY_ANDROID_BEAM_SETTINGS); + mNfcEnabler = null; + return; + } + mNfcPreference = (SwitchPreference) screen.findPreference(KEY_TOGGLE_NFC); + mBeamPreference = (RestrictedPreference) screen.findPreference( + KEY_ANDROID_BEAM_SETTINGS); + mNfcEnabler = new NfcEnabler(mContext, mNfcPreference, mBeamPreference); + String toggleable = Settings.Global.getString(mContext.getContentResolver(), + Settings.Global.AIRPLANE_MODE_TOGGLEABLE_RADIOS); + final boolean useNewIA = FeatureFactory.getFactory(mContext) + .getDashboardFeatureProvider(mContext).isEnabled(); + // Manually set dependencies for NFC when not toggleable. + if (toggleable == null || !toggleable.contains(Settings.Global.RADIO_NFC)) { + if (useNewIA) { + mAirplaneModeObserver = new AirplaneModeObserver(); + updateNfcPreference(); + } else { + mNfcPreference.setDependency(AirplaneModePreferenceController.KEY_TOGGLE_AIRPLANE); + mBeamPreference.setDependency(AirplaneModePreferenceController.KEY_TOGGLE_AIRPLANE); + } + } + } + + @Override + public void updateNonIndexableKeys(List keys) { + final NfcManager manager = (NfcManager) mContext.getSystemService(Context.NFC_SERVICE); + if (manager != null) { + NfcAdapter adapter = manager.getDefaultAdapter(); + if (adapter == null) { + keys.add(KEY_TOGGLE_NFC); + keys.add(KEY_ANDROID_BEAM_SETTINGS); + } + } + } + + @Override + public boolean handlePreferenceTreeClick(Preference preference) { + return false; + } + + @Override + protected boolean isAvailable() { + return mNfcAdapter != null; + } + + @Override + protected String getPreferenceKey() { + return null; + } + + 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(); + } + mNfcPreference.setEnabled(toggleable); + mBeamPreference.setEnabled(toggleable); + } + + private final class AirplaneModeObserver extends ContentObserver { + private final Uri AIRPLANE_MODE_URI = + Settings.Global.getUriFor(Settings.Global.AIRPLANE_MODE_ON); + + private AirplaneModeObserver() { + super(mHandler); + } + + 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(); + } + } + +}