From 1766b3c01d9a1ca4ef60b485f4245b43d346cb2f Mon Sep 17 00:00:00 2001 From: Jason Chiu Date: Thu, 9 Apr 2020 14:29:58 +0800 Subject: [PATCH] Fix indexing error of mobile related controllers There were several errors in indexing mobile related sliceable controllers, which led them not able to display on Panel and as inline controls in search result. It's because indexing mechanism is running in a worker thread and trying to construct each controller instance, but the failed controllers' constructors need to initilize something in the main thread. - Give the main looper to the classes which only can be initialized in the main thread to fix the indexing. - Guard null pointer exception in SlicesIndexer after fixing the indexing. - Use onStart/onStop in AirplaneModePreferenceController to start/stop listener. Fixes: 149720345 Test: robotest Change-Id: Ibe5a8d6cc713eeddf26eceaabc05e6d1faa45507 --- .../android/settings/AirplaneModeEnabler.java | 16 +++++++++++----- .../AirplaneModePreferenceController.java | 14 +++++++------- .../network/SubscriptionsChangeListener.java | 5 +++-- .../Enhanced4gBasePreferenceController.java | 3 ++- .../VideoCallingPreferenceController.java | 3 ++- .../WifiCallingPreferenceController.java | 3 ++- .../android/settings/slices/SlicesIndexer.java | 5 ++++- .../settings/AirplaneModeEnablerTest.java | 2 +- .../AirplaneModePreferenceControllerTest.java | 12 ++++++------ 9 files changed, 38 insertions(+), 25 deletions(-) diff --git a/src/com/android/settings/AirplaneModeEnabler.java b/src/com/android/settings/AirplaneModeEnabler.java index a843a046c98..6028c188d9f 100644 --- a/src/com/android/settings/AirplaneModeEnabler.java +++ b/src/com/android/settings/AirplaneModeEnabler.java @@ -19,6 +19,7 @@ package com.android.settings; import android.app.settings.SettingsEnums; import android.content.Context; import android.content.Intent; +import android.os.Looper; import android.os.UserHandle; import android.provider.Settings; import android.telephony.PhoneStateListener; @@ -62,8 +63,6 @@ public class AirplaneModeEnabler extends GlobalSettingsChangeListener { @VisibleForTesting PhoneStateListener mPhoneStateListener; - private GlobalSettingsChangeListener mAirplaneModeObserver; - public AirplaneModeEnabler(Context context, OnAirplaneModeChangedListener listener) { super(context, Settings.Global.AIRPLANE_MODE_ON); @@ -73,7 +72,7 @@ public class AirplaneModeEnabler extends GlobalSettingsChangeListener { mTelephonyManager = context.getSystemService(TelephonyManager.class); - mPhoneStateListener = new PhoneStateListener() { + mPhoneStateListener = new PhoneStateListener(Looper.getMainLooper()) { @Override public void onRadioPowerStateChanged(int state) { if (DEBUG) { @@ -87,6 +86,7 @@ public class AirplaneModeEnabler extends GlobalSettingsChangeListener { /** * Implementation of GlobalSettingsChangeListener.onChanged */ + @Override public void onChanged(String field) { if (DEBUG) { Log.d(LOG_TAG, "Airplane mode configuration update"); @@ -94,12 +94,18 @@ public class AirplaneModeEnabler extends GlobalSettingsChangeListener { onAirplaneModeChanged(); } - public void resume() { + /** + * Start listening to the phone state change + */ + public void start() { mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_RADIO_POWER_STATE_CHANGED); } - public void pause() { + /** + * Stop listening to the phone state change + */ + public void stop() { mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_NONE); } diff --git a/src/com/android/settings/network/AirplaneModePreferenceController.java b/src/com/android/settings/network/AirplaneModePreferenceController.java index e852b80e00d..122b9752ca8 100644 --- a/src/com/android/settings/network/AirplaneModePreferenceController.java +++ b/src/com/android/settings/network/AirplaneModePreferenceController.java @@ -35,11 +35,11 @@ import com.android.settings.AirplaneModeEnabler; import com.android.settings.R; import com.android.settings.core.TogglePreferenceController; import com.android.settingslib.core.lifecycle.LifecycleObserver; -import com.android.settingslib.core.lifecycle.events.OnPause; -import com.android.settingslib.core.lifecycle.events.OnResume; +import com.android.settingslib.core.lifecycle.events.OnStart; +import com.android.settingslib.core.lifecycle.events.OnStop; public class AirplaneModePreferenceController extends TogglePreferenceController - implements LifecycleObserver, OnResume, OnPause, + implements LifecycleObserver, OnStart, OnStop, AirplaneModeEnabler.OnAirplaneModeChangedListener { public static final int REQUEST_CODE_EXIT_ECM = 1; @@ -120,16 +120,16 @@ public class AirplaneModePreferenceController extends TogglePreferenceController } @Override - public void onResume() { + public void onStart() { if (isAvailable()) { - mAirplaneModeEnabler.resume(); + mAirplaneModeEnabler.start(); } } @Override - public void onPause() { + public void onStop() { if (isAvailable()) { - mAirplaneModeEnabler.pause(); + mAirplaneModeEnabler.stop(); } } diff --git a/src/com/android/settings/network/SubscriptionsChangeListener.java b/src/com/android/settings/network/SubscriptionsChangeListener.java index 1b50a54ba45..192ee53fdb9 100644 --- a/src/com/android/settings/network/SubscriptionsChangeListener.java +++ b/src/com/android/settings/network/SubscriptionsChangeListener.java @@ -23,6 +23,7 @@ import android.content.IntentFilter; import android.database.ContentObserver; import android.net.Uri; import android.os.Handler; +import android.os.Looper; import android.provider.Settings; import android.telephony.SubscriptionManager; import android.telephony.SubscriptionManager.OnSubscriptionsChangedListener; @@ -45,11 +46,11 @@ public class SubscriptionsChangeListener extends ContentObserver { private BroadcastReceiver mBroadcastReceiver; public SubscriptionsChangeListener(Context context, SubscriptionsChangeListenerClient client) { - super(new Handler()); + super(new Handler(Looper.getMainLooper())); mContext = context; mClient = client; mSubscriptionManager = mContext.getSystemService(SubscriptionManager.class); - mSubscriptionsChangedListener = new OnSubscriptionsChangedListener() { + mSubscriptionsChangedListener = new OnSubscriptionsChangedListener(Looper.getMainLooper()) { @Override public void onSubscriptionsChanged() { subscriptionsChangedCallback(); diff --git a/src/com/android/settings/network/telephony/Enhanced4gBasePreferenceController.java b/src/com/android/settings/network/telephony/Enhanced4gBasePreferenceController.java index d3fb437a36c..cbe0912f0e9 100644 --- a/src/com/android/settings/network/telephony/Enhanced4gBasePreferenceController.java +++ b/src/com/android/settings/network/telephony/Enhanced4gBasePreferenceController.java @@ -17,6 +17,7 @@ package com.android.settings.network.telephony; import android.content.Context; +import android.os.Looper; import android.os.PersistableBundle; import android.telephony.CarrierConfigManager; import android.telephony.PhoneStateListener; @@ -187,7 +188,7 @@ public class Enhanced4gBasePreferenceController extends TelephonyTogglePreferenc private class PhoneCallStateListener extends PhoneStateListener { PhoneCallStateListener() { - super(); + super(Looper.getMainLooper()); } private TelephonyManager mTelephonyManager; diff --git a/src/com/android/settings/network/telephony/VideoCallingPreferenceController.java b/src/com/android/settings/network/telephony/VideoCallingPreferenceController.java index eed40467c84..d235a9ac36a 100644 --- a/src/com/android/settings/network/telephony/VideoCallingPreferenceController.java +++ b/src/com/android/settings/network/telephony/VideoCallingPreferenceController.java @@ -17,6 +17,7 @@ package com.android.settings.network.telephony; import android.content.Context; +import android.os.Looper; import android.os.PersistableBundle; import android.telephony.CarrierConfigManager; import android.telephony.PhoneStateListener; @@ -164,7 +165,7 @@ public class VideoCallingPreferenceController extends TelephonyTogglePreferenceC private class PhoneCallStateListener extends PhoneStateListener { PhoneCallStateListener() { - super(); + super(Looper.getMainLooper()); } private TelephonyManager mTelephonyManager; diff --git a/src/com/android/settings/network/telephony/WifiCallingPreferenceController.java b/src/com/android/settings/network/telephony/WifiCallingPreferenceController.java index e928dba734c..bec8a51adda 100644 --- a/src/com/android/settings/network/telephony/WifiCallingPreferenceController.java +++ b/src/com/android/settings/network/telephony/WifiCallingPreferenceController.java @@ -20,6 +20,7 @@ import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; +import android.os.Looper; import android.os.PersistableBundle; import android.provider.Settings; import android.telecom.PhoneAccountHandle; @@ -194,7 +195,7 @@ public class WifiCallingPreferenceController extends TelephonyBasePreferenceCont private class PhoneCallStateListener extends PhoneStateListener { PhoneCallStateListener() { - super(); + super(Looper.getMainLooper()); } private TelephonyManager mTelephonyManager; diff --git a/src/com/android/settings/slices/SlicesIndexer.java b/src/com/android/settings/slices/SlicesIndexer.java index 3a68a322853..e527fd657ab 100644 --- a/src/com/android/settings/slices/SlicesIndexer.java +++ b/src/com/android/settings/slices/SlicesIndexer.java @@ -104,7 +104,10 @@ class SlicesIndexer implements Runnable { values.put(IndexColumns.SLICE_URI, dataRow.getUri().toSafeString()); values.put(IndexColumns.TITLE, dataRow.getTitle()); values.put(IndexColumns.SUMMARY, dataRow.getSummary()); - values.put(IndexColumns.SCREENTITLE, dataRow.getScreenTitle().toString()); + final CharSequence screenTitle = dataRow.getScreenTitle(); + if (screenTitle != null) { + values.put(IndexColumns.SCREENTITLE, screenTitle.toString()); + } values.put(IndexColumns.KEYWORDS, dataRow.getKeywords()); values.put(IndexColumns.ICON_RESOURCE, dataRow.getIconResource()); values.put(IndexColumns.FRAGMENT, dataRow.getFragmentClassName()); diff --git a/tests/robotests/src/com/android/settings/AirplaneModeEnablerTest.java b/tests/robotests/src/com/android/settings/AirplaneModeEnablerTest.java index 24abac9f258..6c5b9f2323f 100644 --- a/tests/robotests/src/com/android/settings/AirplaneModeEnablerTest.java +++ b/tests/robotests/src/com/android/settings/AirplaneModeEnablerTest.java @@ -53,7 +53,7 @@ public final class AirplaneModeEnablerTest { @Test public void onRadioPowerStateChanged_beenInvoke_invokeOnAirplaneModeChanged() { - mAirplaneModeEnabler.resume(); + mAirplaneModeEnabler.start(); ShadowSettings.setAirplaneMode(true); diff --git a/tests/robotests/src/com/android/settings/network/AirplaneModePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/network/AirplaneModePreferenceControllerTest.java index 54c36833d45..cb68e2a6aa9 100644 --- a/tests/robotests/src/com/android/settings/network/AirplaneModePreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/network/AirplaneModePreferenceControllerTest.java @@ -102,8 +102,8 @@ public class AirplaneModePreferenceControllerTest { mController.displayPreference(mScreen); // This should not crash - mController.onResume(); - mController.onPause(); + mController.onStart(); + mController.onStop(); } @Test @@ -115,8 +115,8 @@ public class AirplaneModePreferenceControllerTest { mController.displayPreference(mScreen); // This should not crash - mController.onResume(); - mController.onPause(); + mController.onStart(); + mController.onStop(); } @Test @@ -147,7 +147,7 @@ public class AirplaneModePreferenceControllerTest { Settings.Global.putInt(mResolver, Settings.Global.AIRPLANE_MODE_ON, ON); mController.displayPreference(mScreen); - mController.onResume(); + mController.onStart(); assertThat(mController.isChecked()).isTrue(); @@ -161,7 +161,7 @@ public class AirplaneModePreferenceControllerTest { Settings.Global.putInt(mResolver, Settings.Global.AIRPLANE_MODE_ON, OFF); mController.displayPreference(mScreen); - mController.onResume(); + mController.onStop(); assertThat(mPreference.isChecked()).isFalse();