blob: 0dfb2f4063a97de41b93d18f812d11b3ce4c3c6b [file] [log] [blame]
/*
* Copyright (C) 2021 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.systemui.qs.tiles.dialog;
import static com.android.systemui.Prefs.Key.QS_HAS_TURNED_OFF_MOBILE_DATA;
import static com.android.systemui.qs.tiles.dialog.InternetDialogController.MAX_WIFI_ENTRY_COUNT;
import android.app.AlertDialog;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.drawable.Drawable;
import android.net.Network;
import android.net.NetworkCapabilities;
import android.os.Bundle;
import android.os.Handler;
import android.telephony.ServiceState;
import android.telephony.SignalStrength;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyDisplayInfo;
import android.telephony.TelephonyManager;
import android.text.Html;
import android.text.TextUtils;
import android.text.method.LinkMovementMethod;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.Switch;
import android.widget.TextView;
import androidx.annotation.MainThread;
import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting;
import androidx.annotation.WorkerThread;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.android.internal.logging.UiEvent;
import com.android.internal.logging.UiEventLogger;
import com.android.settingslib.Utils;
import com.android.settingslib.wifi.WifiEnterpriseRestrictionUtils;
import com.android.systemui.Prefs;
import com.android.systemui.R;
import com.android.systemui.accessibility.floatingmenu.AnnotationLinkSpan;
import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.dagger.qualifiers.Background;
import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.statusbar.phone.SystemUIDialog;
import com.android.systemui.statusbar.policy.KeyguardStateController;
import com.android.wifitrackerlib.WifiEntry;
import java.util.List;
import java.util.concurrent.Executor;
/**
* Dialog for showing mobile network, connected Wi-Fi network and Wi-Fi networks.
*/
@SysUISingleton
public class InternetDialog extends SystemUIDialog implements
InternetDialogController.InternetDialogCallback, Window.Callback {
private static final String TAG = "InternetDialog";
private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
static final long PROGRESS_DELAY_MS = 1500L;
static final int MAX_NETWORK_COUNT = 4;
private final Handler mHandler;
private final Executor mBackgroundExecutor;
@VisibleForTesting
protected InternetAdapter mAdapter;
@VisibleForTesting
protected View mDialogView;
@VisibleForTesting
protected boolean mCanConfigWifi;
private InternetDialogFactory mInternetDialogFactory;
private SubscriptionManager mSubscriptionManager;
private TelephonyManager mTelephonyManager;
@Nullable
private AlertDialog mAlertDialog;
private UiEventLogger mUiEventLogger;
private Context mContext;
private InternetDialogController mInternetDialogController;
private TextView mInternetDialogTitle;
private TextView mInternetDialogSubTitle;
private View mDivider;
private ProgressBar mProgressBar;
private LinearLayout mInternetDialogLayout;
private LinearLayout mConnectedWifListLayout;
private LinearLayout mMobileNetworkLayout;
private LinearLayout mTurnWifiOnLayout;
private LinearLayout mEthernetLayout;
private TextView mWifiToggleTitleText;
private LinearLayout mWifiScanNotifyLayout;
private TextView mWifiScanNotifyText;
private LinearLayout mSeeAllLayout;
private RecyclerView mWifiRecyclerView;
private ImageView mConnectedWifiIcon;
private ImageView mWifiSettingsIcon;
private TextView mConnectedWifiTitleText;
private TextView mConnectedWifiSummaryText;
private ImageView mSignalIcon;
private TextView mMobileTitleText;
private TextView mMobileSummaryText;
private TextView mAirplaneModeSummaryText;
private Switch mMobileDataToggle;
private View mMobileToggleDivider;
private Switch mWiFiToggle;
private Button mDoneButton;
private Button mAirplaneModeButton;
private Drawable mBackgroundOn;
private KeyguardStateController mKeyguard;
@Nullable
private Drawable mBackgroundOff = null;
private int mDefaultDataSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
private boolean mCanConfigMobileData;
private boolean mCanChangeWifiState;
// Wi-Fi entries
private int mWifiNetworkHeight;
@Nullable
@VisibleForTesting
protected WifiEntry mConnectedWifiEntry;
@VisibleForTesting
protected int mWifiEntriesCount;
@VisibleForTesting
protected boolean mHasMoreWifiEntries;
// Wi-Fi scanning progress bar
protected boolean mIsProgressBarVisible;
protected boolean mIsSearchingHidden;
protected final Runnable mHideProgressBarRunnable = () -> {
setProgressBarVisible(false);
};
protected Runnable mHideSearchingRunnable = () -> {
mIsSearchingHidden = true;
mInternetDialogSubTitle.setText(getSubtitleText());
};
public InternetDialog(Context context, InternetDialogFactory internetDialogFactory,
InternetDialogController internetDialogController, boolean canConfigMobileData,
boolean canConfigWifi, boolean aboveStatusBar, UiEventLogger uiEventLogger,
@Main Handler handler, @Background Executor executor,
KeyguardStateController keyguardStateController) {
super(context);
if (DEBUG) {
Log.d(TAG, "Init InternetDialog");
}
// Save the context that is wrapped with our theme.
mContext = getContext();
mHandler = handler;
mBackgroundExecutor = executor;
mInternetDialogFactory = internetDialogFactory;
mInternetDialogController = internetDialogController;
mSubscriptionManager = mInternetDialogController.getSubscriptionManager();
mDefaultDataSubId = mInternetDialogController.getDefaultDataSubscriptionId();
mTelephonyManager = mInternetDialogController.getTelephonyManager();
mCanConfigMobileData = canConfigMobileData;
mCanConfigWifi = canConfigWifi;
mCanChangeWifiState = WifiEnterpriseRestrictionUtils.isChangeWifiStateAllowed(context);
mKeyguard = keyguardStateController;
mUiEventLogger = uiEventLogger;
mAdapter = new InternetAdapter(mInternetDialogController);
if (!aboveStatusBar) {
getWindow().setType(WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY);
}
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (DEBUG) {
Log.d(TAG, "onCreate");
}
mUiEventLogger.log(InternetDialogEvent.INTERNET_DIALOG_SHOW);
mDialogView = LayoutInflater.from(mContext).inflate(R.layout.internet_connectivity_dialog,
null);
mDialogView.setAccessibilityPaneTitle(
mContext.getText(R.string.accessibility_desc_quick_settings));
final Window window = getWindow();
window.setContentView(mDialogView);
window.setWindowAnimations(R.style.Animation_InternetDialog);
mWifiNetworkHeight = mContext.getResources()
.getDimensionPixelSize(R.dimen.internet_dialog_wifi_network_height);
mInternetDialogLayout = mDialogView.requireViewById(R.id.internet_connectivity_dialog);
mInternetDialogTitle = mDialogView.requireViewById(R.id.internet_dialog_title);
mInternetDialogSubTitle = mDialogView.requireViewById(R.id.internet_dialog_subtitle);
mDivider = mDialogView.requireViewById(R.id.divider);
mProgressBar = mDialogView.requireViewById(R.id.wifi_searching_progress);
mEthernetLayout = mDialogView.requireViewById(R.id.ethernet_layout);
mMobileNetworkLayout = mDialogView.requireViewById(R.id.mobile_network_layout);
mTurnWifiOnLayout = mDialogView.requireViewById(R.id.turn_on_wifi_layout);
mWifiToggleTitleText = mDialogView.requireViewById(R.id.wifi_toggle_title);
mWifiScanNotifyLayout = mDialogView.requireViewById(R.id.wifi_scan_notify_layout);
mWifiScanNotifyText = mDialogView.requireViewById(R.id.wifi_scan_notify_text);
mConnectedWifListLayout = mDialogView.requireViewById(R.id.wifi_connected_layout);
mConnectedWifiIcon = mDialogView.requireViewById(R.id.wifi_connected_icon);
mConnectedWifiTitleText = mDialogView.requireViewById(R.id.wifi_connected_title);
mConnectedWifiSummaryText = mDialogView.requireViewById(R.id.wifi_connected_summary);
mWifiSettingsIcon = mDialogView.requireViewById(R.id.wifi_settings_icon);
mWifiRecyclerView = mDialogView.requireViewById(R.id.wifi_list_layout);
mSeeAllLayout = mDialogView.requireViewById(R.id.see_all_layout);
mDoneButton = mDialogView.requireViewById(R.id.done_button);
mAirplaneModeButton = mDialogView.requireViewById(R.id.apm_button);
mSignalIcon = mDialogView.requireViewById(R.id.signal_icon);
mMobileTitleText = mDialogView.requireViewById(R.id.mobile_title);
mMobileSummaryText = mDialogView.requireViewById(R.id.mobile_summary);
mAirplaneModeSummaryText = mDialogView.requireViewById(R.id.airplane_mode_summary);
mMobileToggleDivider = mDialogView.requireViewById(R.id.mobile_toggle_divider);
mMobileDataToggle = mDialogView.requireViewById(R.id.mobile_toggle);
mWiFiToggle = mDialogView.requireViewById(R.id.wifi_toggle);
mBackgroundOn = mContext.getDrawable(R.drawable.settingslib_switch_bar_bg_on);
mInternetDialogTitle.setText(getDialogTitleText());
mInternetDialogTitle.setGravity(Gravity.START | Gravity.CENTER_VERTICAL);
TypedArray typedArray = mContext.obtainStyledAttributes(
new int[]{android.R.attr.selectableItemBackground});
try {
mBackgroundOff = typedArray.getDrawable(0 /* index */);
} finally {
typedArray.recycle();
}
setOnClickListener();
mTurnWifiOnLayout.setBackground(null);
mAirplaneModeButton.setVisibility(
mInternetDialogController.isAirplaneModeEnabled() ? View.VISIBLE : View.GONE);
mWifiRecyclerView.setLayoutManager(new LinearLayoutManager(mContext));
mWifiRecyclerView.setAdapter(mAdapter);
}
@Override
public void onStart() {
super.onStart();
if (DEBUG) {
Log.d(TAG, "onStart");
}
mInternetDialogController.onStart(this, mCanConfigWifi);
if (!mCanConfigWifi) {
hideWifiViews();
}
}
@VisibleForTesting
void hideWifiViews() {
setProgressBarVisible(false);
mTurnWifiOnLayout.setVisibility(View.GONE);
mConnectedWifListLayout.setVisibility(View.GONE);
mWifiRecyclerView.setVisibility(View.GONE);
mSeeAllLayout.setVisibility(View.GONE);
}
@Override
public void onStop() {
super.onStop();
if (DEBUG) {
Log.d(TAG, "onStop");
}
mHandler.removeCallbacks(mHideProgressBarRunnable);
mHandler.removeCallbacks(mHideSearchingRunnable);
mMobileNetworkLayout.setOnClickListener(null);
mMobileDataToggle.setOnCheckedChangeListener(null);
mConnectedWifListLayout.setOnClickListener(null);
mSeeAllLayout.setOnClickListener(null);
mWiFiToggle.setOnCheckedChangeListener(null);
mDoneButton.setOnClickListener(null);
mAirplaneModeButton.setOnClickListener(null);
mInternetDialogController.onStop();
mInternetDialogFactory.destroyDialog();
}
@Override
public void dismissDialog() {
if (DEBUG) {
Log.d(TAG, "dismissDialog");
}
mInternetDialogFactory.destroyDialog();
dismiss();
}
/**
* Update the internet dialog when receiving the callback.
*
* @param shouldUpdateMobileNetwork {@code true} for update the mobile network layout,
* otherwise {@code false}.
*/
void updateDialog(boolean shouldUpdateMobileNetwork) {
if (DEBUG) {
Log.d(TAG, "updateDialog");
}
mInternetDialogTitle.setText(getDialogTitleText());
mInternetDialogSubTitle.setText(getSubtitleText());
mAirplaneModeButton.setVisibility(
mInternetDialogController.isAirplaneModeEnabled() ? View.VISIBLE : View.GONE);
updateEthernet();
if (shouldUpdateMobileNetwork) {
setMobileDataLayout(mInternetDialogController.activeNetworkIsCellular(),
mInternetDialogController.isCarrierNetworkActive());
}
if (!mCanConfigWifi) {
return;
}
showProgressBar();
final boolean isDeviceLocked = mInternetDialogController.isDeviceLocked();
final boolean isWifiEnabled = mInternetDialogController.isWifiEnabled();
final boolean isWifiScanEnabled = mInternetDialogController.isWifiScanEnabled();
updateWifiToggle(isWifiEnabled, isDeviceLocked);
updateConnectedWifi(isWifiEnabled, isDeviceLocked);
updateWifiListAndSeeAll(isWifiEnabled, isDeviceLocked);
updateWifiScanNotify(isWifiEnabled, isWifiScanEnabled, isDeviceLocked);
}
private void setOnClickListener() {
mMobileNetworkLayout.setOnClickListener(v -> {
if (mInternetDialogController.isMobileDataEnabled()
&& !mInternetDialogController.isDeviceLocked()) {
if (!mInternetDialogController.activeNetworkIsCellular()) {
mInternetDialogController.connectCarrierNetwork();
}
}
});
mMobileDataToggle.setOnCheckedChangeListener(
(buttonView, isChecked) -> {
if (!isChecked && shouldShowMobileDialog()) {
showTurnOffMobileDialog();
} else if (!shouldShowMobileDialog()) {
mInternetDialogController.setMobileDataEnabled(mContext, mDefaultDataSubId,
isChecked, false);
}
});
mConnectedWifListLayout.setOnClickListener(this::onClickConnectedWifi);
mSeeAllLayout.setOnClickListener(this::onClickSeeMoreButton);
mWiFiToggle.setOnCheckedChangeListener(
(buttonView, isChecked) -> {
if (mInternetDialogController.isWifiEnabled() == isChecked) return;
mInternetDialogController.setWifiEnabled(isChecked);
});
mDoneButton.setOnClickListener(v -> dismiss());
mAirplaneModeButton.setOnClickListener(v -> {
mInternetDialogController.setAirplaneModeDisabled();
});
}
@MainThread
private void updateEthernet() {
mEthernetLayout.setVisibility(
mInternetDialogController.hasEthernet() ? View.VISIBLE : View.GONE);
}
private void setMobileDataLayout(boolean activeNetworkIsCellular,
boolean isCarrierNetworkActive) {
boolean isNetworkConnected = activeNetworkIsCellular || isCarrierNetworkActive;
// 1. Mobile network should be gone if airplane mode ON or the list of active
// subscriptionId is null.
// 2. Carrier network should be gone if airplane mode ON and Wi-Fi is OFF.
if (DEBUG) {
Log.d(TAG, "setMobileDataLayout, isCarrierNetworkActive = " + isCarrierNetworkActive);
}
boolean isWifiEnabled = mInternetDialogController.isWifiEnabled();
if (!mInternetDialogController.hasActiveSubId()
&& (!isWifiEnabled || !isCarrierNetworkActive)) {
mMobileNetworkLayout.setVisibility(View.GONE);
} else {
mMobileNetworkLayout.setVisibility(View.VISIBLE);
mMobileDataToggle.setChecked(mInternetDialogController.isMobileDataEnabled());
mMobileTitleText.setText(getMobileNetworkTitle());
String summary = getMobileNetworkSummary();
if (!TextUtils.isEmpty(summary)) {
mMobileSummaryText.setText(
Html.fromHtml(summary, Html.FROM_HTML_MODE_LEGACY));
mMobileSummaryText.setVisibility(View.VISIBLE);
} else {
mMobileSummaryText.setVisibility(View.GONE);
}
mBackgroundExecutor.execute(() -> {
Drawable drawable = getSignalStrengthDrawable();
mHandler.post(() -> {
mSignalIcon.setImageDrawable(drawable);
});
});
mMobileTitleText.setTextAppearance(isNetworkConnected
? R.style.TextAppearance_InternetDialog_Active
: R.style.TextAppearance_InternetDialog);
int secondaryRes = isNetworkConnected
? R.style.TextAppearance_InternetDialog_Secondary_Active
: R.style.TextAppearance_InternetDialog_Secondary;
mMobileSummaryText.setTextAppearance(secondaryRes);
// Set airplane mode to the summary for carrier network
if (mInternetDialogController.isAirplaneModeEnabled()) {
mAirplaneModeSummaryText.setVisibility(View.VISIBLE);
mAirplaneModeSummaryText.setText(mContext.getText(R.string.airplane_mode));
mAirplaneModeSummaryText.setTextAppearance(secondaryRes);
} else {
mAirplaneModeSummaryText.setVisibility(View.GONE);
}
mMobileNetworkLayout.setBackground(
isNetworkConnected ? mBackgroundOn : mBackgroundOff);
TypedArray array = mContext.obtainStyledAttributes(
R.style.InternetDialog_Divider_Active, new int[]{android.R.attr.background});
int dividerColor = Utils.getColorAttrDefaultColor(mContext,
android.R.attr.textColorSecondary);
mMobileToggleDivider.setBackgroundColor(isNetworkConnected
? array.getColor(0, dividerColor) : dividerColor);
array.recycle();
mMobileDataToggle.setVisibility(mCanConfigMobileData ? View.VISIBLE : View.INVISIBLE);
mMobileToggleDivider.setVisibility(
mCanConfigMobileData ? View.VISIBLE : View.INVISIBLE);
}
}
@MainThread
private void updateWifiToggle(boolean isWifiEnabled, boolean isDeviceLocked) {
if (mWiFiToggle.isChecked() != isWifiEnabled) {
mWiFiToggle.setChecked(isWifiEnabled);
}
if (isDeviceLocked) {
mWifiToggleTitleText.setTextAppearance((mConnectedWifiEntry != null)
? R.style.TextAppearance_InternetDialog_Active
: R.style.TextAppearance_InternetDialog);
}
mTurnWifiOnLayout.setBackground(
(isDeviceLocked && mConnectedWifiEntry != null) ? mBackgroundOn : null);
if (!mCanChangeWifiState && mWiFiToggle.isEnabled()) {
mWiFiToggle.setEnabled(false);
mWifiToggleTitleText.setEnabled(false);
final TextView summaryText = mDialogView.requireViewById(R.id.wifi_toggle_summary);
summaryText.setEnabled(false);
summaryText.setVisibility(View.VISIBLE);
}
}
@MainThread
private void updateConnectedWifi(boolean isWifiEnabled, boolean isDeviceLocked) {
if (!isWifiEnabled || mConnectedWifiEntry == null || isDeviceLocked) {
mConnectedWifListLayout.setVisibility(View.GONE);
return;
}
mConnectedWifListLayout.setVisibility(View.VISIBLE);
mConnectedWifiTitleText.setText(mConnectedWifiEntry.getTitle());
mConnectedWifiSummaryText.setText(mConnectedWifiEntry.getSummary(false));
mConnectedWifiIcon.setImageDrawable(
mInternetDialogController.getInternetWifiDrawable(mConnectedWifiEntry));
mWifiSettingsIcon.setColorFilter(
mContext.getColor(R.color.connected_network_primary_color));
}
@MainThread
private void updateWifiListAndSeeAll(boolean isWifiEnabled, boolean isDeviceLocked) {
if (!isWifiEnabled || isDeviceLocked) {
mWifiRecyclerView.setVisibility(View.GONE);
mSeeAllLayout.setVisibility(View.GONE);
return;
}
final int wifiListMaxCount = getWifiListMaxCount();
if (mAdapter.getItemCount() > wifiListMaxCount) {
mHasMoreWifiEntries = true;
}
mAdapter.setMaxEntriesCount(wifiListMaxCount);
final int wifiListMinHeight = mWifiNetworkHeight * wifiListMaxCount;
if (mWifiRecyclerView.getMinimumHeight() != wifiListMinHeight) {
mWifiRecyclerView.setMinimumHeight(wifiListMinHeight);
}
mWifiRecyclerView.setVisibility(View.VISIBLE);
mSeeAllLayout.setVisibility(mHasMoreWifiEntries ? View.VISIBLE : View.INVISIBLE);
}
@VisibleForTesting
@MainThread
int getWifiListMaxCount() {
// Use the maximum count of networks to calculate the remaining count for Wi-Fi networks.
int count = MAX_NETWORK_COUNT;
if (mEthernetLayout.getVisibility() == View.VISIBLE) {
count -= 1;
}
if (mMobileNetworkLayout.getVisibility() == View.VISIBLE) {
count -= 1;
}
// If the remaining count is greater than the maximum count of the Wi-Fi network, the
// maximum count of the Wi-Fi network is used.
if (count > MAX_WIFI_ENTRY_COUNT) {
count = MAX_WIFI_ENTRY_COUNT;
}
if (mConnectedWifListLayout.getVisibility() == View.VISIBLE) {
count -= 1;
}
return count;
}
@MainThread
private void updateWifiScanNotify(boolean isWifiEnabled, boolean isWifiScanEnabled,
boolean isDeviceLocked) {
if (isWifiEnabled || !isWifiScanEnabled || isDeviceLocked) {
mWifiScanNotifyLayout.setVisibility(View.GONE);
return;
}
if (TextUtils.isEmpty(mWifiScanNotifyText.getText())) {
final AnnotationLinkSpan.LinkInfo linkInfo = new AnnotationLinkSpan.LinkInfo(
AnnotationLinkSpan.LinkInfo.DEFAULT_ANNOTATION,
mInternetDialogController::launchWifiScanningSetting);
mWifiScanNotifyText.setText(AnnotationLinkSpan.linkify(
getContext().getText(R.string.wifi_scan_notify_message), linkInfo));
mWifiScanNotifyText.setMovementMethod(LinkMovementMethod.getInstance());
}
mWifiScanNotifyLayout.setVisibility(View.VISIBLE);
}
void onClickConnectedWifi(View view) {
if (mConnectedWifiEntry == null) {
return;
}
mInternetDialogController.launchWifiDetailsSetting(mConnectedWifiEntry.getKey(), view);
}
void onClickSeeMoreButton(View view) {
mInternetDialogController.launchNetworkSetting(view);
}
CharSequence getDialogTitleText() {
return mInternetDialogController.getDialogTitleText();
}
@Nullable
CharSequence getSubtitleText() {
return mInternetDialogController.getSubtitleText(
mIsProgressBarVisible && !mIsSearchingHidden);
}
private Drawable getSignalStrengthDrawable() {
return mInternetDialogController.getSignalStrengthDrawable();
}
CharSequence getMobileNetworkTitle() {
return mInternetDialogController.getMobileNetworkTitle();
}
String getMobileNetworkSummary() {
return mInternetDialogController.getMobileNetworkSummary();
}
protected void showProgressBar() {
if (!mInternetDialogController.isWifiEnabled()
|| mInternetDialogController.isDeviceLocked()) {
setProgressBarVisible(false);
return;
}
setProgressBarVisible(true);
if (mConnectedWifiEntry != null || mWifiEntriesCount > 0) {
mHandler.postDelayed(mHideProgressBarRunnable, PROGRESS_DELAY_MS);
} else if (!mIsSearchingHidden) {
mHandler.postDelayed(mHideSearchingRunnable, PROGRESS_DELAY_MS);
}
}
private void setProgressBarVisible(boolean visible) {
if (mIsProgressBarVisible == visible) {
return;
}
mIsProgressBarVisible = visible;
mProgressBar.setVisibility(visible ? View.VISIBLE : View.GONE);
mProgressBar.setIndeterminate(visible);
mDivider.setVisibility(visible ? View.GONE : View.VISIBLE);
mInternetDialogSubTitle.setText(getSubtitleText());
}
private boolean shouldShowMobileDialog() {
boolean flag = Prefs.getBoolean(mContext, QS_HAS_TURNED_OFF_MOBILE_DATA,
false);
if (mInternetDialogController.isMobileDataEnabled() && !flag) {
return true;
}
return false;
}
private void showTurnOffMobileDialog() {
CharSequence carrierName = getMobileNetworkTitle();
boolean isInService = mInternetDialogController.isVoiceStateInService();
if (TextUtils.isEmpty(carrierName) || !isInService) {
carrierName = mContext.getString(R.string.mobile_data_disable_message_default_carrier);
}
mAlertDialog = new Builder(mContext)
.setTitle(R.string.mobile_data_disable_title)
.setMessage(mContext.getString(R.string.mobile_data_disable_message, carrierName))
.setNegativeButton(android.R.string.cancel, (d, w) -> {
mMobileDataToggle.setChecked(true);
})
.setPositiveButton(
com.android.internal.R.string.alert_windows_notification_turn_off_action,
(d, w) -> {
mInternetDialogController.setMobileDataEnabled(mContext,
mDefaultDataSubId, false, false);
mMobileDataToggle.setChecked(false);
Prefs.putBoolean(mContext, QS_HAS_TURNED_OFF_MOBILE_DATA, true);
})
.create();
mAlertDialog.setOnCancelListener(dialog -> mMobileDataToggle.setChecked(true));
mAlertDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG);
SystemUIDialog.setShowForAllUsers(mAlertDialog, true);
SystemUIDialog.registerDismissListener(mAlertDialog);
SystemUIDialog.setWindowOnTop(mAlertDialog, mKeyguard.isShowing());
mAlertDialog.show();
}
@Override
public void onRefreshCarrierInfo() {
mHandler.post(() -> updateDialog(true /* shouldUpdateMobileNetwork */));
}
@Override
public void onSimStateChanged() {
mHandler.post(() -> updateDialog(true /* shouldUpdateMobileNetwork */));
}
@Override
@WorkerThread
public void onCapabilitiesChanged(Network network, NetworkCapabilities networkCapabilities) {
mHandler.post(() -> updateDialog(true /* shouldUpdateMobileNetwork */));
}
@Override
@WorkerThread
public void onLost(Network network) {
mHandler.post(() -> updateDialog(true /* shouldUpdateMobileNetwork */));
}
@Override
public void onSubscriptionsChanged(int defaultDataSubId) {
mDefaultDataSubId = defaultDataSubId;
mTelephonyManager = mTelephonyManager.createForSubscriptionId(mDefaultDataSubId);
mHandler.post(() -> updateDialog(true /* shouldUpdateMobileNetwork */));
}
@Override
public void onUserMobileDataStateChanged(boolean enabled) {
mHandler.post(() -> updateDialog(true /* shouldUpdateMobileNetwork */));
}
@Override
public void onServiceStateChanged(ServiceState serviceState) {
mHandler.post(() -> updateDialog(true /* shouldUpdateMobileNetwork */));
}
@Override
@WorkerThread
public void onDataConnectionStateChanged(int state, int networkType) {
mHandler.post(() -> updateDialog(true /* shouldUpdateMobileNetwork */));
}
@Override
public void onSignalStrengthsChanged(SignalStrength signalStrength) {
mHandler.post(() -> updateDialog(true /* shouldUpdateMobileNetwork */));
}
@Override
public void onDisplayInfoChanged(TelephonyDisplayInfo telephonyDisplayInfo) {
mHandler.post(() -> updateDialog(true /* shouldUpdateMobileNetwork */));
}
@Override
@WorkerThread
public void onAccessPointsChanged(@Nullable List<WifiEntry> wifiEntries,
@Nullable WifiEntry connectedEntry, boolean hasMoreWifiEntries) {
// Should update the carrier network layout when it is connected under airplane mode ON.
boolean shouldUpdateCarrierNetwork = mMobileNetworkLayout.getVisibility() == View.VISIBLE
&& mInternetDialogController.isAirplaneModeEnabled();
mHandler.post(() -> {
mConnectedWifiEntry = connectedEntry;
mWifiEntriesCount = wifiEntries == null ? 0 : wifiEntries.size();
mHasMoreWifiEntries = hasMoreWifiEntries;
updateDialog(shouldUpdateCarrierNetwork /* shouldUpdateMobileNetwork */);
mAdapter.setWifiEntries(wifiEntries, mWifiEntriesCount);
mAdapter.notifyDataSetChanged();
});
}
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
if (mAlertDialog != null && !mAlertDialog.isShowing()) {
if (!hasFocus && isShowing()) {
dismiss();
}
}
}
public enum InternetDialogEvent implements UiEventLogger.UiEventEnum {
@UiEvent(doc = "The Internet dialog became visible on the screen.")
INTERNET_DIALOG_SHOW(843);
private final int mId;
InternetDialogEvent(int id) {
mId = id;
}
@Override
public int getId() {
return mId;
}
}
}