From 6db1440a0a1a7aec34cb6c0ea12d864bb5d89138 Mon Sep 17 00:00:00 2001 From: jackqdyulei Date: Tue, 2 Apr 2019 17:27:41 -0700 Subject: [PATCH] Move telephony method to worker thread Get bug complaining it blocks UI even though it works fine some devices. This CL moves methods to worker thread and keep progressbar shown at least for 1 second, to avoid janky UI. Fixes: 129329645 Test: RunSettingsRoboTests Change-Id: Iee51949b7f6dfe2ede0fc4e6cd0f7b96d7199081 --- .../telephony/NetworkSelectSettings.java | 7 +- .../gsm/AutoSelectPreferenceController.java | 68 +++++++++++++++++-- .../AutoSelectPreferenceControllerTest.java | 28 +++++--- 3 files changed, 82 insertions(+), 21 deletions(-) diff --git a/src/com/android/settings/network/telephony/NetworkSelectSettings.java b/src/com/android/settings/network/telephony/NetworkSelectSettings.java index 47db8756998..d27a0c8a3f8 100644 --- a/src/com/android/settings/network/telephony/NetworkSelectSettings.java +++ b/src/com/android/settings/network/telephony/NetworkSelectSettings.java @@ -96,11 +96,10 @@ public class NetworkSelectSettings extends DashboardFragment { com.android.internal.R.bool.config_enableNewAutoSelectNetworkUI); mSubId = getArguments().getInt(Settings.EXTRA_SUB_ID); - mConnectedPreferenceCategory = - (PreferenceCategory) findPreference(PREF_KEY_CONNECTED_NETWORK_OPERATOR); - mPreferenceCategory = - (PreferenceCategory) findPreference(PREF_KEY_NETWORK_OPERATORS); + mConnectedPreferenceCategory = findPreference(PREF_KEY_CONNECTED_NETWORK_OPERATOR); + mPreferenceCategory = findPreference(PREF_KEY_NETWORK_OPERATORS); mStatusMessagePreference = new Preference(getContext()); + mStatusMessagePreference.setSelectable(false); mSelectedPreference = null; mTelephonyManager = TelephonyManager.from(getContext()).createForSubscriptionId(mSubId); mNetworkScanHelper = new NetworkScanHelper( diff --git a/src/com/android/settings/network/telephony/gsm/AutoSelectPreferenceController.java b/src/com/android/settings/network/telephony/gsm/AutoSelectPreferenceController.java index 7db9df0bfca..adfb1d8ad2d 100644 --- a/src/com/android/settings/network/telephony/gsm/AutoSelectPreferenceController.java +++ b/src/com/android/settings/network/telephony/gsm/AutoSelectPreferenceController.java @@ -16,41 +16,57 @@ package com.android.settings.network.telephony.gsm; +import android.app.ProgressDialog; import android.app.settings.SettingsEnums; import android.content.Context; import android.os.Bundle; +import android.os.Handler; +import android.os.Looper; import android.os.PersistableBundle; +import android.os.SystemClock; import android.provider.Settings; import android.telephony.CarrierConfigManager; import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; +import androidx.annotation.VisibleForTesting; import androidx.preference.Preference; +import androidx.preference.PreferenceScreen; +import androidx.preference.SwitchPreference; import com.android.settings.R; import com.android.settings.core.SubSettingLauncher; import com.android.settings.network.telephony.MobileNetworkUtils; import com.android.settings.network.telephony.NetworkSelectSettings; import com.android.settings.network.telephony.TelephonyTogglePreferenceController; +import com.android.settingslib.utils.ThreadUtils; import java.util.ArrayList; import java.util.List; +import java.util.concurrent.TimeUnit; /** * Preference controller for "Auto Select Network" */ public class AutoSelectPreferenceController extends TelephonyTogglePreferenceController { + private static final long MINIMUM_DIALOG_TIME_MILLIS = TimeUnit.SECONDS.toMillis(1); + private final Handler mUiHandler; private int mSubId; private TelephonyManager mTelephonyManager; private boolean mOnlyAutoSelectInHome; private List mListeners; + @VisibleForTesting + ProgressDialog mProgressDialog; + @VisibleForTesting + SwitchPreference mSwitchPreference; public AutoSelectPreferenceController(Context context, String key) { super(context, key); mTelephonyManager = context.getSystemService(TelephonyManager.class); mSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID; mListeners = new ArrayList<>(); + mUiHandler = new Handler(Looper.getMainLooper()); } @Override @@ -60,6 +76,12 @@ public class AutoSelectPreferenceController extends TelephonyTogglePreferenceCon : CONDITIONALLY_UNAVAILABLE; } + @Override + public void displayPreference(PreferenceScreen screen) { + super.displayPreference(screen); + mSwitchPreference = screen.findPreference(getPreferenceKey()); + } + @Override public boolean isChecked() { return mTelephonyManager.getNetworkSelectionMode() @@ -86,14 +108,28 @@ public class AutoSelectPreferenceController extends TelephonyTogglePreferenceCon @Override public boolean setChecked(boolean isChecked) { if (isChecked) { - mTelephonyManager.setNetworkSelectionModeAutomatic(); + final long startMillis = SystemClock.elapsedRealtime(); + showAutoSelectProgressBar(); + mSwitchPreference.setEnabled(false); + ThreadUtils.postOnBackgroundThread(() -> { + // set network selection mode in background + mTelephonyManager.setNetworkSelectionModeAutomatic(); + final int mode = mTelephonyManager.getNetworkSelectionMode(); - for (OnNetworkSelectModeListener lsn : mListeners) { - lsn.onNetworkSelectModeChanged(); - } - // Manually check whether it is successfully - return mTelephonyManager.getNetworkSelectionMode() - == TelephonyManager.NETWORK_SELECTION_MODE_AUTO; + //Update UI in UI thread + final long durationMillis = SystemClock.elapsedRealtime() - startMillis; + mUiHandler.postDelayed(() -> { + mSwitchPreference.setEnabled(true); + mSwitchPreference.setChecked( + mode == TelephonyManager.NETWORK_SELECTION_MODE_AUTO); + for (OnNetworkSelectModeListener lsn : mListeners) { + lsn.onNetworkSelectModeChanged(); + } + dismissProgressBar(); + }, + Math.max(MINIMUM_DIALOG_TIME_MILLIS - durationMillis, 0)); + }); + return false; } else { final Bundle bundle = new Bundle(); bundle.putInt(Settings.EXTRA_SUB_ID, mSubId); @@ -126,6 +162,24 @@ public class AutoSelectPreferenceController extends TelephonyTogglePreferenceCon return this; } + private void showAutoSelectProgressBar() { + if (mProgressDialog == null) { + mProgressDialog = new ProgressDialog(mContext); + mProgressDialog.setMessage( + mContext.getResources().getString(R.string.register_automatically)); + mProgressDialog.setCanceledOnTouchOutside(false); + mProgressDialog.setCancelable(false); + mProgressDialog.setIndeterminate(true); + } + mProgressDialog.show(); + } + + private void dismissProgressBar() { + if (mProgressDialog != null && mProgressDialog.isShowing()) { + mProgressDialog.dismiss(); + } + } + /** * Callback when network select mode is changed * diff --git a/tests/robotests/src/com/android/settings/network/telephony/gsm/AutoSelectPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/network/telephony/gsm/AutoSelectPreferenceControllerTest.java index e9cd731a629..0ae2dc6ec6e 100644 --- a/tests/robotests/src/com/android/settings/network/telephony/gsm/AutoSelectPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/network/telephony/gsm/AutoSelectPreferenceControllerTest.java @@ -23,13 +23,14 @@ import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import android.app.ProgressDialog; import android.content.Context; import android.os.PersistableBundle; import android.telephony.CarrierConfigManager; import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; -import androidx.preference.Preference; +import androidx.preference.SwitchPreference; import com.android.settings.R; @@ -39,6 +40,7 @@ import org.junit.runner.RunWith; import org.mockito.Answers; import org.mockito.Mock; import org.mockito.MockitoAnnotations; +import org.robolectric.Robolectric; import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; @@ -53,10 +55,12 @@ public class AutoSelectPreferenceControllerTest { private SubscriptionManager mSubscriptionManager; @Mock private CarrierConfigManager mCarrierConfigManager; + @Mock + private ProgressDialog mProgressDialog; private PersistableBundle mCarrierConfig; private AutoSelectPreferenceController mController; - private Preference mPreference; + private SwitchPreference mSwitchPreference; private Context mContext; @Before @@ -75,18 +79,22 @@ public class AutoSelectPreferenceControllerTest { true); when(mCarrierConfigManager.getConfigForSubId(SUB_ID)).thenReturn(mCarrierConfig); - mPreference = new Preference(mContext); + mSwitchPreference = new SwitchPreference(mContext); mController = new AutoSelectPreferenceController(mContext, "auto_select"); + mController.mProgressDialog = mProgressDialog; + mController.mSwitchPreference = mSwitchPreference; mController.init(SUB_ID); } @Test - public void setChecked_isChecked_updateValue() { + public void setChecked_isChecked_showProgressDialog() { when(mTelephonyManager.getNetworkSelectionMode()).thenReturn( TelephonyManager.NETWORK_SELECTION_MODE_AUTO); - assertThat(mController.setChecked(true)).isTrue(); + assertThat(mController.setChecked(true)).isFalse(); + Robolectric.flushBackgroundThreadScheduler(); + verify(mProgressDialog).show(); verify(mTelephonyManager).setNetworkSelectionModeAutomatic(); } @@ -94,9 +102,9 @@ public class AutoSelectPreferenceControllerTest { public void updateState_isRoaming_enabled() { when(mTelephonyManager.getServiceState().getRoaming()).thenReturn(true); - mController.updateState(mPreference); + mController.updateState(mSwitchPreference); - assertThat(mPreference.isEnabled()).isTrue(); + assertThat(mSwitchPreference.isEnabled()).isTrue(); } @Test @@ -104,10 +112,10 @@ public class AutoSelectPreferenceControllerTest { when(mTelephonyManager.getServiceState().getRoaming()).thenReturn(false); doReturn(OPERATOR_NAME).when(mTelephonyManager).getSimOperatorName(); - mController.updateState(mPreference); + mController.updateState(mSwitchPreference); - assertThat(mPreference.isEnabled()).isFalse(); - assertThat(mPreference.getSummary()).isEqualTo( + assertThat(mSwitchPreference.isEnabled()).isFalse(); + assertThat(mSwitchPreference.getSummary()).isEqualTo( mContext.getString(R.string.manual_mode_disallowed_summary, mTelephonyManager.getSimOperatorName())); }