Files
app_Settings/src/com/android/settings/network/telephony/AutoDataSwitchPreferenceController.java
Chaohui Wang fb0583404f Always set cross sim calling
By CrossSimCallingViewModel, in SIMs and per SIM settings page.
To ensure the status is always right, including the case after the
onboarding set up finished.

Fix: 347882381
Fix: 348529996
Flag: EXEMPT bug fix
Test: manual - turn on / off "Automatic data switching" on SIMs
Test: manual - turn off "Automatic data switching" during onboarding
Change-Id: Icc2eacb67850fa7b3aa0fe310cd09a0e0147912b
2024-07-16 17:46:23 +08:00

167 lines
5.4 KiB
Java

/*
* 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.os.Handler;
import android.os.Looper;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.lifecycle.LifecycleObserver;
import androidx.lifecycle.OnLifecycleEvent;
import androidx.preference.Preference;
import androidx.preference.PreferenceScreen;
import androidx.preference.TwoStatePreference;
import com.android.internal.annotations.VisibleForTesting;
import com.android.settings.datausage.DataUsageUtils;
import com.android.settings.flags.Flags;
import com.android.settings.network.MobileDataContentObserver;
import com.android.settings.network.SubscriptionsChangeListener;
/**
* Controls whether switch mobile data to the non-default SIM if the non-default SIM has better
* availability.
*
* This is used for temporarily allowing data on the non-default data SIM when on-default SIM
* has better availability on DSDS devices, where better availability means strong
* signal/connectivity.
* If this feature is enabled, data will be temporarily enabled on the non-default data SIM,
* including during any voice calls.
*/
public class AutoDataSwitchPreferenceController extends TelephonyTogglePreferenceController
implements LifecycleObserver,
SubscriptionsChangeListener.SubscriptionsChangeListenerClient {
@Nullable
private TwoStatePreference mPreference;
@Nullable
private SubscriptionsChangeListener mChangeListener;
@Nullable
private TelephonyManager mManager;
@Nullable
private MobileDataContentObserver mMobileDataContentObserver;
@Nullable
private PreferenceScreen mScreen;
public AutoDataSwitchPreferenceController(
@NonNull Context context, @NonNull String preferenceKey) {
super(context, preferenceKey);
}
void init(int subId) {
this.mSubId = subId;
mManager = mContext.getSystemService(TelephonyManager.class).createForSubscriptionId(subId);
}
@OnLifecycleEvent(ON_RESUME)
public void onResume() {
if (mChangeListener == null) {
mChangeListener = new SubscriptionsChangeListener(mContext, this);
}
mChangeListener.start();
if (mMobileDataContentObserver == null) {
mMobileDataContentObserver = new MobileDataContentObserver(
new Handler(Looper.getMainLooper()));
mMobileDataContentObserver.setOnMobileDataChangedListener(() -> refreshPreference());
}
mMobileDataContentObserver.register(mContext, mSubId);
}
@OnLifecycleEvent(ON_PAUSE)
public void onPause() {
if (mChangeListener != null) {
mChangeListener.stop();
}
if (mMobileDataContentObserver != null) {
mMobileDataContentObserver.unRegister(mContext);
}
}
@Override
public void displayPreference(PreferenceScreen screen) {
super.displayPreference(screen);
mPreference = screen.findPreference(getPreferenceKey());
mScreen = screen;
}
@Override
public boolean isChecked() {
return mManager != null && mManager.isMobileDataPolicyEnabled(
TelephonyManager.MOBILE_DATA_POLICY_AUTO_DATA_SWITCH);
}
@Override
public boolean setChecked(boolean isChecked) {
if (mManager != null) {
mManager.setMobileDataPolicyEnabled(
TelephonyManager.MOBILE_DATA_POLICY_AUTO_DATA_SWITCH,
isChecked);
}
return true;
}
@VisibleForTesting
protected boolean hasMobileData() {
return DataUsageUtils.hasMobileData(mContext);
}
@Override
public int getAvailabilityStatus(int subId) {
if (Flags.isDualSimOnboardingEnabled()
|| !SubscriptionManager.isValidSubscriptionId(subId)
|| SubscriptionManager.getDefaultDataSubscriptionId() == subId
|| (!hasMobileData())) {
return CONDITIONALLY_UNAVAILABLE;
}
return AVAILABLE;
}
@Override
public void updateState(Preference preference) {
super.updateState(preference);
if (preference == null) {
return;
}
preference.setVisible(isAvailable());
}
@Override
public void onAirplaneModeChanged(boolean airplaneModeEnabled) {}
@Override
public void onSubscriptionsChanged() {
updateState(mPreference);
}
/**
* Trigger displaying preference when Mobile data content changed.
*/
@VisibleForTesting
public void refreshPreference() {
if (mScreen != null) {
super.displayPreference(mScreen);
}
}
}