From 3b53b807154a0bd3d1dccb44ad733838daf74ad0 Mon Sep 17 00:00:00 2001 From: Zhen Zhang Date: Mon, 23 Mar 2020 12:18:14 -0700 Subject: [PATCH] Fix crash in AllInOneTetherSettings when user is not admin When user is not admin, we should skip the setup and tear down procedures in AllInOneTetherSettings' lifecycle. Also, the switch for "Hotspot & tethering" on "Network & internet" should be disabled in such case. Bug: 151648198 Test: Build and flashed to crosshatch device. Using guest user, the settings won't crash when using AllInOneTetherSetting and the switch is disabled. Change-Id: Ibd2f4111c53b8b9fa6a18504a681a27b966a3c46 --- .../settings/AllInOneTetherSettings.java | 17 +++++++++++++++-- .../android/settings/network/TetherEnabler.java | 16 ++++++++++++---- 2 files changed, 27 insertions(+), 6 deletions(-) diff --git a/src/com/android/settings/AllInOneTetherSettings.java b/src/com/android/settings/AllInOneTetherSettings.java index 69edf4348b6..c562faee1d7 100644 --- a/src/com/android/settings/AllInOneTetherSettings.java +++ b/src/com/android/settings/AllInOneTetherSettings.java @@ -249,18 +249,31 @@ public class AllInOneTetherSettings extends RestrictedDashboardFragment @Override public void onResume() { super.onResume(); - mTetherEnabler.addListener(mStateUpdateListener); + if (mUnavailable) { + return; + } + if (mTetherEnabler != null) { + mTetherEnabler.addListener(mStateUpdateListener); + } } @Override public void onPause() { super.onPause(); - mTetherEnabler.removeListener(mStateUpdateListener); + if (mUnavailable) { + return; + } + if (mTetherEnabler != null) { + mTetherEnabler.removeListener(mStateUpdateListener); + } } @Override public void onStop() { super.onStop(); + if (mUnavailable) { + return; + } final Context context = getContext(); if (context != null) { context.unregisterReceiver(mTetherChangeReceiver); diff --git a/src/com/android/settings/network/TetherEnabler.java b/src/com/android/settings/network/TetherEnabler.java index 9cc9c5d67b6..c4b36d32c9d 100644 --- a/src/com/android/settings/network/TetherEnabler.java +++ b/src/com/android/settings/network/TetherEnabler.java @@ -35,6 +35,7 @@ import android.net.ConnectivityManager; import android.net.wifi.WifiManager; import android.os.Handler; import android.os.Looper; +import android.os.UserManager; import android.text.TextUtils; import android.util.Log; @@ -106,6 +107,7 @@ public class TetherEnabler implements SwitchWidgetController.OnSwitchChangeListe private final SwitchWidgetController mSwitchWidgetController; private final WifiManager mWifiManager; private final ConnectivityManager mConnectivityManager; + private final UserManager mUserManager; private final DataSaverBackend mDataSaverBackend; private boolean mDataSaverEnabled; @@ -128,6 +130,7 @@ public class TetherEnabler implements SwitchWidgetController.OnSwitchChangeListe mConnectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); + mUserManager = (UserManager) context.getSystemService(Context.USER_SERVICE); mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); mBluetoothPan = bluetoothPan; mDataSaverEnabled = mDataSaverBackend.isDataSaverEnabled(); @@ -171,6 +174,11 @@ public class TetherEnabler implements SwitchWidgetController.OnSwitchChangeListe } } + private void setSwitchEnabled(boolean enabled) { + mSwitchWidgetController.setEnabled( + enabled && !mDataSaverEnabled && mUserManager.isAdminUser()); + } + @VisibleForTesting void updateState(@Nullable String[] tethered) { int state = getTetheringState(tethered); @@ -178,7 +186,7 @@ public class TetherEnabler implements SwitchWidgetController.OnSwitchChangeListe Log.d(TAG, "updateState: " + state); } setSwitchCheckedInternal(state != TETHERING_OFF); - mSwitchWidgetController.setEnabled(!mDataSaverEnabled); + setSwitchEnabled(true); for (int i = 0, size = mListeners.size(); i < size; ++i) { mListeners.get(i).onTetherStateUpdated(state); } @@ -251,7 +259,7 @@ public class TetherEnabler implements SwitchWidgetController.OnSwitchChangeListe if ((choice == TETHERING_WIFI && isWifiTethering(state)) || (choice == TETHERING_USB && isUsbTethering(state)) || (choice == TETHERING_BLUETOOTH && isBluetoothTethering(state))) { - mSwitchWidgetController.setEnabled(false); + setSwitchEnabled(false); mConnectivityManager.stopTethering(choice); if (choice == TETHERING_BLUETOOTH) { // Stop bluetooth tether won't invoke tether state changed callback, so we need this @@ -283,7 +291,7 @@ public class TetherEnabler implements SwitchWidgetController.OnSwitchChangeListe } } - mSwitchWidgetController.setEnabled(false); + setSwitchEnabled(false); mConnectivityManager.startTethering(choice, true /* showProvisioningUi */, mOnStartTetheringCallback, new Handler(Looper.getMainLooper())); } @@ -351,7 +359,7 @@ public class TetherEnabler implements SwitchWidgetController.OnSwitchChangeListe @Override public void onDataSaverChanged(boolean isDataSaving) { mDataSaverEnabled = isDataSaving; - mSwitchWidgetController.setEnabled(!isDataSaving); + setSwitchEnabled(true); } @Override