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

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

Merge "Add default calls/SMS subscription prefs to mobile details page"

parents 17e11906 ff484e11
Loading
Loading
Loading
Loading
+11 −0
Original line number Diff line number Diff line
@@ -10373,6 +10373,17 @@
    <string name="mobile_data_settings_title">Mobile data</string>
    <!-- Mobile network settings screen, title of Mobile data switch preference [CHAR LIMIT=NONE] -->
    <string name="mobile_data_settings_summary">Access data using mobile network</string>
    <!-- Mobile network settings screen, title of item showing the name of the default subscription
     that will be used for calls. This only appears in multi-SIM mode. [CHAR LIMIT=NONE] -->
    <string name="calls_preference">Calls preference</string>
    <!-- Mobile network settings screen, title of item showing the name of the default subscription
     that will be used for SMS messages. This only appears in multi-SIM mode. [CHAR LIMIT=NONE] -->
    <string name="sms_preference">SMS preference</string>
    <!-- Mobile network settings screen, a label in a chooser dialog that appears when choosing the
    default subscription to use for either calls or SMS when in multi-SIM mode. This label means
    that the user will be asked which mobile network subscription to use every time they place a
    call or send an SMS, instead of defaulting to one particular subscription. [CHAR LIMIT=40]-->
    <string name="calls_and_sms_ask_every_time">Ask every time</string>
    <!-- Summary of the 'Mobile network' item on the Network & internet page when there is no mobile
         service setup yet (eg no SIM card inserted and no eSIM configured). Tapping it leads to a
+17 −4
Original line number Diff line number Diff line
@@ -17,24 +17,37 @@
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:settings="http://schemas.android.com/apk/res-auto"
    android:key="mobile_network_pref_screen"
    settings:initialExpandedChildrenCount="5">
    settings:initialExpandedChildrenCount="7">

    <com.android.settings.datausage.DataUsageSummaryPreference
        android:key="status_header"
        android:visibility="gone"
        android:selectable="false" />

    <ListPreference
        android:key="calls_preference"
        android:title="@string/calls_preference"
        settings:controller="com.android.settings.network.telephony.CallsDefaultSubscriptionController"
        settings:allowDividerAbove="true" />

    <ListPreference
        android:key="sms_preference"
        android:title="@string/sms_preference"
        settings:controller="com.android.settings.network.telephony.SmsDefaultSubscriptionController" />

    <Preference
        android:key="cdma_lte_data_service_key"
        android:title="@string/cdma_lte_data_service"
        settings:controller="com.android.settings.network.telephony.DataServiceSetupPreferenceController">
    </Preference>
        settings:controller="com.android.settings.network.telephony.DataServiceSetupPreferenceController"
        settings:allowDividerAbove="true"
        settings:allowDividerBelow="false" />

    <SwitchPreference
        android:key="mobile_data_enable"
        android:title="@string/mobile_data_settings_title"
        android:summary="@string/mobile_data_settings_summary"
        settings:controller="com.android.settings.network.telephony.MobileDataPreferenceController"/>
        settings:controller="com.android.settings.network.telephony.MobileDataPreferenceController"
        settings:allowDividerAbove="true"/>

    <com.android.settingslib.RestrictedSwitchPreference
        android:key="button_roaming_key"
+1 −1
Original line number Diff line number Diff line
@@ -30,7 +30,7 @@ public class SubscriptionUtil {
    private static List<SubscriptionInfo> sResultsForTesting;

    @VisibleForTesting
    static void setAvailableSubscriptionsForTesting(List<SubscriptionInfo> results) {
    public static void setAvailableSubscriptionsForTesting(List<SubscriptionInfo> results) {
        sResultsForTesting = results;
    }

+43 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2019 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.network.telephony;

import android.content.Context;
import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionManager;

public class CallsDefaultSubscriptionController extends DefaultSubscriptionController {

    public CallsDefaultSubscriptionController(Context context, String preferenceKey) {
        super(context, preferenceKey);
    }

    @Override
    protected SubscriptionInfo getDefaultSubscriptionInfo() {
        return mManager.getDefaultVoiceSubscriptionInfo();
    }

    @Override
    protected int getDefaultSubscriptionId() {
        return SubscriptionManager.getDefaultVoiceSubscriptionId();
    }

    @Override
    protected void setDefaultSubscription(int subscriptionId) {
        mManager.setDefaultVoiceSubId(subscriptionId);
    }
}
+175 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2019 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.network.telephony;

import static androidx.lifecycle.Lifecycle.Event.ON_PAUSE;
import static androidx.lifecycle.Lifecycle.Event.ON_RESUME;

import android.content.Context;
import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionManager;

import com.android.settings.R;
import com.android.settings.core.BasePreferenceController;
import com.android.settings.network.SubscriptionUtil;
import com.android.settings.network.SubscriptionsChangeListener;

import java.util.List;

import androidx.lifecycle.Lifecycle;
import androidx.lifecycle.LifecycleObserver;
import androidx.lifecycle.OnLifecycleEvent;
import androidx.preference.ListPreference;
import androidx.preference.Preference;
import androidx.preference.PreferenceScreen;

/**
 * This implements common controller functionality for a Preference letting the user see/change
 * what mobile network subscription is used by default for some service controlled by the
 * SubscriptionManager. This can be used for services such as Calls or SMS.
 */
public abstract class DefaultSubscriptionController extends BasePreferenceController implements
        LifecycleObserver, Preference.OnPreferenceChangeListener,
        SubscriptionsChangeListener.SubscriptionsChangeListenerClient {
    private static final String TAG = "DefaultSubController";

    protected SubscriptionsChangeListener mChangeListener;
    protected ListPreference mPreference;
    protected SubscriptionManager mManager;

    public DefaultSubscriptionController(Context context, String preferenceKey) {
        super(context, preferenceKey);
        mManager = context.getSystemService(SubscriptionManager.class);
        mChangeListener = new SubscriptionsChangeListener(context, this);
    }

    public void init(Lifecycle lifecycle) {
        lifecycle.addObserver(this);
    }

    /** @return SubscriptionInfo for the default subscription for the service, or null if there
     * isn't one. */
    protected abstract SubscriptionInfo getDefaultSubscriptionInfo();

    /** @return the id of the default subscription for the service, or
     * SubscriptionManager.INVALID_SUBSCRIPTION_ID if there isn't one. */
    protected abstract int getDefaultSubscriptionId();

    /** Called to change the default subscription for the service. */
    protected abstract void setDefaultSubscription(int subscriptionId);

    @Override
    public int getAvailabilityStatus() {
        final List<SubscriptionInfo> subs = SubscriptionUtil.getAvailableSubscriptions(mManager);
        if (subs.size() > 1) {
            return AVAILABLE;
        } else {
            return CONDITIONALLY_UNAVAILABLE;
        }
    }

    @OnLifecycleEvent(ON_RESUME)
    public void onResume() {
        mChangeListener.start();
        updateEntries();
    }

    @OnLifecycleEvent(ON_PAUSE)
    public void onPause() {
        mChangeListener.stop();
    }

    @Override
    public void displayPreference(PreferenceScreen screen) {
        super.displayPreference(screen);
        mPreference = screen.findPreference(getPreferenceKey());
        updateEntries();
    }

    @Override
    public CharSequence getSummary() {
        final SubscriptionInfo info = getDefaultSubscriptionInfo();
        if (info != null) {
            return info.getDisplayName();
        } else {
            return mContext.getString(R.string.calls_and_sms_ask_every_time);
        }
    }

    private void updateEntries() {
        if (mPreference == null) {
            return;
        }
        if (!isAvailable()) {
            mPreference.setVisible(false);
            return;
        }
        mPreference.setVisible(true);

        final List<SubscriptionInfo> subs = SubscriptionUtil.getAvailableSubscriptions(mManager);

        // We'll have one entry for each available subscription, plus one for a "ask me every
        // time" entry at the end.
        final CharSequence[] displayNames = new CharSequence[subs.size() + 1];
        final CharSequence[] subscriptionIds = new CharSequence[subs.size() + 1];

        final int serviceDefaultSubId = getDefaultSubscriptionId();
        boolean subIsAvailable = false;

        int i = 0;
        for (; i < subs.size(); i++) {
            displayNames[i] = subs.get(i).getDisplayName();
            final int subId = subs.get(i).getSubscriptionId();
            subscriptionIds[i] = Integer.toString(subId);
            if (subId == serviceDefaultSubId) {
                subIsAvailable = true;
            }
        }
        // Add the extra "Ask every time" value at the end.
        displayNames[i] = mContext.getString(R.string.calls_and_sms_ask_every_time);
        subscriptionIds[i] = Integer.toString(SubscriptionManager.INVALID_SUBSCRIPTION_ID);

        mPreference.setEntries(displayNames);
        mPreference.setEntryValues(subscriptionIds);

        if (subIsAvailable) {
            mPreference.setValue(Integer.toString(serviceDefaultSubId));
        } else {
            mPreference.setValue(Integer.toString(SubscriptionManager.INVALID_SUBSCRIPTION_ID));
        }
    }

    @Override
    public boolean onPreferenceChange(Preference preference, Object newValue) {
        final int subscriptionId = Integer.parseInt((String) newValue);
        setDefaultSubscription(subscriptionId);
        refreshSummary(mPreference);
        return true;
    }

    @Override
    public void onAirplaneModeChanged(boolean airplaneModeEnabled) {
    }

    @Override
    public void onSubscriptionsChanged() {
        if (mPreference != null) {
            updateEntries();
            refreshSummary(mPreference);
        }
    }
}
Loading