From 2be1842da27f4529bd702982c7d1cea3bdc1a0f5 Mon Sep 17 00:00:00 2001 From: Weng Su Date: Fri, 18 Mar 2022 00:37:04 +0800 Subject: [PATCH] Fix the Settings crash when resetting network - The issue device is not supported the Telephony feature which will cause related sub-funcions to be unavailable. - If there has no Telephony feature supported, then bypass related sub-functions. - Use the same solution for Wi-Fi feature related sub-functions. Bug: 223747479 Test: manual test make RunSettingsLibRoboTests \ ROBOTEST_FILTER=ConnectivitySubsystemsRecoveryManagerTest Change-Id: I17b9728c7dc2ee836bf2653922b47ff66afa7857 --- ...ConnectivitySubsystemsRecoveryManager.java | 18 +++- ...ectivitySubsystemsRecoveryManagerTest.java | 93 +++++++++++++++++++ 2 files changed, 107 insertions(+), 4 deletions(-) create mode 100644 packages/SettingsLib/tests/robotests/src/com/android/settingslib/connectivity/ConnectivitySubsystemsRecoveryManagerTest.java diff --git a/packages/SettingsLib/src/com/android/settingslib/connectivity/ConnectivitySubsystemsRecoveryManager.java b/packages/SettingsLib/src/com/android/settingslib/connectivity/ConnectivitySubsystemsRecoveryManager.java index c61f8a9c3b534..be420ac8bd24b 100644 --- a/packages/SettingsLib/src/com/android/settingslib/connectivity/ConnectivitySubsystemsRecoveryManager.java +++ b/packages/SettingsLib/src/com/android/settingslib/connectivity/ConnectivitySubsystemsRecoveryManager.java @@ -31,6 +31,8 @@ import android.telephony.TelephonyCallback; import android.telephony.TelephonyManager; import android.util.Log; +import androidx.annotation.VisibleForTesting; + /** * An interface class to manage connectivity subsystem recovery/restart operations. */ @@ -193,22 +195,30 @@ public class ConnectivitySubsystemsRecoveryManager { mApmMonitorRegistered = false; } - private void startTrackingWifiRestart() { + @VisibleForTesting + void startTrackingWifiRestart() { + if (mWifiManager == null) return; mWifiManager.registerSubsystemRestartTrackingCallback(new HandlerExecutor(mHandler), mWifiSubsystemRestartTrackingCallback); } - private void stopTrackingWifiRestart() { + @VisibleForTesting + void stopTrackingWifiRestart() { + if (mWifiManager == null) return; mWifiManager.unregisterSubsystemRestartTrackingCallback( mWifiSubsystemRestartTrackingCallback); } - private void startTrackingTelephonyRestart() { + @VisibleForTesting + void startTrackingTelephonyRestart() { + if (mTelephonyManager == null) return; mTelephonyManager.registerTelephonyCallback(new HandlerExecutor(mHandler), mTelephonyCallback); } - private void stopTrackingTelephonyRestart() { + @VisibleForTesting + void stopTrackingTelephonyRestart() { + if (mTelephonyManager == null) return; mTelephonyManager.unregisterTelephonyCallback(mTelephonyCallback); } diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/connectivity/ConnectivitySubsystemsRecoveryManagerTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/connectivity/ConnectivitySubsystemsRecoveryManagerTest.java new file mode 100644 index 0000000000000..ca53a187d6f8b --- /dev/null +++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/connectivity/ConnectivitySubsystemsRecoveryManagerTest.java @@ -0,0 +1,93 @@ +/* + * 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.settingslib.connectivity; + +import static org.mockito.Mockito.when; + +import android.content.Context; +import android.content.pm.PackageManager; +import android.os.Handler; + +import androidx.test.core.app.ApplicationProvider; + +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.Spy; +import org.mockito.junit.MockitoJUnit; +import org.mockito.junit.MockitoRule; +import org.robolectric.RobolectricTestRunner; + +@RunWith(RobolectricTestRunner.class) +public class ConnectivitySubsystemsRecoveryManagerTest { + + @Rule + public final MockitoRule mMockitoRule = MockitoJUnit.rule(); + @Spy + Context mContext = ApplicationProvider.getApplicationContext(); + @Spy + Handler mMainHandler = ApplicationProvider.getApplicationContext().getMainThreadHandler(); + @Mock + PackageManager mPackageManager; + + ConnectivitySubsystemsRecoveryManager mConnectivitySubsystemsRecoveryManager; + + @Before + public void setUp() { + when(mContext.getPackageManager()).thenReturn(mPackageManager); + when(mPackageManager.hasSystemFeature(PackageManager.FEATURE_WIFI)).thenReturn(true); + when(mPackageManager.hasSystemFeature(PackageManager.FEATURE_TELEPHONY)).thenReturn(true); + } + + @Test + public void startTrackingWifiRestart_hasNoWifiFeature_shouldNotCrash() { + when(mPackageManager.hasSystemFeature(PackageManager.FEATURE_WIFI)).thenReturn(false); + mConnectivitySubsystemsRecoveryManager = + new ConnectivitySubsystemsRecoveryManager(mContext, mMainHandler); + + mConnectivitySubsystemsRecoveryManager.startTrackingWifiRestart(); + } + + @Test + public void stopTrackingWifiRestart_hasNoWifiFeature_shouldNotCrash() { + when(mPackageManager.hasSystemFeature(PackageManager.FEATURE_WIFI)).thenReturn(false); + mConnectivitySubsystemsRecoveryManager = + new ConnectivitySubsystemsRecoveryManager(mContext, mMainHandler); + + mConnectivitySubsystemsRecoveryManager.stopTrackingWifiRestart(); + } + + @Test + public void startTrackingTelephonyRestart_hasNoTelephonyFeature_shouldNotCrash() { + when(mPackageManager.hasSystemFeature(PackageManager.FEATURE_TELEPHONY)).thenReturn(false); + mConnectivitySubsystemsRecoveryManager = + new ConnectivitySubsystemsRecoveryManager(mContext, mMainHandler); + + mConnectivitySubsystemsRecoveryManager.startTrackingTelephonyRestart(); + } + + @Test + public void stopTrackingTelephonyRestart_hasNoTelephonyFeature_shouldNotCrash() { + when(mPackageManager.hasSystemFeature(PackageManager.FEATURE_TELEPHONY)).thenReturn(false); + mConnectivitySubsystemsRecoveryManager = + new ConnectivitySubsystemsRecoveryManager(mContext, mMainHandler); + + mConnectivitySubsystemsRecoveryManager.stopTrackingTelephonyRestart(); + } +}