13b70b0fc25958c7e4c7cfc983fea51affac15179Mihai Nita/*
21808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita * Copyright (C) 2016 The Android Open Source Project
33b70b0fc25958c7e4c7cfc983fea51affac15179Mihai Nita *
43b70b0fc25958c7e4c7cfc983fea51affac15179Mihai Nita * Licensed under the Apache License, Version 2.0 (the "License");
53b70b0fc25958c7e4c7cfc983fea51affac15179Mihai Nita * you may not use this file except in compliance with the License.
63b70b0fc25958c7e4c7cfc983fea51affac15179Mihai Nita * You may obtain a copy of the License at
73b70b0fc25958c7e4c7cfc983fea51affac15179Mihai Nita *
83b70b0fc25958c7e4c7cfc983fea51affac15179Mihai Nita *      http://www.apache.org/licenses/LICENSE-2.0
93b70b0fc25958c7e4c7cfc983fea51affac15179Mihai Nita *
103b70b0fc25958c7e4c7cfc983fea51affac15179Mihai Nita * Unless required by applicable law or agreed to in writing, software
113b70b0fc25958c7e4c7cfc983fea51affac15179Mihai Nita * distributed under the License is distributed on an "AS IS" BASIS,
123b70b0fc25958c7e4c7cfc983fea51affac15179Mihai Nita * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
133b70b0fc25958c7e4c7cfc983fea51affac15179Mihai Nita * See the License for the specific language governing permissions and
143b70b0fc25958c7e4c7cfc983fea51affac15179Mihai Nita * limitations under the License.
153b70b0fc25958c7e4c7cfc983fea51affac15179Mihai Nita */
163b70b0fc25958c7e4c7cfc983fea51affac15179Mihai Nita
173b70b0fc25958c7e4c7cfc983fea51affac15179Mihai Nitapackage com.android.internal.app;
183b70b0fc25958c7e4c7cfc983fea51affac15179Mihai Nita
191808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nitaimport android.app.FragmentManager;
201808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nitaimport android.app.FragmentTransaction;
213b70b0fc25958c7e4c7cfc983fea51affac15179Mihai Nitaimport android.app.ListFragment;
223b70b0fc25958c7e4c7cfc983fea51affac15179Mihai Nitaimport android.content.Context;
233b70b0fc25958c7e4c7cfc983fea51affac15179Mihai Nitaimport android.os.Bundle;
2423cbe85610f780134cc77dd4a54732a22ed6e86eYohei Yukawaimport android.os.LocaleList;
25c743e0fd97a2e380e8840bb88c8364cbfa234cc6Mihai Nitaimport android.text.TextUtils;
261808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nitaimport android.view.Menu;
271808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nitaimport android.view.MenuInflater;
281808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nitaimport android.view.MenuItem;
293b70b0fc25958c7e4c7cfc983fea51affac15179Mihai Nitaimport android.view.View;
303b70b0fc25958c7e4c7cfc983fea51affac15179Mihai Nitaimport android.widget.ListView;
311808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nitaimport android.widget.SearchView;
321808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita
331808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nitaimport com.android.internal.R;
343b70b0fc25958c7e4c7cfc983fea51affac15179Mihai Nita
353b70b0fc25958c7e4c7cfc983fea51affac15179Mihai Nitaimport java.util.Collections;
363b70b0fc25958c7e4c7cfc983fea51affac15179Mihai Nitaimport java.util.HashSet;
373b70b0fc25958c7e4c7cfc983fea51affac15179Mihai Nitaimport java.util.Locale;
381808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nitaimport java.util.Set;
393b70b0fc25958c7e4c7cfc983fea51affac15179Mihai Nita
401808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita/**
411808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita * A two-step locale picker. It shows a language, then a country.
421808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita *
431808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita * <p>It shows suggestions at the top, then the rest of the locales.
441808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita * Allows the user to search for locales using both their native name and their name in the
451808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita * default locale.</p>
461808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita */
471808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nitapublic class LocalePickerWithRegion extends ListFragment implements SearchView.OnQueryTextListener {
481711d430cb4c4eee11c00c15193242127c4a68f3Mihai Nita    private static final String PARENT_FRAGMENT_NAME = "localeListEditor";
493b70b0fc25958c7e4c7cfc983fea51affac15179Mihai Nita
501808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita    private SuggestedLocaleAdapter mAdapter;
511808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita    private LocaleSelectedListener mListener;
521808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita    private Set<LocaleStore.LocaleInfo> mLocaleList;
531808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita    private LocaleStore.LocaleInfo mParentLocale;
541808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita    private boolean mTranslatedOnly = false;
55c743e0fd97a2e380e8840bb88c8364cbfa234cc6Mihai Nita    private SearchView mSearchView = null;
56c743e0fd97a2e380e8840bb88c8364cbfa234cc6Mihai Nita    private CharSequence mPreviousSearch = null;
57c743e0fd97a2e380e8840bb88c8364cbfa234cc6Mihai Nita    private boolean mPreviousSearchHadFocus = false;
58c743e0fd97a2e380e8840bb88c8364cbfa234cc6Mihai Nita    private int mFirstVisiblePosition = 0;
59c743e0fd97a2e380e8840bb88c8364cbfa234cc6Mihai Nita    private int mTopDistance = 0;
603b70b0fc25958c7e4c7cfc983fea51affac15179Mihai Nita
611808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita    /**
621808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita     * Other classes can register to be notified when a locale was selected.
631808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita     *
641808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita     * <p>This is the mechanism to "return" the result of the selection.</p>
651808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita     */
661808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita    public interface LocaleSelectedListener {
671808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita        /**
681808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita         * The classes that want to retrieve the locale picked should implement this method.
691808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita         * @param locale    the locale picked.
701808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita         */
711808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita        void onLocaleSelected(LocaleStore.LocaleInfo locale);
723b70b0fc25958c7e4c7cfc983fea51affac15179Mihai Nita    }
733b70b0fc25958c7e4c7cfc983fea51affac15179Mihai Nita
741808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita    private static LocalePickerWithRegion createCountryPicker(Context context,
751808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita            LocaleSelectedListener listener, LocaleStore.LocaleInfo parent,
761808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita            boolean translatedOnly) {
771808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita        LocalePickerWithRegion localePicker = new LocalePickerWithRegion();
781808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita        boolean shouldShowTheList = localePicker.setListener(context, listener, parent,
79f1f39cf1936df2d28133e43390f72f3dbb40ffc8Mihai Nita                translatedOnly);
801808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita        return shouldShowTheList ? localePicker : null;
813b70b0fc25958c7e4c7cfc983fea51affac15179Mihai Nita    }
823b70b0fc25958c7e4c7cfc983fea51affac15179Mihai Nita
831808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita    public static LocalePickerWithRegion createLanguagePicker(Context context,
841808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita            LocaleSelectedListener listener, boolean translatedOnly) {
851808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita        LocalePickerWithRegion localePicker = new LocalePickerWithRegion();
86f1f39cf1936df2d28133e43390f72f3dbb40ffc8Mihai Nita        localePicker.setListener(context, listener, /* parent */ null, translatedOnly);
871808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita        return localePicker;
883b70b0fc25958c7e4c7cfc983fea51affac15179Mihai Nita    }
893b70b0fc25958c7e4c7cfc983fea51affac15179Mihai Nita
901808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita    /**
911808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita     * Sets the listener and initializes the locale list.
921808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita     *
931808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita     * <p>Returns true if we need to show the list, false if not.</p>
941808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita     *
951808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita     * <p>Can return false because of an error, trying to show a list of countries,
961808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita     * but no parent locale was provided.</p>
971808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita     *
981808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita     * <p>It can also return false if the caller tries to show the list in country mode and
991808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita     * there is only one country available (i.e. Japanese => Japan).
1001808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita     * In this case we don't even show the list, we call the listener with that locale,
1011808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita     * "pretending" it was selected, and return false.</p>
1021808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita     */
1031808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita    private boolean setListener(Context context, LocaleSelectedListener listener,
104f1f39cf1936df2d28133e43390f72f3dbb40ffc8Mihai Nita            LocaleStore.LocaleInfo parent, boolean translatedOnly) {
1051808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita        this.mParentLocale = parent;
1061808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita        this.mListener = listener;
1071808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita        this.mTranslatedOnly = translatedOnly;
1081808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita        setRetainInstance(true);
1091808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita
1101808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita        final HashSet<String> langTagsToIgnore = new HashSet<>();
1111808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita        if (!translatedOnly) {
1121808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita            final LocaleList userLocales = LocalePicker.getLocales();
1131808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita            final String[] langTags = userLocales.toLanguageTags().split(",");
1141808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita            Collections.addAll(langTagsToIgnore, langTags);
1151808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita        }
1163b70b0fc25958c7e4c7cfc983fea51affac15179Mihai Nita
117f1f39cf1936df2d28133e43390f72f3dbb40ffc8Mihai Nita        if (parent != null) {
1181808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita            mLocaleList = LocaleStore.getLevelLocales(context,
1191808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita                    langTagsToIgnore, parent, translatedOnly);
1201808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita            if (mLocaleList.size() <= 1) {
1211808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita                if (listener != null && (mLocaleList.size() == 1)) {
1221808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita                    listener.onLocaleSelected(mLocaleList.iterator().next());
1231808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita                }
1241808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita                return false;
1253b70b0fc25958c7e4c7cfc983fea51affac15179Mihai Nita            }
1261808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita        } else {
1271808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita            mLocaleList = LocaleStore.getLevelLocales(context, langTagsToIgnore,
1281808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita                    null /* no parent */, translatedOnly);
1293b70b0fc25958c7e4c7cfc983fea51affac15179Mihai Nita        }
1303b70b0fc25958c7e4c7cfc983fea51affac15179Mihai Nita
1311808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita        return true;
1323b70b0fc25958c7e4c7cfc983fea51affac15179Mihai Nita    }
1333b70b0fc25958c7e4c7cfc983fea51affac15179Mihai Nita
1341711d430cb4c4eee11c00c15193242127c4a68f3Mihai Nita    private void returnToParentFrame() {
1351711d430cb4c4eee11c00c15193242127c4a68f3Mihai Nita        getFragmentManager().popBackStack(PARENT_FRAGMENT_NAME,
1361711d430cb4c4eee11c00c15193242127c4a68f3Mihai Nita                FragmentManager.POP_BACK_STACK_INCLUSIVE);
1371711d430cb4c4eee11c00c15193242127c4a68f3Mihai Nita    }
1381711d430cb4c4eee11c00c15193242127c4a68f3Mihai Nita
1391808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita    @Override
1401808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita    public void onCreate(Bundle savedInstanceState) {
1411808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita        super.onCreate(savedInstanceState);
1421808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita        setHasOptionsMenu(true);
1431808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita
1441711d430cb4c4eee11c00c15193242127c4a68f3Mihai Nita        if (mLocaleList == null) {
1451711d430cb4c4eee11c00c15193242127c4a68f3Mihai Nita            // The fragment was killed and restored by the FragmentManager.
1461711d430cb4c4eee11c00c15193242127c4a68f3Mihai Nita            // At this point we have no data, no listener. Just return, to prevend a NPE.
1471711d430cb4c4eee11c00c15193242127c4a68f3Mihai Nita            // Fixes b/28748150. Created b/29400003 for a cleaner solution.
1481711d430cb4c4eee11c00c15193242127c4a68f3Mihai Nita            returnToParentFrame();
1491711d430cb4c4eee11c00c15193242127c4a68f3Mihai Nita            return;
1501711d430cb4c4eee11c00c15193242127c4a68f3Mihai Nita        }
1511711d430cb4c4eee11c00c15193242127c4a68f3Mihai Nita
152f1f39cf1936df2d28133e43390f72f3dbb40ffc8Mihai Nita        final boolean countryMode = mParentLocale != null;
153f1f39cf1936df2d28133e43390f72f3dbb40ffc8Mihai Nita        final Locale sortingLocale = countryMode ? mParentLocale.getLocale() : Locale.getDefault();
154f1f39cf1936df2d28133e43390f72f3dbb40ffc8Mihai Nita        mAdapter = new SuggestedLocaleAdapter(mLocaleList, countryMode);
155df1ccbdc97a6540613c686298b82ea8385577c56Mihai Nita        final LocaleHelper.LocaleInfoComparator comp =
156f1f39cf1936df2d28133e43390f72f3dbb40ffc8Mihai Nita                new LocaleHelper.LocaleInfoComparator(sortingLocale, countryMode);
1571808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita        mAdapter.sort(comp);
1581808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita        setListAdapter(mAdapter);
1593b70b0fc25958c7e4c7cfc983fea51affac15179Mihai Nita    }
1603b70b0fc25958c7e4c7cfc983fea51affac15179Mihai Nita
1613b70b0fc25958c7e4c7cfc983fea51affac15179Mihai Nita    @Override
1621808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita    public boolean onOptionsItemSelected(MenuItem menuItem) {
1631808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita        int id = menuItem.getItemId();
1641808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita        switch (id) {
1651808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita            case android.R.id.home:
1661808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita                getFragmentManager().popBackStack();
1671808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita                return true;
1683b70b0fc25958c7e4c7cfc983fea51affac15179Mihai Nita        }
1691808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita        return super.onOptionsItemSelected(menuItem);
1703b70b0fc25958c7e4c7cfc983fea51affac15179Mihai Nita    }
1713b70b0fc25958c7e4c7cfc983fea51affac15179Mihai Nita
1721808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita    @Override
1731808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita    public void onResume() {
1741808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita        super.onResume();
175df1ccbdc97a6540613c686298b82ea8385577c56Mihai Nita
176f1f39cf1936df2d28133e43390f72f3dbb40ffc8Mihai Nita        if (mParentLocale != null) {
177c743e0fd97a2e380e8840bb88c8364cbfa234cc6Mihai Nita            getActivity().setTitle(mParentLocale.getFullNameNative());
178df1ccbdc97a6540613c686298b82ea8385577c56Mihai Nita        } else {
179c743e0fd97a2e380e8840bb88c8364cbfa234cc6Mihai Nita            getActivity().setTitle(R.string.language_selection_title);
180df1ccbdc97a6540613c686298b82ea8385577c56Mihai Nita        }
181df1ccbdc97a6540613c686298b82ea8385577c56Mihai Nita
1821808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita        getListView().requestFocus();
1831808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita    }
1843b70b0fc25958c7e4c7cfc983fea51affac15179Mihai Nita
1851808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita    @Override
186c743e0fd97a2e380e8840bb88c8364cbfa234cc6Mihai Nita    public void onPause() {
187c743e0fd97a2e380e8840bb88c8364cbfa234cc6Mihai Nita        super.onPause();
188c743e0fd97a2e380e8840bb88c8364cbfa234cc6Mihai Nita
189c743e0fd97a2e380e8840bb88c8364cbfa234cc6Mihai Nita        // Save search status
190c743e0fd97a2e380e8840bb88c8364cbfa234cc6Mihai Nita        if (mSearchView != null) {
191c743e0fd97a2e380e8840bb88c8364cbfa234cc6Mihai Nita            mPreviousSearchHadFocus = mSearchView.hasFocus();
192c743e0fd97a2e380e8840bb88c8364cbfa234cc6Mihai Nita            mPreviousSearch = mSearchView.getQuery();
193c743e0fd97a2e380e8840bb88c8364cbfa234cc6Mihai Nita        } else {
194c743e0fd97a2e380e8840bb88c8364cbfa234cc6Mihai Nita            mPreviousSearchHadFocus = false;
195c743e0fd97a2e380e8840bb88c8364cbfa234cc6Mihai Nita            mPreviousSearch = null;
196c743e0fd97a2e380e8840bb88c8364cbfa234cc6Mihai Nita        }
197c743e0fd97a2e380e8840bb88c8364cbfa234cc6Mihai Nita
198c743e0fd97a2e380e8840bb88c8364cbfa234cc6Mihai Nita        // Save scroll position
199c743e0fd97a2e380e8840bb88c8364cbfa234cc6Mihai Nita        final ListView list = getListView();
200c743e0fd97a2e380e8840bb88c8364cbfa234cc6Mihai Nita        final View firstChild = list.getChildAt(0);
201c743e0fd97a2e380e8840bb88c8364cbfa234cc6Mihai Nita        mFirstVisiblePosition = list.getFirstVisiblePosition();
202c743e0fd97a2e380e8840bb88c8364cbfa234cc6Mihai Nita        mTopDistance = (firstChild == null) ? 0 : (firstChild.getTop() - list.getPaddingTop());
203c743e0fd97a2e380e8840bb88c8364cbfa234cc6Mihai Nita    }
204c743e0fd97a2e380e8840bb88c8364cbfa234cc6Mihai Nita
205c743e0fd97a2e380e8840bb88c8364cbfa234cc6Mihai Nita    @Override
2061808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita    public void onListItemClick(ListView l, View v, int position, long id) {
2071808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita        final LocaleStore.LocaleInfo locale =
2081808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita                (LocaleStore.LocaleInfo) getListAdapter().getItem(position);
2093b70b0fc25958c7e4c7cfc983fea51affac15179Mihai Nita
210f1f39cf1936df2d28133e43390f72f3dbb40ffc8Mihai Nita        if (locale.getParent() != null) {
2111808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita            if (mListener != null) {
2121808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita                mListener.onLocaleSelected(locale);
2131808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita            }
2141711d430cb4c4eee11c00c15193242127c4a68f3Mihai Nita            returnToParentFrame();
2151808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita        } else {
2161808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita            LocalePickerWithRegion selector = LocalePickerWithRegion.createCountryPicker(
2171808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita                    getContext(), mListener, locale, mTranslatedOnly /* translate only */);
2181808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita            if (selector != null) {
2191808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita                getFragmentManager().beginTransaction()
2201808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita                        .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
2211808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita                        .replace(getId(), selector).addToBackStack(null)
2221808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita                        .commit();
2231808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita            } else {
2241711d430cb4c4eee11c00c15193242127c4a68f3Mihai Nita                returnToParentFrame();
2251808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita            }
2261808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita        }
2273b70b0fc25958c7e4c7cfc983fea51affac15179Mihai Nita    }
2283b70b0fc25958c7e4c7cfc983fea51affac15179Mihai Nita
2293b70b0fc25958c7e4c7cfc983fea51affac15179Mihai Nita    @Override
2301808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
231f1f39cf1936df2d28133e43390f72f3dbb40ffc8Mihai Nita        if (mParentLocale == null) {
2321808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita            inflater.inflate(R.menu.language_selection_list, menu);
2333b70b0fc25958c7e4c7cfc983fea51affac15179Mihai Nita
234c743e0fd97a2e380e8840bb88c8364cbfa234cc6Mihai Nita            final MenuItem searchMenuItem = menu.findItem(R.id.locale_search_menu);
235c743e0fd97a2e380e8840bb88c8364cbfa234cc6Mihai Nita            mSearchView = (SearchView) searchMenuItem.getActionView();
2363b70b0fc25958c7e4c7cfc983fea51affac15179Mihai Nita
2371808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita            mSearchView.setQueryHint(getText(R.string.search_language_hint));
2381808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita            mSearchView.setOnQueryTextListener(this);
239c743e0fd97a2e380e8840bb88c8364cbfa234cc6Mihai Nita
240c743e0fd97a2e380e8840bb88c8364cbfa234cc6Mihai Nita            // Restore previous search status
241c743e0fd97a2e380e8840bb88c8364cbfa234cc6Mihai Nita            if (!TextUtils.isEmpty(mPreviousSearch)) {
242c743e0fd97a2e380e8840bb88c8364cbfa234cc6Mihai Nita                searchMenuItem.expandActionView();
243c743e0fd97a2e380e8840bb88c8364cbfa234cc6Mihai Nita                mSearchView.setIconified(false);
244c743e0fd97a2e380e8840bb88c8364cbfa234cc6Mihai Nita                mSearchView.setActivated(true);
245c743e0fd97a2e380e8840bb88c8364cbfa234cc6Mihai Nita                if (mPreviousSearchHadFocus) {
246c743e0fd97a2e380e8840bb88c8364cbfa234cc6Mihai Nita                    mSearchView.requestFocus();
247c743e0fd97a2e380e8840bb88c8364cbfa234cc6Mihai Nita                }
248c743e0fd97a2e380e8840bb88c8364cbfa234cc6Mihai Nita                mSearchView.setQuery(mPreviousSearch, true /* submit */);
249c743e0fd97a2e380e8840bb88c8364cbfa234cc6Mihai Nita            } else {
250c743e0fd97a2e380e8840bb88c8364cbfa234cc6Mihai Nita                mSearchView.setQuery(null, false /* submit */);
251c743e0fd97a2e380e8840bb88c8364cbfa234cc6Mihai Nita            }
252c743e0fd97a2e380e8840bb88c8364cbfa234cc6Mihai Nita
253c743e0fd97a2e380e8840bb88c8364cbfa234cc6Mihai Nita            // Restore previous scroll position
254c743e0fd97a2e380e8840bb88c8364cbfa234cc6Mihai Nita            getListView().setSelectionFromTop(mFirstVisiblePosition, mTopDistance);
2551808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita        }
2563b70b0fc25958c7e4c7cfc983fea51affac15179Mihai Nita    }
2573b70b0fc25958c7e4c7cfc983fea51affac15179Mihai Nita
2583b70b0fc25958c7e4c7cfc983fea51affac15179Mihai Nita    @Override
2591808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita    public boolean onQueryTextSubmit(String query) {
2601808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita        return false;
2613b70b0fc25958c7e4c7cfc983fea51affac15179Mihai Nita    }
2623b70b0fc25958c7e4c7cfc983fea51affac15179Mihai Nita
2633b70b0fc25958c7e4c7cfc983fea51affac15179Mihai Nita    @Override
2641808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita    public boolean onQueryTextChange(String newText) {
2651808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita        if (mAdapter != null) {
2661808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita            mAdapter.getFilter().filter(newText);
2673b70b0fc25958c7e4c7cfc983fea51affac15179Mihai Nita        }
2681808ff7cde452d4831dcfbc6b99afc57f66daedfMihai Nita        return false;
2693b70b0fc25958c7e4c7cfc983fea51affac15179Mihai Nita    }
2703b70b0fc25958c7e4c7cfc983fea51affac15179Mihai Nita}
271