Prevent crash in Search from Stack overflow

NotificationSettingBase's getPreferenceController call
is recursive with no base case which crashes search.

Root cause here is that NotificationSettingsBase should
not be indexed for seacrh but was probably failing the
code inspection test. Added NotificationSettingsBase
child classes to grandfather list of classes that
should be ignored for search.

Change-Id: I04ed242db3a394b88e0d0ac420aaaff6f9301cb5
Fixes: 69096424
Test: robotests
This commit is contained in:
Matthew Fritze
2017-11-09 09:40:09 -08:00
parent d0965a21e4
commit f6cf598d03
5 changed files with 20 additions and 48 deletions

View File

@@ -163,15 +163,4 @@ public class ChannelImportanceSettings extends NotificationSettingsBase
mChannel.lockFields(USER_LOCKED_IMPORTANCE); mChannel.lockFields(USER_LOCKED_IMPORTANCE);
mBackend.updateChannel(mAppRow.pkg, mAppRow.uid, mChannel); mBackend.updateChannel(mAppRow.pkg, mAppRow.uid, mChannel);
} }
// This page exists per notification channel; should not be included
// in search
public static final SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
new BaseSearchIndexProvider() {
@Override
public List<SearchIndexableResource> getXmlResourcesToIndex(
Context context, boolean enabled) {
return null;
}
};
} }

View File

@@ -208,15 +208,19 @@ abstract public class NotificationSettingsBase extends DashboardFragment {
intent, intent,
0 //PackageManager.MATCH_DEFAULT_ONLY 0 //PackageManager.MATCH_DEFAULT_ONLY
); );
if (DEBUG) Log.d(TAG, "Found " + resolveInfos.size() + " preference activities" if (DEBUG) {
Log.d(TAG, "Found " + resolveInfos.size() + " preference activities"
+ (resolveInfos.size() == 0 ? " ;_;" : "")); + (resolveInfos.size() == 0 ? " ;_;" : ""));
}
for (ResolveInfo ri : resolveInfos) { for (ResolveInfo ri : resolveInfos) {
final ActivityInfo activityInfo = ri.activityInfo; final ActivityInfo activityInfo = ri.activityInfo;
final ApplicationInfo appInfo = activityInfo.applicationInfo; final ApplicationInfo appInfo = activityInfo.applicationInfo;
if (mAppRow.settingsIntent != null) { if (mAppRow.settingsIntent != null) {
if (DEBUG) Log.v(TAG, "Ignoring duplicate notification preference activity (" if (DEBUG) {
Log.d(TAG, "Ignoring duplicate notification preference activity ("
+ activityInfo.name + ") for package " + activityInfo.name + ") for package "
+ activityInfo.packageName); + activityInfo.packageName);
}
continue; continue;
} }
mAppRow.settingsIntent = intent mAppRow.settingsIntent = intent
@@ -365,8 +369,10 @@ abstract public class NotificationSettingsBase extends DashboardFragment {
public void onReceive(Context context, Intent intent) { public void onReceive(Context context, Intent intent) {
String packageName = intent.getData().getSchemeSpecificPart(); String packageName = intent.getData().getSchemeSpecificPart();
if (mPkgInfo == null || TextUtils.equals(mPkgInfo.packageName, packageName)) { if (mPkgInfo == null || TextUtils.equals(mPkgInfo.packageName, packageName)) {
if (DEBUG) Log.d(TAG, "Package (" + packageName + ") removed. Removing" if (DEBUG) {
Log.d(TAG, "Package (" + packageName + ") removed. Removing"
+ "NotificationSettingsBase."); + "NotificationSettingsBase.");
}
onPackageRemoved(); onPackageRemoved();
} }
} }
@@ -380,24 +386,6 @@ abstract public class NotificationSettingsBase extends DashboardFragment {
return left.getId().compareTo(right.getId()); return left.getId().compareTo(right.getId());
}; };
/**
* These screens aren't searchable - they only make sense in the context of an app, so
* surfacing a generic version would be impossible.
*/
public static final Indexable.SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
new BaseSearchIndexProvider() {
@Override
public List<SearchIndexableResource> getXmlResourcesToIndex(Context context,
boolean enabled) {
return new ArrayList<>();
}
@Override
public List<AbstractPreferenceController> getPreferenceControllers(Context context) {
return getPreferenceControllers(context);
}
};
protected class ImportanceListener { protected class ImportanceListener {
protected void onImportanceChanged() { protected void onImportanceChanged() {
final PreferenceScreen screen = getPreferenceScreen(); final PreferenceScreen screen = getPreferenceScreen();

View File

@@ -64,10 +64,6 @@ import com.android.settings.location.LocationSettings;
import com.android.settings.location.ScanningSettings; import com.android.settings.location.ScanningSettings;
import com.android.settings.network.NetworkDashboardFragment; import com.android.settings.network.NetworkDashboardFragment;
import com.android.settings.nfc.PaymentSettings; import com.android.settings.nfc.PaymentSettings;
import com.android.settings.notification.AppNotificationSettings;
import com.android.settings.notification.ChannelGroupNotificationSettings;
import com.android.settings.notification.ChannelImportanceSettings;
import com.android.settings.notification.ChannelNotificationSettings;
import com.android.settings.notification.ConfigureNotificationSettings; import com.android.settings.notification.ConfigureNotificationSettings;
import com.android.settings.notification.SoundSettings; import com.android.settings.notification.SoundSettings;
import com.android.settings.notification.ZenModeAutomationSettings; import com.android.settings.notification.ZenModeAutomationSettings;
@@ -161,7 +157,6 @@ public final class SearchIndexableResources {
addIndex(TtsEnginePreferenceFragment.class); addIndex(TtsEnginePreferenceFragment.class);
addIndex(MagnificationPreferenceFragment.class); addIndex(MagnificationPreferenceFragment.class);
addIndex(AccessibilityShortcutPreferenceFragment.class); addIndex(AccessibilityShortcutPreferenceFragment.class);
addIndex(ChannelImportanceSettings.class);
addIndex(DreamSettings.class); addIndex(DreamSettings.class);
addIndex(SupportDashboardActivity.class); addIndex(SupportDashboardActivity.class);
addIndex(AutomaticStorageManagerSettings.class); addIndex(AutomaticStorageManagerSettings.class);
@@ -171,10 +166,6 @@ public final class SearchIndexableResources {
addIndex(LockscreenDashboardFragment.class); addIndex(LockscreenDashboardFragment.class);
addIndex(ZenModeBehaviorSettings.class); addIndex(ZenModeBehaviorSettings.class);
addIndex(ZenModeAutomationSettings.class); addIndex(ZenModeAutomationSettings.class);
addIndex(AppNotificationSettings.class);
addIndex(ChannelNotificationSettings.class);
addIndex(ChannelImportanceSettings.class);
addIndex(ChannelGroupNotificationSettings.class);
} }
private SearchIndexableResources() { private SearchIndexableResources() {

View File

@@ -7,6 +7,10 @@ com.android.settings.fuelgauge.AdvancedPowerUsageDetail
com.android.settings.development.featureflags.FeatureFlagsDashboard com.android.settings.development.featureflags.FeatureFlagsDashboard
com.android.settings.development.qstile.DevelopmentTileConfigFragment com.android.settings.development.qstile.DevelopmentTileConfigFragment
com.android.settings.deviceinfo.StorageProfileFragment com.android.settings.deviceinfo.StorageProfileFragment
com.android.settings.notification.ChannelNotificationSettings
com.android.settings.notification.ChannelImportanceSettings
com.android.settings.notification.ChannelGroupNotificationSettings
com.android.settings.notification.AppNotificationSettings
com.android.settings.wifi.details.WifiNetworkDetailsFragment com.android.settings.wifi.details.WifiNetworkDetailsFragment
com.android.settings.wifi.p2p.WifiP2pSettings com.android.settings.wifi.p2p.WifiP2pSettings
com.android.settings.enterprise.ApplicationListFragment$AdminGrantedPermissionCamera com.android.settings.enterprise.ApplicationListFragment$AdminGrantedPermissionCamera