Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 436815da authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Add nfc preference controller."

parents 533bfa6b e214570a
Loading
Loading
Loading
Loading
+7 −46
Original line number Diff line number Diff line
@@ -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);
+8 −1
Original line number Diff line number Diff line
@@ -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<PreferenceController> getPreferenceControllers(Context context) {
        return null;
        final NfcPreferenceController nfcPreferenceController =
                new NfcPreferenceController(context);
        getLifecycle().addObserver(nfcPreferenceController);
        final List<PreferenceController> controllers = new ArrayList<>();
        controllers.add(nfcPreferenceController);
        return controllers;
    }

}
 No newline at end of file
+172 −0
Original line number Diff line number Diff line
/*
 * 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<String> 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();
        }
    }

}