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