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
This commit is contained in:
Jason Chiu
2020-04-09 14:29:58 +08:00
parent 4edb83b260
commit 1766b3c01d
9 changed files with 38 additions and 25 deletions

View File

@@ -19,6 +19,7 @@ package com.android.settings;
import android.app.settings.SettingsEnums; import android.app.settings.SettingsEnums;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.os.Looper;
import android.os.UserHandle; import android.os.UserHandle;
import android.provider.Settings; import android.provider.Settings;
import android.telephony.PhoneStateListener; import android.telephony.PhoneStateListener;
@@ -62,8 +63,6 @@ public class AirplaneModeEnabler extends GlobalSettingsChangeListener {
@VisibleForTesting @VisibleForTesting
PhoneStateListener mPhoneStateListener; PhoneStateListener mPhoneStateListener;
private GlobalSettingsChangeListener mAirplaneModeObserver;
public AirplaneModeEnabler(Context context, OnAirplaneModeChangedListener listener) { public AirplaneModeEnabler(Context context, OnAirplaneModeChangedListener listener) {
super(context, Settings.Global.AIRPLANE_MODE_ON); super(context, Settings.Global.AIRPLANE_MODE_ON);
@@ -73,7 +72,7 @@ public class AirplaneModeEnabler extends GlobalSettingsChangeListener {
mTelephonyManager = context.getSystemService(TelephonyManager.class); mTelephonyManager = context.getSystemService(TelephonyManager.class);
mPhoneStateListener = new PhoneStateListener() { mPhoneStateListener = new PhoneStateListener(Looper.getMainLooper()) {
@Override @Override
public void onRadioPowerStateChanged(int state) { public void onRadioPowerStateChanged(int state) {
if (DEBUG) { if (DEBUG) {
@@ -87,6 +86,7 @@ public class AirplaneModeEnabler extends GlobalSettingsChangeListener {
/** /**
* Implementation of GlobalSettingsChangeListener.onChanged * Implementation of GlobalSettingsChangeListener.onChanged
*/ */
@Override
public void onChanged(String field) { public void onChanged(String field) {
if (DEBUG) { if (DEBUG) {
Log.d(LOG_TAG, "Airplane mode configuration update"); Log.d(LOG_TAG, "Airplane mode configuration update");
@@ -94,12 +94,18 @@ public class AirplaneModeEnabler extends GlobalSettingsChangeListener {
onAirplaneModeChanged(); onAirplaneModeChanged();
} }
public void resume() { /**
* Start listening to the phone state change
*/
public void start() {
mTelephonyManager.listen(mPhoneStateListener, mTelephonyManager.listen(mPhoneStateListener,
PhoneStateListener.LISTEN_RADIO_POWER_STATE_CHANGED); PhoneStateListener.LISTEN_RADIO_POWER_STATE_CHANGED);
} }
public void pause() { /**
* Stop listening to the phone state change
*/
public void stop() {
mTelephonyManager.listen(mPhoneStateListener, mTelephonyManager.listen(mPhoneStateListener,
PhoneStateListener.LISTEN_NONE); PhoneStateListener.LISTEN_NONE);
} }

View File

@@ -35,11 +35,11 @@ import com.android.settings.AirplaneModeEnabler;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.core.TogglePreferenceController; import com.android.settings.core.TogglePreferenceController;
import com.android.settingslib.core.lifecycle.LifecycleObserver; import com.android.settingslib.core.lifecycle.LifecycleObserver;
import com.android.settingslib.core.lifecycle.events.OnPause; import com.android.settingslib.core.lifecycle.events.OnStart;
import com.android.settingslib.core.lifecycle.events.OnResume; import com.android.settingslib.core.lifecycle.events.OnStop;
public class AirplaneModePreferenceController extends TogglePreferenceController public class AirplaneModePreferenceController extends TogglePreferenceController
implements LifecycleObserver, OnResume, OnPause, implements LifecycleObserver, OnStart, OnStop,
AirplaneModeEnabler.OnAirplaneModeChangedListener { AirplaneModeEnabler.OnAirplaneModeChangedListener {
public static final int REQUEST_CODE_EXIT_ECM = 1; public static final int REQUEST_CODE_EXIT_ECM = 1;
@@ -120,16 +120,16 @@ public class AirplaneModePreferenceController extends TogglePreferenceController
} }
@Override @Override
public void onResume() { public void onStart() {
if (isAvailable()) { if (isAvailable()) {
mAirplaneModeEnabler.resume(); mAirplaneModeEnabler.start();
} }
} }
@Override @Override
public void onPause() { public void onStop() {
if (isAvailable()) { if (isAvailable()) {
mAirplaneModeEnabler.pause(); mAirplaneModeEnabler.stop();
} }
} }

View File

@@ -23,6 +23,7 @@ import android.content.IntentFilter;
import android.database.ContentObserver; import android.database.ContentObserver;
import android.net.Uri; import android.net.Uri;
import android.os.Handler; import android.os.Handler;
import android.os.Looper;
import android.provider.Settings; import android.provider.Settings;
import android.telephony.SubscriptionManager; import android.telephony.SubscriptionManager;
import android.telephony.SubscriptionManager.OnSubscriptionsChangedListener; import android.telephony.SubscriptionManager.OnSubscriptionsChangedListener;
@@ -45,11 +46,11 @@ public class SubscriptionsChangeListener extends ContentObserver {
private BroadcastReceiver mBroadcastReceiver; private BroadcastReceiver mBroadcastReceiver;
public SubscriptionsChangeListener(Context context, SubscriptionsChangeListenerClient client) { public SubscriptionsChangeListener(Context context, SubscriptionsChangeListenerClient client) {
super(new Handler()); super(new Handler(Looper.getMainLooper()));
mContext = context; mContext = context;
mClient = client; mClient = client;
mSubscriptionManager = mContext.getSystemService(SubscriptionManager.class); mSubscriptionManager = mContext.getSystemService(SubscriptionManager.class);
mSubscriptionsChangedListener = new OnSubscriptionsChangedListener() { mSubscriptionsChangedListener = new OnSubscriptionsChangedListener(Looper.getMainLooper()) {
@Override @Override
public void onSubscriptionsChanged() { public void onSubscriptionsChanged() {
subscriptionsChangedCallback(); subscriptionsChangedCallback();

View File

@@ -17,6 +17,7 @@
package com.android.settings.network.telephony; package com.android.settings.network.telephony;
import android.content.Context; import android.content.Context;
import android.os.Looper;
import android.os.PersistableBundle; import android.os.PersistableBundle;
import android.telephony.CarrierConfigManager; import android.telephony.CarrierConfigManager;
import android.telephony.PhoneStateListener; import android.telephony.PhoneStateListener;
@@ -187,7 +188,7 @@ public class Enhanced4gBasePreferenceController extends TelephonyTogglePreferenc
private class PhoneCallStateListener extends PhoneStateListener { private class PhoneCallStateListener extends PhoneStateListener {
PhoneCallStateListener() { PhoneCallStateListener() {
super(); super(Looper.getMainLooper());
} }
private TelephonyManager mTelephonyManager; private TelephonyManager mTelephonyManager;

View File

@@ -17,6 +17,7 @@
package com.android.settings.network.telephony; package com.android.settings.network.telephony;
import android.content.Context; import android.content.Context;
import android.os.Looper;
import android.os.PersistableBundle; import android.os.PersistableBundle;
import android.telephony.CarrierConfigManager; import android.telephony.CarrierConfigManager;
import android.telephony.PhoneStateListener; import android.telephony.PhoneStateListener;
@@ -164,7 +165,7 @@ public class VideoCallingPreferenceController extends TelephonyTogglePreferenceC
private class PhoneCallStateListener extends PhoneStateListener { private class PhoneCallStateListener extends PhoneStateListener {
PhoneCallStateListener() { PhoneCallStateListener() {
super(); super(Looper.getMainLooper());
} }
private TelephonyManager mTelephonyManager; private TelephonyManager mTelephonyManager;

View File

@@ -20,6 +20,7 @@ import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo; import android.content.pm.ResolveInfo;
import android.os.Looper;
import android.os.PersistableBundle; import android.os.PersistableBundle;
import android.provider.Settings; import android.provider.Settings;
import android.telecom.PhoneAccountHandle; import android.telecom.PhoneAccountHandle;
@@ -194,7 +195,7 @@ public class WifiCallingPreferenceController extends TelephonyBasePreferenceCont
private class PhoneCallStateListener extends PhoneStateListener { private class PhoneCallStateListener extends PhoneStateListener {
PhoneCallStateListener() { PhoneCallStateListener() {
super(); super(Looper.getMainLooper());
} }
private TelephonyManager mTelephonyManager; private TelephonyManager mTelephonyManager;

View File

@@ -104,7 +104,10 @@ class SlicesIndexer implements Runnable {
values.put(IndexColumns.SLICE_URI, dataRow.getUri().toSafeString()); values.put(IndexColumns.SLICE_URI, dataRow.getUri().toSafeString());
values.put(IndexColumns.TITLE, dataRow.getTitle()); values.put(IndexColumns.TITLE, dataRow.getTitle());
values.put(IndexColumns.SUMMARY, dataRow.getSummary()); 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.KEYWORDS, dataRow.getKeywords());
values.put(IndexColumns.ICON_RESOURCE, dataRow.getIconResource()); values.put(IndexColumns.ICON_RESOURCE, dataRow.getIconResource());
values.put(IndexColumns.FRAGMENT, dataRow.getFragmentClassName()); values.put(IndexColumns.FRAGMENT, dataRow.getFragmentClassName());

View File

@@ -53,7 +53,7 @@ public final class AirplaneModeEnablerTest {
@Test @Test
public void onRadioPowerStateChanged_beenInvoke_invokeOnAirplaneModeChanged() { public void onRadioPowerStateChanged_beenInvoke_invokeOnAirplaneModeChanged() {
mAirplaneModeEnabler.resume(); mAirplaneModeEnabler.start();
ShadowSettings.setAirplaneMode(true); ShadowSettings.setAirplaneMode(true);

View File

@@ -102,8 +102,8 @@ public class AirplaneModePreferenceControllerTest {
mController.displayPreference(mScreen); mController.displayPreference(mScreen);
// This should not crash // This should not crash
mController.onResume(); mController.onStart();
mController.onPause(); mController.onStop();
} }
@Test @Test
@@ -115,8 +115,8 @@ public class AirplaneModePreferenceControllerTest {
mController.displayPreference(mScreen); mController.displayPreference(mScreen);
// This should not crash // This should not crash
mController.onResume(); mController.onStart();
mController.onPause(); mController.onStop();
} }
@Test @Test
@@ -147,7 +147,7 @@ public class AirplaneModePreferenceControllerTest {
Settings.Global.putInt(mResolver, Settings.Global.AIRPLANE_MODE_ON, ON); Settings.Global.putInt(mResolver, Settings.Global.AIRPLANE_MODE_ON, ON);
mController.displayPreference(mScreen); mController.displayPreference(mScreen);
mController.onResume(); mController.onStart();
assertThat(mController.isChecked()).isTrue(); assertThat(mController.isChecked()).isTrue();
@@ -161,7 +161,7 @@ public class AirplaneModePreferenceControllerTest {
Settings.Global.putInt(mResolver, Settings.Global.AIRPLANE_MODE_ON, OFF); Settings.Global.putInt(mResolver, Settings.Global.AIRPLANE_MODE_ON, OFF);
mController.displayPreference(mScreen); mController.displayPreference(mScreen);
mController.onResume(); mController.onStop();
assertThat(mPreference.isChecked()).isFalse(); assertThat(mPreference.isChecked()).isFalse();