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

Commit f1acdd3a authored by Fan Zhang's avatar Fan Zhang
Browse files

Add more preference controllers to network page.

- To support Mobile plan preference controller, extended
  LifecycleObserver pattern to also observe onCreate and onSaveInstance.

Bug: 31799836
Test: RunSettingsRoboTests
Change-Id: Ie98db7efa91f0a8b4c8a06a784d3351237e59fe0
parent fdca235d
Loading
Loading
Loading
Loading
+26 −0
Original line number Diff line number Diff line
@@ -54,4 +54,30 @@
        settings:userRestriction="no_config_vpn"
        settings:useAdminDisabledSummary="true"/>

    <com.android.settingslib.RestrictedPreference
        android:key="manage_mobile_plan"
        android:title="@string/manage_mobile_plan_title"
        android:persistent="false"
        settings:userRestriction="no_config_mobile_networks"
        settings:useAdminDisabledSummary="true"/>

    <Preference
        android:key="wifi_calling_settings"
        android:title="@string/wifi_calling_settings_title"
        android:fragment="com.android.settings.WifiCallingSettings"
        settings:keywords="@string/keywords_wifi_calling"/>

    <Preference
        android:fragment="com.android.settings.ProxySelector"
        android:key="proxy_settings"
        android:title="@string/proxy_settings_title"/>

    <!-- Network reset -->
    <com.android.settingslib.RestrictedPreference
        android:key="network_reset"
        android:title="@string/reset_network_title"
        settings:keywords="@string/keywords_network_reset"
        android:fragment="com.android.settings.ResetNetwork"
        settings:userRestriction="no_network_reset"
        settings:useAdminDisabledSummary="true"/>
</PreferenceScreen>
 No newline at end of file
+1 −1
Original line number Diff line number Diff line
@@ -443,7 +443,7 @@ public class WifiCallingSettings extends SettingsPreferenceFragment
        return true;
    }

    static int getWfcModeSummary(Context context, int wfcMode) {
    public static int getWfcModeSummary(Context context, int wfcMode) {
        int resId = com.android.internal.R.string.wifi_calling_off_summary;
        if (ImsManager.isWfcEnabledByUser(context)) {
            switch (wfcMode) {
+91 −224
Original line number Diff line number Diff line
@@ -20,15 +20,10 @@ package com.android.settings;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.admin.DevicePolicyManager;
import android.content.ActivityNotFoundException;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.res.Resources;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.Uri;
import android.nfc.NfcAdapter;
import android.nfc.NfcManager;
import android.os.Bundle;
@@ -40,16 +35,17 @@ import android.support.v14.preference.SwitchPreference;
import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceScreen;
import android.telephony.TelephonyManager;
import android.text.TextUtils;
import android.util.Log;

import com.android.ims.ImsManager;
import com.android.internal.logging.MetricsProto.MetricsEvent;
import com.android.internal.telephony.TelephonyIntents;
import com.android.settings.network.AirplaneModePreferenceController;
import com.android.settings.network.MobileNetworkPreferenceController;
import com.android.settings.network.MobilePlanPreferenceController;
import com.android.settings.network.NetworkResetPreferenceController;
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.search.BaseSearchIndexProvider;
import com.android.settings.search.Indexable;
@@ -61,33 +57,29 @@ import java.util.Arrays;
import java.util.Collections;
import java.util.List;

public class WirelessSettings extends SettingsPreferenceFragment implements Indexable {
import static com.android.settings.network.MobilePlanPreferenceController
        .MANAGE_MOBILE_PLAN_DIALOG_ID;

public class WirelessSettings extends SettingsPreferenceFragment implements Indexable,
        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 static final String KEY_PROXY_SETTINGS = "proxy_settings";

    private static final String KEY_MANAGE_MOBILE_PLAN = "manage_mobile_plan";
    private static final String KEY_WFC_SETTINGS = "wifi_calling_settings";
    private static final String KEY_NETWORK_RESET = "network_reset";
    private NfcEnabler mNfcEnabler;
    private NfcAdapter mNfcAdapter;

    private ConnectivityManager mCm;
    private TelephonyManager mTm;
    private UserManager mUm;

    private static final int MANAGE_MOBILE_PLAN_DIALOG_ID = 1;
    private static final String SAVED_MANAGE_MOBILE_PLAN_MSG = "mManageMobilePlanMessage";

    private PreferenceScreen mButtonWfc;
    private AirplaneModePreferenceController mAirplaneModePreferenceController;
    private TetherPreferenceController mTetherPreferenceController;
    private MobileNetworkPreferenceController mMobileNetworkPreferenceController;
    private VpnPreferenceController mVpnPreferenceController;
    private NetworkResetPreferenceController mNetworkResetPreferenceController;
    private WifiCallingPreferenceController mWifiCallingPreferenceController;
    private ProxyPreferenceController mProxyPreferenceController;
    private MobilePlanPreferenceController mMobilePlanPreferenceController;

    /**
     * Invoked on each preference click in this hierarchy, overrides
@@ -100,93 +92,28 @@ public class WirelessSettings extends SettingsPreferenceFragment implements Inde
        if (mAirplaneModePreferenceController.handlePreferenceTreeClick(preference)) {
            return true;
        }
        if (preference == findPreference(KEY_MANAGE_MOBILE_PLAN)) {
            onManageMobilePlanClick();
        if (mMobilePlanPreferenceController.handlePreferenceTreeClick(preference)) {
            return true;
        }
        // Let the intents be launched by the Preference manager
        return super.onPreferenceTreeClick(preference);
    }

    private String mManageMobilePlanMessage;
    public void onManageMobilePlanClick() {
        log("onManageMobilePlanClick:");
        mManageMobilePlanMessage = null;
        Resources resources = getActivity().getResources();

        NetworkInfo ni = mCm.getActiveNetworkInfo();
        if (mTm.hasIccCard() && (ni != null)) {
            // Check for carrier apps that can handle provisioning first
            Intent provisioningIntent = new Intent(TelephonyIntents.ACTION_CARRIER_SETUP);
            List<String> carrierPackages =
                    mTm.getCarrierPackageNamesForIntent(provisioningIntent);
            if (carrierPackages != null && !carrierPackages.isEmpty()) {
                if (carrierPackages.size() != 1) {
                    Log.w(TAG, "Multiple matching carrier apps found, launching the first.");
                }
                provisioningIntent.setPackage(carrierPackages.get(0));
                startActivity(provisioningIntent);
                return;
            }

            // Get provisioning URL
            String url = mCm.getMobileProvisioningUrl();
            if (!TextUtils.isEmpty(url)) {
                Intent intent = Intent.makeMainSelectorActivity(Intent.ACTION_MAIN,
                        Intent.CATEGORY_APP_BROWSER);
                intent.setData(Uri.parse(url));
                intent.setFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT |
                        Intent.FLAG_ACTIVITY_NEW_TASK);
                try {
                    startActivity(intent);
                } catch (ActivityNotFoundException e) {
                    Log.w(TAG, "onManageMobilePlanClick: startActivity failed" + e);
                }
            } else {
                // No provisioning URL
                String operatorName = mTm.getSimOperatorName();
                if (TextUtils.isEmpty(operatorName)) {
                    // Use NetworkOperatorName as second choice in case there is no
                    // SPN (Service Provider Name on the SIM). Such as with T-mobile.
                    operatorName = mTm.getNetworkOperatorName();
                    if (TextUtils.isEmpty(operatorName)) {
                        mManageMobilePlanMessage = resources.getString(
                                R.string.mobile_unknown_sim_operator);
                    } else {
                        mManageMobilePlanMessage = resources.getString(
                                R.string.mobile_no_provisioning_url, operatorName);
                    }
                } else {
                    mManageMobilePlanMessage = resources.getString(
                            R.string.mobile_no_provisioning_url, operatorName);
                }
            }
        } else if (mTm.hasIccCard() == false) {
            // No sim card
            mManageMobilePlanMessage = resources.getString(R.string.mobile_insert_sim_card);
        } else {
            // NetworkInfo is null, there is no connection
            mManageMobilePlanMessage = resources.getString(R.string.mobile_connect_to_internet);
        }
        if (!TextUtils.isEmpty(mManageMobilePlanMessage)) {
            log("onManageMobilePlanClick: message=" + mManageMobilePlanMessage);
            showDialog(MANAGE_MOBILE_PLAN_DIALOG_ID);
        }
    }

    @Override
    public Dialog onCreateDialog(int dialogId) {
        log("onCreateDialog: dialogId=" + dialogId);
        switch (dialogId) {
            case MANAGE_MOBILE_PLAN_DIALOG_ID:
                return new AlertDialog.Builder(getActivity())
                            .setMessage(mManageMobilePlanMessage)
                        .setMessage(mMobilePlanPreferenceController.getMobilePlanDialogMessage())
                        .setCancelable(false)
                        .setPositiveButton(com.android.internal.R.string.ok,
                                new DialogInterface.OnClickListener() {
                                    @Override
                                    public void onClick(DialogInterface dialog, int id) {
                                        log("MANAGE_MOBILE_PLAN_DIALOG.onClickListener id=" + id);
                                    mManageMobilePlanMessage = null;
                                        mMobilePlanPreferenceController
                                                .setMobilePlanDialogMessage(null);
                                    }
                                })
                        .create();
@@ -215,13 +142,6 @@ public class WirelessSettings extends SettingsPreferenceFragment implements Inde
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        if (savedInstanceState != null) {
            mManageMobilePlanMessage = savedInstanceState.getString(SAVED_MANAGE_MOBILE_PLAN_MSG);
        }
        log("onCreate: mManageMobilePlanMessage=" + mManageMobilePlanMessage);

        mCm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
        mTm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
        mUm = (UserManager) getSystemService(Context.USER_SERVICE);

        addPreferencesFromResource(R.xml.wireless_settings);
@@ -235,11 +155,21 @@ public class WirelessSettings extends SettingsPreferenceFragment implements Inde
        mTetherPreferenceController = new TetherPreferenceController(activity);
        mMobileNetworkPreferenceController = new MobileNetworkPreferenceController(activity);
        mVpnPreferenceController = new VpnPreferenceController(activity);
        mWifiCallingPreferenceController = new WifiCallingPreferenceController(activity);
        mNetworkResetPreferenceController = new NetworkResetPreferenceController(activity);
        mProxyPreferenceController = new ProxyPreferenceController(activity);
        mMobilePlanPreferenceController = new MobilePlanPreferenceController(activity, this);

        mMobilePlanPreferenceController.onCreate(savedInstanceState);

        mAirplaneModePreferenceController.displayPreference(screen);
        mTetherPreferenceController.displayPreference(screen);
        mMobileNetworkPreferenceController.displayPreference(screen);
        mVpnPreferenceController.displayPreference(screen);
        mWifiCallingPreferenceController.displayPreference(screen);
        mNetworkResetPreferenceController.displayPreference(screen);
        mProxyPreferenceController.displayPreference(screen);
        mMobilePlanPreferenceController.displayPreference(screen);

        SwitchPreference nfc = (SwitchPreference) findPreference(KEY_TOGGLE_NFC);
        RestrictedPreference androidBeam = (RestrictedPreference) findPreference(
@@ -247,8 +177,6 @@ public class WirelessSettings extends SettingsPreferenceFragment implements Inde

        mNfcEnabler = new NfcEnabler(activity, nfc, androidBeam);

        mButtonWfc = (PreferenceScreen) findPreference(KEY_WFC_SETTINGS);

        String toggleable = Settings.Global.getString(activity.getContentResolver(),
                Settings.Global.AIRPLANE_MODE_TOGGLEABLE_RADIOS);

@@ -283,38 +211,6 @@ public class WirelessSettings extends SettingsPreferenceFragment implements Inde
            getPreferenceScreen().removePreference(androidBeam);
            mNfcEnabler = null;
        }

        // Remove Mobile Network Settings and Manage Mobile Plan for secondary users,
        // if it's a wifi-only device.
        if (!isAdmin || Utils.isWifiOnly(getActivity()) ||
                RestrictedLockUtils.hasBaseUserRestriction(activity,
                        UserManager.DISALLOW_CONFIG_MOBILE_NETWORKS, UserHandle.myUserId())) {
            removePreference(KEY_MANAGE_MOBILE_PLAN);
        }
        // Remove Mobile Network Settings and Manage Mobile Plan
        // if config_show_mobile_plan sets false.
        final boolean isMobilePlanEnabled = this.getResources().getBoolean(
                R.bool.config_show_mobile_plan);
        if (!isMobilePlanEnabled) {
            Preference pref = findPreference(KEY_MANAGE_MOBILE_PLAN);
            if (pref != null) {
                removePreference(KEY_MANAGE_MOBILE_PLAN);
            }
        }

        // Enable Proxy selector settings if allowed.
        Preference mGlobalProxy = findPreference(KEY_PROXY_SETTINGS);
        final DevicePolicyManager mDPM = (DevicePolicyManager)
                activity.getSystemService(Context.DEVICE_POLICY_SERVICE);
        // proxy UI disabled until we have better app support
        getPreferenceScreen().removePreference(mGlobalProxy);
        mGlobalProxy.setEnabled(mDPM.getGlobalProxyAdmin() == null);

        // Remove network reset if not allowed
        if (RestrictedLockUtils.hasBaseUserRestriction(activity,
                UserManager.DISALLOW_NETWORK_RESET, UserHandle.myUserId())) {
            removePreference(KEY_NETWORK_RESET);
        }
    }

    @Override
@@ -325,27 +221,12 @@ public class WirelessSettings extends SettingsPreferenceFragment implements Inde
        if (mNfcEnabler != null) {
            mNfcEnabler.resume();
        }

        // update WFC setting
        final Context context = getActivity();
        if (ImsManager.isWfcEnabledByPlatform(context) &&
                ImsManager.isWfcProvisionedOnDevice(context)) {
            getPreferenceScreen().addPreference(mButtonWfc);

            mButtonWfc.setSummary(WifiCallingSettings.getWfcModeSummary(
                    context, ImsManager.getWfcMode(context, mTm.isNetworkRoaming())));
        } else {
            removePreference(KEY_WFC_SETTINGS);
        }
    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);

        if (!TextUtils.isEmpty(mManageMobilePlanMessage)) {
            outState.putString(SAVED_MANAGE_MOBILE_PLAN_MSG, mManageMobilePlanMessage);
        }
        mMobilePlanPreferenceController.onSaveInstanceState(outState);
    }

    @Override
@@ -363,6 +244,11 @@ public class WirelessSettings extends SettingsPreferenceFragment implements Inde
        super.onActivityResult(requestCode, resultCode, data);
    }

    @Override
    public void showMobilePlanMessageDialog() {
        showDialog(MANAGE_MOBILE_PLAN_DIALOG_ID);
    }

    @Override
    protected int getHelpResource() {
        return R.string.help_url_more_networks;
@@ -389,7 +275,8 @@ public class WirelessSettings extends SettingsPreferenceFragment implements Inde
                public List<String> getNonIndexableKeys(Context context) {
                    final ArrayList<String> result = new ArrayList<String>();

                final UserManager um = (UserManager) context.getSystemService(Context.USER_SERVICE);
                    final UserManager um = (UserManager) context.getSystemService(
                            Context.USER_SERVICE);
                    final boolean isSecondaryUser = !um.isAdminUser();
                    final boolean isWimaxEnabled = !isSecondaryUser
                            && context.getResources().getBoolean(
@@ -410,39 +297,19 @@ public class WirelessSettings extends SettingsPreferenceFragment implements Inde
                            result.add(KEY_ANDROID_BEAM_SETTINGS);
                        }
                    }

                // Remove Mobile Network Settings and Manage Mobile Plan if it's a wifi-only device.
                if (isSecondaryUser || Utils.isWifiOnly(context)) {
                    result.add(KEY_MANAGE_MOBILE_PLAN);
                }
                    new MobilePlanPreferenceController(context, null /* MobilePlanClickHandler */)
                            .updateNonIndexableKeys(result);
                    new MobileNetworkPreferenceController(context).updateNonIndexableKeys(result);

                // Remove Mobile Network Settings and Manage Mobile Plan
                // if config_show_mobile_plan sets false.
                final boolean isMobilePlanEnabled = context.getResources().getBoolean(
                        R.bool.config_show_mobile_plan);
                if (!isMobilePlanEnabled) {
                    result.add(KEY_MANAGE_MOBILE_PLAN);
                }
                    // Remove Airplane Mode settings if it's a stationary device such as a TV.
                    new AirplaneModePreferenceController(context, null /* fragment */)
                            .updateNonIndexableKeys(result);

                // proxy UI disabled until we have better app support
                result.add(KEY_PROXY_SETTINGS);

                new TetherPreferenceController(context)
                        .updateNonIndexableKeys(result);

                if (!ImsManager.isWfcEnabledByPlatform(context) ||
                        !ImsManager.isWfcProvisionedOnDevice(context)) {
                    result.add(KEY_WFC_SETTINGS);
                }
                    new ProxyPreferenceController(context).updateNonIndexableKeys(result);

                if (RestrictedLockUtils.hasBaseUserRestriction(context,
                        UserManager.DISALLOW_NETWORK_RESET, UserHandle.myUserId())) {
                    result.add(KEY_NETWORK_RESET);
                }
                    new TetherPreferenceController(context).updateNonIndexableKeys(result);
                    new WifiCallingPreferenceController(context).updateNonIndexableKeys(result);
                    new NetworkResetPreferenceController(context).updateNonIndexableKeys(result);

                    return result;
                }
+19 −0
Original line number Diff line number Diff line
@@ -17,11 +17,14 @@ package com.android.settings.core.lifecycle;

import android.annotation.UiThread;
import android.content.Context;
import android.os.Bundle;

import com.android.settings.core.lifecycle.events.OnAttach;
import com.android.settings.core.lifecycle.events.OnCreate;
import com.android.settings.core.lifecycle.events.OnDestroy;
import com.android.settings.core.lifecycle.events.OnPause;
import com.android.settings.core.lifecycle.events.OnResume;
import com.android.settings.core.lifecycle.events.OnSaveInstanceState;
import com.android.settings.core.lifecycle.events.OnStart;
import com.android.settings.core.lifecycle.events.OnStop;
import com.android.settings.utils.ThreadUtils;
@@ -54,6 +57,14 @@ public class Lifecycle {
        }
    }

    public void onCreate(Bundle savedInstanceState) {
        for (LifecycleObserver observer : mObservers) {
            if (observer instanceof OnCreate) {
                ((OnCreate) observer).onCreate(savedInstanceState);
            }
        }
    }

    public void onStart() {
        for (LifecycleObserver observer : mObservers) {
            if (observer instanceof OnStart) {
@@ -78,6 +89,14 @@ public class Lifecycle {
        }
    }

    public void onSaveInstanceState(Bundle outState) {
        for (LifecycleObserver observer : mObservers) {
            if (observer instanceof OnSaveInstanceState) {
                ((OnSaveInstanceState) observer).onSaveInstanceState(outState);
            }
        }
    }

    public void onStop() {
        for (LifecycleObserver observer : mObservers) {
            if (observer instanceof OnStop) {
+15 −0
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ package com.android.settings.core.lifecycle;

import android.annotation.CallSuper;
import android.content.Context;
import android.os.Bundle;
import android.support.v14.preference.PreferenceFragment;

/**
@@ -38,6 +39,20 @@ public abstract class ObservablePreferenceFragment extends PreferenceFragment {
        mLifecycle.onAttach(context);
    }

    @CallSuper
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mLifecycle.onCreate(savedInstanceState);
    }

    @CallSuper
    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        mLifecycle.onSaveInstanceState(outState);
    }

    @CallSuper
    @Override
    public void onStart() {
Loading