Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9dc5f808 authored by Fabrice Di Meglio's avatar Fabrice Di Meglio
Browse files

Fix bug #16958103 android.content.res.Resources$NotFoundException: String resource ID #0x7f080971

- remove the indexing offending part from InputMethodAndLanguageSettings as the strings
has been changed
- add indexing for VoiceInputSettings

Change-Id: Ib8da55c935e00538ad6fff2f2590b0d525140734
parent aea9ae00
Loading
Loading
Loading
Loading
+8 −40
Original line number Diff line number Diff line
@@ -673,8 +673,8 @@ public class InputMethodAndLanguageSettings extends SettingsPreferenceFragment
        public List<SearchIndexableRaw> getRawDataToIndex(Context context, boolean enabled) {
            List<SearchIndexableRaw> indexables = new ArrayList<>();

            Resources resources = context.getResources();
            String screenTitle = context.getString(R.string.language_keyboard_settings_title);
            final Resources resources = context.getResources();
            final String screenTitle = context.getString(R.string.language_keyboard_settings_title);

            // Locale picker.
            if (context.getAssets().getLocales().length > 1) {
@@ -836,44 +836,12 @@ public class InputMethodAndLanguageSettings extends SettingsPreferenceFragment
                indexables.add(indexable);
            }

            // Voice recognizers.
            List<ResolveInfo> recognizers = context.getPackageManager()
                    .queryIntentServices(new Intent(RecognitionService.SERVICE_INTERFACE),
                            PackageManager.GET_META_DATA);

            final int recognizerCount = recognizers.size();

            // Recognizer settings.
            if (recognizerCount > 0) {
                indexable = new SearchIndexableRaw(context);
                indexable.key = "recognizer_settings";
                indexable.title = context.getString(R.string.recognizer_settings_title);
                indexable.screenTitle = screenTitle;
                indexables.add(indexable);
            }

            if (recognizerCount > 1) {
                // Recognizer chooser.
                indexable = new SearchIndexableRaw(context);
                indexable.key = "recognizer_title";
                indexable.title = context.getString(R.string.recognizer_title);
                indexable.screenTitle = screenTitle;
                indexables.add(indexable);
            }

            for (int i = 0; i < recognizerCount; i++) {
                ResolveInfo recognizer = recognizers.get(i);

                ServiceInfo serviceInfo = recognizer.serviceInfo;
                ComponentName componentName = new ComponentName(serviceInfo.packageName,
                        serviceInfo.name);

            // Voice input
            indexable = new SearchIndexableRaw(context);
                indexable.key = componentName.flattenToString();
                indexable.title = recognizer.loadLabel(context.getPackageManager()).toString();
            indexable.key = "voice_input_settings";
            indexable.title = context.getString(R.string.voice_input_settings);
            indexable.screenTitle = screenTitle;
            indexables.add(indexable);
            }

            // Text-to-speech.
            TtsEngines ttsEngines = new TtsEngines(context);
+2 −0
Original line number Diff line number Diff line
@@ -43,6 +43,7 @@ import com.android.settings.notification.ZenModeSettings;
import com.android.settings.print.PrintSettingsFragment;
import com.android.settings.sim.SimSettings;
import com.android.settings.users.UserSettings;
import com.android.settings.voice.VoiceInputSettings;
import com.android.settings.wifi.AdvancedWifiSettings;
import com.android.settings.wifi.SavedAccessPointsWifiSettings;
import com.android.settings.wifi.WifiSettings;
@@ -139,6 +140,7 @@ public final class Ranking {

        // IMEs
        sRankMap.put(InputMethodAndLanguageSettings.class.getName(), RANK_IME);
        sRankMap.put(VoiceInputSettings.class.getName(), RANK_IME);

        // Privacy
        sRankMap.put(PrivacySettings.class.getName(), RANK_PRIVACY);
+8 −0
Original line number Diff line number Diff line
@@ -46,6 +46,7 @@ import com.android.settings.notification.ZenModeSettings;
import com.android.settings.print.PrintSettingsFragment;
import com.android.settings.sim.SimSettings;
import com.android.settings.users.UserSettings;
import com.android.settings.voice.VoiceInputSettings;
import com.android.settings.wifi.AdvancedWifiSettings;
import com.android.settings.wifi.SavedAccessPointsWifiSettings;
import com.android.settings.wifi.WifiSettings;
@@ -230,6 +231,13 @@ public final class SearchIndexableResources {
                        InputMethodAndLanguageSettings.class.getName(),
                        R.drawable.ic_settings_language));

        sResMap.put(VoiceInputSettings.class.getName(),
                new SearchIndexableResource(
                        Ranking.getRankForClassName(VoiceInputSettings.class.getName()),
                        NO_DATA_RES_ID,
                        VoiceInputSettings.class.getName(),
                        R.drawable.ic_settings_language));

        sResMap.put(PrivacySettings.class.getName(),
                new SearchIndexableResource(
                        Ranking.getRankForClassName(PrivacySettings.class.getName()),
+80 −1
Original line number Diff line number Diff line
@@ -16,18 +16,33 @@

package com.android.settings.voice;

import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.content.pm.ServiceInfo;
import android.preference.Preference;
import android.provider.Settings;
import android.service.voice.VoiceInteractionService;
import android.service.voice.VoiceInteractionServiceInfo;
import android.speech.RecognitionService;
import com.android.settings.R;
import com.android.settings.SettingsPreferenceFragment;
import com.android.settings.search.BaseSearchIndexProvider;
import com.android.settings.search.Indexable;
import com.android.settings.search.SearchIndexableRaw;
import com.android.settings.voice.VoiceInputPreference.RadioButtonGroupState;

import android.os.Bundle;
import android.preference.PreferenceCategory;
import android.widget.Checkable;

import java.util.ArrayList;
import java.util.List;

public class VoiceInputSettings extends SettingsPreferenceFragment implements
        Preference.OnPreferenceClickListener, RadioButtonGroupState {
        Preference.OnPreferenceClickListener, RadioButtonGroupState, Indexable {

    private static final String TAG = "VoiceInputSettings";
    private static final boolean DBG = false;
@@ -160,4 +175,68 @@ public class VoiceInputSettings extends SettingsPreferenceFragment implements
        }
        return true;
    }

    // For Search
    public static final Indexable.SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
        new BaseSearchIndexProvider() {

            @Override
            public List<SearchIndexableRaw> getRawDataToIndex(Context context,
                    boolean enabled) {

                List<SearchIndexableRaw> indexables = new ArrayList<>();

                final String screenTitle = context.getString(R.string.voice_input_settings_title);

                SearchIndexableRaw indexable = new SearchIndexableRaw(context);
                indexable.key = "voice_service_preference_section_title";
                indexable.title = context.getString(R.string.voice_service_preference_section_title);
                indexable.screenTitle = screenTitle;
                indexables.add(indexable);

                final List<ResolveInfo> voiceInteractions =
                        context.getPackageManager().queryIntentServices(
                                new Intent(VoiceInteractionService.SERVICE_INTERFACE),
                                PackageManager.GET_META_DATA);

                final int countInteractions = voiceInteractions.size();
                for (int i = 0; i < countInteractions; i++) {
                    ResolveInfo info = voiceInteractions.get(i);
                    VoiceInteractionServiceInfo visInfo = new VoiceInteractionServiceInfo(
                            context.getPackageManager(), info.serviceInfo);
                    if (visInfo.getParseError() != null) {
                        continue;
                    }
                    indexables.add(getSearchIndexableRaw(context, info, screenTitle));
                }

                final List<ResolveInfo> recognitions =
                        context.getPackageManager().queryIntentServices(
                                new Intent(RecognitionService.SERVICE_INTERFACE),
                                PackageManager.GET_META_DATA);

                final int countRecognitions = recognitions.size();
                for (int i = 0; i < countRecognitions; i++) {
                    ResolveInfo info = recognitions.get(i);
                    indexables.add(getSearchIndexableRaw(context, info, screenTitle));
                }

                return indexables;
            }

            private SearchIndexableRaw getSearchIndexableRaw(Context context,
                    ResolveInfo info, String screenTitle) {

                ServiceInfo serviceInfo = info.serviceInfo;
                ComponentName componentName = new ComponentName(serviceInfo.packageName,
                        serviceInfo.name);

                SearchIndexableRaw indexable = new SearchIndexableRaw(context);
                indexable.key = componentName.flattenToString();
                indexable.title = info.loadLabel(context.getPackageManager()).toString();
                indexable.screenTitle = screenTitle;

                return indexable;
            }
        };
}