[Provider Model] Fix Internet preference crash

- Post on main thread for UI update

- Add NPE checking

Bug: 178670562
Test: manual test
- atest InternetPreferenceControllerTest

Change-Id: I6c37f7dc19f9f9bbc75b36415a47aa1366dc5f5e
This commit is contained in:
Weng Su
2021-01-29 02:04:19 +08:00
parent ba845f7fe4
commit fc3a51ed3f
2 changed files with 23 additions and 2 deletions

View File

@@ -31,6 +31,7 @@ import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionManager; import android.telephony.SubscriptionManager;
import androidx.annotation.IdRes; import androidx.annotation.IdRes;
import androidx.annotation.VisibleForTesting;
import androidx.lifecycle.Lifecycle; import androidx.lifecycle.Lifecycle;
import androidx.lifecycle.LifecycleObserver; import androidx.lifecycle.LifecycleObserver;
import androidx.lifecycle.OnLifecycleEvent; import androidx.lifecycle.OnLifecycleEvent;
@@ -42,6 +43,7 @@ import com.android.settings.widget.SummaryUpdater;
import com.android.settings.wifi.WifiSummaryUpdater; import com.android.settings.wifi.WifiSummaryUpdater;
import com.android.settingslib.Utils; import com.android.settingslib.Utils;
import com.android.settingslib.core.AbstractPreferenceController; import com.android.settingslib.core.AbstractPreferenceController;
import com.android.settingslib.utils.ThreadUtils;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
@@ -147,8 +149,13 @@ public class InternetPreferenceController extends AbstractPreferenceController i
* @param internetType the internet type * @param internetType the internet type
*/ */
public void onInternetTypeChanged(@InternetUpdater.InternetType int internetType) { public void onInternetTypeChanged(@InternetUpdater.InternetType int internetType) {
final boolean needUpdate = (internetType != mInternetType);
mInternetType = internetType; mInternetType = internetType;
if (needUpdate) {
ThreadUtils.postOnMainThread(() -> {
updateState(mPreference); updateState(mPreference);
});
}
} }
@Override @Override
@@ -158,13 +165,17 @@ public class InternetPreferenceController extends AbstractPreferenceController i
} }
} }
private void updateCellularSummary() { @VisibleForTesting
void updateCellularSummary() {
final SubscriptionManager subscriptionManager = final SubscriptionManager subscriptionManager =
mContext.getSystemService(SubscriptionManager.class); mContext.getSystemService(SubscriptionManager.class);
if (subscriptionManager == null) { if (subscriptionManager == null) {
return; return;
} }
SubscriptionInfo subInfo = subscriptionManager.getDefaultDataSubscriptionInfo(); SubscriptionInfo subInfo = subscriptionManager.getDefaultDataSubscriptionInfo();
if (subInfo == null) {
return;
}
mPreference.setSummary(subInfo.getDisplayName()); mPreference.setSummary(subInfo.getDisplayName());
} }
} }

View File

@@ -36,6 +36,7 @@ import android.net.NetworkScoreManager;
import android.net.wifi.WifiManager; import android.net.wifi.WifiManager;
import android.os.Handler; import android.os.Handler;
import android.os.Looper; import android.os.Looper;
import android.telephony.SubscriptionManager;
import androidx.lifecycle.Lifecycle; import androidx.lifecycle.Lifecycle;
import androidx.preference.Preference; import androidx.preference.Preference;
@@ -123,4 +124,13 @@ public class InternetPreferenceControllerTest {
assertThat(mPreference.getSummary()).isEqualTo(TEST_SUMMARY); assertThat(mPreference.getSummary()).isEqualTo(TEST_SUMMARY);
} }
@Test
public void updateCellularSummary_getNullSubscriptionInfo_shouldNotCrash() {
final SubscriptionManager subscriptionManager = mock(SubscriptionManager.class);
when(mContext.getSystemService(SubscriptionManager.class)).thenReturn(subscriptionManager);
when(subscriptionManager.getDefaultDataSubscriptionInfo()).thenReturn(null);
mController.updateCellularSummary();
}
} }