| /* | |
| * Copyright (C) 2022 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.sim; | |
| import android.app.Dialog; | |
| import android.app.settings.SettingsEnums; | |
| import android.content.DialogInterface; | |
| import android.os.Bundle; | |
| import android.os.UserHandle; | |
| import android.os.UserManager; | |
| import android.telephony.SubscriptionInfo; | |
| import android.telephony.SubscriptionManager; | |
| import android.telephony.TelephonyManager; | |
| import android.text.TextUtils; | |
| import android.util.Log; | |
| import android.view.LayoutInflater; | |
| import android.view.View; | |
| import android.widget.TextView; | |
| import androidx.annotation.NonNull; | |
| import androidx.annotation.Nullable; | |
| import androidx.annotation.VisibleForTesting; | |
| import androidx.appcompat.app.AlertDialog; | |
| import com.android.settings.R; | |
| import com.android.settings.network.SubscriptionUtil; | |
| import java.util.List; | |
| /** | |
| * Show a dialog prompting the user to enable auto data switch following the dialog where user chose | |
| * default data SIM. | |
| */ | |
| public class EnableAutoDataSwitchDialogFragment extends SimDialogFragment implements | |
| DialogInterface.OnClickListener { | |
| private static final String TAG = "EnableAutoDataSwitchDialogFragment"; | |
| /** Sub Id of the non-default data SIM */ | |
| private int mBackupDataSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID; | |
| /** @return a new instance of this fragment */ | |
| public static EnableAutoDataSwitchDialogFragment newInstance() { | |
| final EnableAutoDataSwitchDialogFragment fragment = | |
| new EnableAutoDataSwitchDialogFragment(); | |
| final Bundle args = initArguments(SimDialogActivity.ENABLE_AUTO_DATA_SWITCH, | |
| R.string.enable_auto_data_switch_dialog_title); | |
| fragment.setArguments(args); | |
| return fragment; | |
| } | |
| @NonNull | |
| @Override | |
| public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) { | |
| final AlertDialog dialog = new AlertDialog.Builder(getContext()) | |
| .setPositiveButton(R.string.yes, this) | |
| .setNegativeButton(R.string.sim_action_no_thanks, null) | |
| .create(); | |
| updateDialog(dialog); | |
| return dialog; | |
| } | |
| @Override | |
| public int getMetricsCategory() { | |
| return SettingsEnums.DIALOG_AUTO_DATA_SWITCH; | |
| } | |
| /** update dialog */ | |
| public void updateDialog(AlertDialog dialog) { | |
| Log.d(TAG, "Dialog updated, dismiss status: " + mWasDismissed); | |
| if (mWasDismissed) { | |
| return; | |
| } | |
| if (dialog == null) { | |
| Log.d(TAG, "Dialog is null."); | |
| dismiss(); | |
| return; | |
| } | |
| // Set message | |
| View content = LayoutInflater.from(getContext()).inflate( | |
| R.layout.sim_confirm_dialog_multiple_enabled_profiles_supported, null); | |
| TextView dialogMessage = content != null ? content.findViewById(R.id.msg) : null; | |
| final String message = getMessage(); | |
| if (TextUtils.isEmpty(message) || dialogMessage == null) { | |
| onDismiss(dialog); | |
| return; | |
| } | |
| dialogMessage.setText(message); | |
| dialogMessage.setVisibility(View.VISIBLE); | |
| dialog.setView(content); | |
| // Set title | |
| View titleView = LayoutInflater.from(getContext()).inflate( | |
| R.layout.sim_confirm_dialog_title_multiple_enabled_profiles_supported, null); | |
| TextView titleTextView = titleView.findViewById(R.id.title); | |
| titleTextView.setText(getContext().getString(getTitleResId())); | |
| dialog.setCustomTitle(titleTextView); | |
| } | |
| /** | |
| * @return The message of the dialog. {@code null} if the dialog shouldn't be displayed. | |
| */ | |
| @VisibleForTesting | |
| protected String getMessage() { | |
| int ddsSubId = getDefaultDataSubId(); | |
| if (ddsSubId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) return null; | |
| Log.d(TAG, "DDS SubId: " + ddsSubId); | |
| SubscriptionManager subscriptionManager = getSubscriptionManager(); | |
| List<SubscriptionInfo> activeSubscriptions = subscriptionManager | |
| .getActiveSubscriptionInfoList(); | |
| if (activeSubscriptions == null) return null; | |
| // Find if a backup data sub exists. | |
| SubscriptionInfo backupSubInfo = activeSubscriptions.stream() | |
| .filter(subInfo -> subInfo.getSubscriptionId() != ddsSubId) | |
| .findFirst() | |
| .orElse(null); | |
| if (backupSubInfo == null) return null; | |
| mBackupDataSubId = backupSubInfo.getSubscriptionId(); | |
| // Check if auto data switch is already enabled | |
| final TelephonyManager telephonyManager = getTelephonyManagerForSub(mBackupDataSubId); | |
| if (telephonyManager == null) { | |
| Log.d(TAG, "telephonyManager for " + mBackupDataSubId + " is null"); | |
| return null; | |
| } | |
| if (telephonyManager.isMobileDataPolicyEnabled( | |
| TelephonyManager.MOBILE_DATA_POLICY_AUTO_DATA_SWITCH)) { | |
| Log.d(TAG, "AUTO_DATA_SWITCH already enabled"); | |
| return null; | |
| } | |
| Log.d(TAG, "Backup data sub Id: " + mBackupDataSubId); | |
| // The description of the feature | |
| String message = | |
| getContext().getString( | |
| R.string.enable_auto_data_switch_dialog_message, | |
| SubscriptionUtil.getUniqueSubscriptionDisplayName( | |
| backupSubInfo, getContext())); | |
| UserManager userManager = getUserManager(); | |
| if (userManager == null) return message; | |
| // If one of the sub is dedicated to work profile(enterprise-managed), which means we might | |
| // switching between personal & work profile, append a warning to the message. | |
| UserHandle ddsUserHandle = subscriptionManager.getSubscriptionUserHandle(ddsSubId); | |
| UserHandle nDdsUserHandle = subscriptionManager.getSubscriptionUserHandle(mBackupDataSubId); | |
| boolean isDdsManaged = ddsUserHandle != null && userManager.isManagedProfile( | |
| ddsUserHandle.getIdentifier()); | |
| boolean isNDdsManaged = nDdsUserHandle != null && userManager.isManagedProfile( | |
| nDdsUserHandle.getIdentifier()); | |
| Log.d(TAG, "isDdsManaged= " + isDdsManaged + " isNDdsManaged=" + isNDdsManaged); | |
| if (isDdsManaged ^ isNDdsManaged) { | |
| message += getContext().getString( | |
| R.string.auto_data_switch_dialog_managed_profile_warning); | |
| } | |
| return message; | |
| } | |
| @Override | |
| public void updateDialog() { | |
| updateDialog((AlertDialog) getDialog()); | |
| } | |
| @Override | |
| public void onClick(DialogInterface dialog, int buttonClicked) { | |
| if (buttonClicked != DialogInterface.BUTTON_POSITIVE) { | |
| return; | |
| } | |
| final SimDialogActivity activity = (SimDialogActivity) getActivity(); | |
| if (mBackupDataSubId != SubscriptionManager.INVALID_SUBSCRIPTION_ID) { | |
| activity.onSubscriptionSelected(getDialogType(), mBackupDataSubId); | |
| } | |
| } | |
| private TelephonyManager getTelephonyManagerForSub(int subId) { | |
| return getContext().getSystemService(TelephonyManager.class) | |
| .createForSubscriptionId(subId); | |
| } | |
| private SubscriptionManager getSubscriptionManager() { | |
| return getContext().getSystemService(SubscriptionManager.class).createForAllUserProfiles(); | |
| } | |
| @VisibleForTesting | |
| protected int getDefaultDataSubId() { | |
| return SubscriptionManager.getDefaultDataSubscriptionId(); | |
| } | |
| private UserManager getUserManager() { | |
| return getContext().getSystemService(UserManager.class); | |
| } | |
| } |