Show check icon on current locale preference
Bug: 226894992 Test: manual Change-Id: I449ccaaacb3cef4eabc141b5b81ee3a1ba4207c0
This commit is contained in:
@@ -158,16 +158,17 @@ public class LocalePickerWithRegion extends ListFragment implements SearchView.O
|
|||||||
if (appCurrentLocale != null && !isForCountryMode) {
|
if (appCurrentLocale != null && !isForCountryMode) {
|
||||||
mLocaleList.add(appCurrentLocale);
|
mLocaleList.add(appCurrentLocale);
|
||||||
}
|
}
|
||||||
filterTheLanguagesNotSupportedInApp(context, appPackageName);
|
mLocaleList = filterTheLanguagesNotSupportedInApp(context, appPackageName);
|
||||||
|
|
||||||
if (!isForCountryMode) {
|
if (!isForCountryMode) {
|
||||||
mLocaleList.add(LocaleStore.getSystemDefaultLocaleInfo());
|
mLocaleList.add(LocaleStore.getSystemDefaultLocaleInfo(appCurrentLocale == null));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void filterTheLanguagesNotSupportedInApp(Context context, String appPackageName) {
|
private Set<LocaleStore.LocaleInfo> filterTheLanguagesNotSupportedInApp(
|
||||||
|
Context context, String appPackageName) {
|
||||||
ArrayList<Locale> supportedLocales =
|
ArrayList<Locale> supportedLocales =
|
||||||
AppLocaleStore.getAppSupportedLocales(context, appPackageName);
|
AppLocaleStore.getAppSupportedLocales(context, appPackageName);
|
||||||
|
|
||||||
@@ -181,7 +182,7 @@ public class LocalePickerWithRegion extends ListFragment implements SearchView.O
|
|||||||
}
|
}
|
||||||
Log.d(TAG, "mLocaleList after app-supported filter: " + filteredList.size());
|
Log.d(TAG, "mLocaleList after app-supported filter: " + filteredList.size());
|
||||||
|
|
||||||
mLocaleList = filteredList;
|
return filteredList;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void returnToParentFrame() {
|
private void returnToParentFrame() {
|
||||||
|
|||||||
@@ -281,9 +281,12 @@ public class LocaleStore {
|
|||||||
* The "system default" is special case for per-app picker. Intentionally keep the locale
|
* The "system default" is special case for per-app picker. Intentionally keep the locale
|
||||||
* empty to let activity know "system default" been selected.
|
* empty to let activity know "system default" been selected.
|
||||||
*/
|
*/
|
||||||
public static LocaleInfo getSystemDefaultLocaleInfo() {
|
public static LocaleInfo getSystemDefaultLocaleInfo(boolean hasAppLanguage) {
|
||||||
LocaleInfo systemDefaultInfo = new LocaleInfo("");
|
LocaleInfo systemDefaultInfo = new LocaleInfo("");
|
||||||
systemDefaultInfo.mSuggestionFlags |= LocaleInfo.SUGGESTION_TYPE_SYSTEM_LANGUAGE;
|
systemDefaultInfo.mSuggestionFlags |= LocaleInfo.SUGGESTION_TYPE_SYSTEM_LANGUAGE;
|
||||||
|
if (hasAppLanguage) {
|
||||||
|
systemDefaultInfo.mSuggestionFlags |= LocaleInfo.SUGGESTION_TYPE_CURRENT;
|
||||||
|
}
|
||||||
systemDefaultInfo.mIsTranslated = true;
|
systemDefaultInfo.mIsTranslated = true;
|
||||||
return systemDefaultInfo;
|
return systemDefaultInfo;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ import android.view.ViewGroup;
|
|||||||
import android.widget.BaseAdapter;
|
import android.widget.BaseAdapter;
|
||||||
import android.widget.Filter;
|
import android.widget.Filter;
|
||||||
import android.widget.Filterable;
|
import android.widget.Filterable;
|
||||||
|
import android.widget.FrameLayout;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
|
|
||||||
import com.android.internal.R;
|
import com.android.internal.R;
|
||||||
@@ -54,7 +55,11 @@ public class SuggestedLocaleAdapter extends BaseAdapter implements Filterable {
|
|||||||
private static final int TYPE_HEADER_ALL_OTHERS = 1;
|
private static final int TYPE_HEADER_ALL_OTHERS = 1;
|
||||||
private static final int TYPE_LOCALE = 2;
|
private static final int TYPE_LOCALE = 2;
|
||||||
private static final int TYPE_SYSTEM_LANGUAGE_FOR_APP_LANGUAGE_PICKER = 3;
|
private static final int TYPE_SYSTEM_LANGUAGE_FOR_APP_LANGUAGE_PICKER = 3;
|
||||||
|
private static final int TYPE_CURRENT_LOCALE = 4;
|
||||||
private static final int MIN_REGIONS_FOR_SUGGESTIONS = 6;
|
private static final int MIN_REGIONS_FOR_SUGGESTIONS = 6;
|
||||||
|
private static final int APP_LANGUAGE_PICKER_TYPE_COUNT = 5;
|
||||||
|
private static final int SYSTEM_LANGUAGE_TYPE_COUNT = 3;
|
||||||
|
private static final int SYSTEM_LANGUAGE_WITHOUT_HEADER_TYPE_COUNT = 1;
|
||||||
|
|
||||||
private ArrayList<LocaleStore.LocaleInfo> mLocaleOptions;
|
private ArrayList<LocaleStore.LocaleInfo> mLocaleOptions;
|
||||||
private ArrayList<LocaleStore.LocaleInfo> mOriginalLocaleOptions;
|
private ArrayList<LocaleStore.LocaleInfo> mOriginalLocaleOptions;
|
||||||
@@ -93,7 +98,8 @@ public class SuggestedLocaleAdapter extends BaseAdapter implements Filterable {
|
|||||||
@Override
|
@Override
|
||||||
public boolean isEnabled(int position) {
|
public boolean isEnabled(int position) {
|
||||||
return getItemViewType(position) == TYPE_LOCALE
|
return getItemViewType(position) == TYPE_LOCALE
|
||||||
|| getItemViewType(position) == TYPE_SYSTEM_LANGUAGE_FOR_APP_LANGUAGE_PICKER;
|
|| getItemViewType(position) == TYPE_SYSTEM_LANGUAGE_FOR_APP_LANGUAGE_PICKER
|
||||||
|
|| getItemViewType(position) == TYPE_CURRENT_LOCALE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -112,6 +118,9 @@ public class SuggestedLocaleAdapter extends BaseAdapter implements Filterable {
|
|||||||
if (item.isSystemLocale()) {
|
if (item.isSystemLocale()) {
|
||||||
return TYPE_SYSTEM_LANGUAGE_FOR_APP_LANGUAGE_PICKER;
|
return TYPE_SYSTEM_LANGUAGE_FOR_APP_LANGUAGE_PICKER;
|
||||||
}
|
}
|
||||||
|
if (item.isAppCurrentLocale()) {
|
||||||
|
return TYPE_CURRENT_LOCALE;
|
||||||
|
}
|
||||||
return TYPE_LOCALE;
|
return TYPE_LOCALE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -119,11 +128,13 @@ public class SuggestedLocaleAdapter extends BaseAdapter implements Filterable {
|
|||||||
@Override
|
@Override
|
||||||
public int getViewTypeCount() {
|
public int getViewTypeCount() {
|
||||||
if (!TextUtils.isEmpty(mAppPackageName) && showHeaders()) {
|
if (!TextUtils.isEmpty(mAppPackageName) && showHeaders()) {
|
||||||
return 4; // Two headers and 1 for "System language"
|
// Two headers, 1 "System language", 1 current locale
|
||||||
|
return APP_LANGUAGE_PICKER_TYPE_COUNT;
|
||||||
} else if (showHeaders()) {
|
} else if (showHeaders()) {
|
||||||
return 3; // Two headers in addition to the locales
|
// Two headers in addition to the locales
|
||||||
|
return SYSTEM_LANGUAGE_TYPE_COUNT;
|
||||||
} else {
|
} else {
|
||||||
return 1; // Locales items only
|
return SYSTEM_LANGUAGE_WITHOUT_HEADER_TYPE_COUNT; // Locales items only
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -204,12 +215,16 @@ public class SuggestedLocaleAdapter extends BaseAdapter implements Filterable {
|
|||||||
textView.setTextLocale(
|
textView.setTextLocale(
|
||||||
mDisplayLocale != null ? mDisplayLocale : Locale.getDefault());
|
mDisplayLocale != null ? mDisplayLocale : Locale.getDefault());
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TYPE_SYSTEM_LANGUAGE_FOR_APP_LANGUAGE_PICKER:
|
case TYPE_SYSTEM_LANGUAGE_FOR_APP_LANGUAGE_PICKER:
|
||||||
if (!(convertView instanceof ViewGroup)) {
|
if (!(convertView instanceof ViewGroup)) {
|
||||||
|
if (((LocaleStore.LocaleInfo)getItem(position)).isAppCurrentLocale()) {
|
||||||
|
convertView = mInflater.inflate(
|
||||||
|
R.layout.app_language_picker_system_current, parent, false);
|
||||||
|
} else {
|
||||||
convertView = mInflater.inflate(
|
convertView = mInflater.inflate(
|
||||||
R.layout.app_language_picker_system_default, parent, false);
|
R.layout.app_language_picker_system_default, parent, false);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Locale defaultLocale = Locale.getDefault();
|
Locale defaultLocale = Locale.getDefault();
|
||||||
TextView title = convertView.findViewById(R.id.locale);
|
TextView title = convertView.findViewById(R.id.locale);
|
||||||
@@ -219,25 +234,20 @@ public class SuggestedLocaleAdapter extends BaseAdapter implements Filterable {
|
|||||||
subtitle.setText(defaultLocale.getDisplayName());
|
subtitle.setText(defaultLocale.getDisplayName());
|
||||||
subtitle.setTextLocale(defaultLocale);
|
subtitle.setTextLocale(defaultLocale);
|
||||||
break;
|
break;
|
||||||
|
case TYPE_CURRENT_LOCALE:
|
||||||
|
if (!(convertView instanceof ViewGroup)) {
|
||||||
|
convertView = mInflater.inflate(
|
||||||
|
R.layout.app_language_picker_current_locale_item, parent, false);
|
||||||
|
}
|
||||||
|
updateTextView(
|
||||||
|
convertView, convertView.findViewById(R.id.language_picker_item), position);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
// Covers both null, and "reusing" a wrong kind of view
|
// Covers both null, and "reusing" a wrong kind of view
|
||||||
if (!(convertView instanceof ViewGroup)) {
|
if (!(convertView instanceof ViewGroup)) {
|
||||||
convertView = mInflater.inflate(R.layout.language_picker_item, parent, false);
|
convertView = mInflater.inflate(R.layout.language_picker_item, parent, false);
|
||||||
}
|
}
|
||||||
|
updateTextView(convertView, convertView.findViewById(R.id.locale), position);
|
||||||
TextView text = (TextView) convertView.findViewById(R.id.locale);
|
|
||||||
LocaleStore.LocaleInfo item = (LocaleStore.LocaleInfo) getItem(position);
|
|
||||||
text.setText(item.getLabel(mCountryMode));
|
|
||||||
text.setTextLocale(item.getLocale());
|
|
||||||
text.setContentDescription(item.getContentDescription(mCountryMode));
|
|
||||||
if (mCountryMode) {
|
|
||||||
int layoutDir = TextUtils.getLayoutDirectionFromLocale(item.getParent());
|
|
||||||
//noinspection ResourceType
|
|
||||||
convertView.setLayoutDirection(layoutDir);
|
|
||||||
text.setTextDirection(layoutDir == View.LAYOUT_DIRECTION_RTL
|
|
||||||
? View.TEXT_DIRECTION_RTL
|
|
||||||
: View.TEXT_DIRECTION_LTR);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return convertView;
|
return convertView;
|
||||||
}
|
}
|
||||||
@@ -348,4 +358,19 @@ public class SuggestedLocaleAdapter extends BaseAdapter implements Filterable {
|
|||||||
public Filter getFilter() {
|
public Filter getFilter() {
|
||||||
return new FilterByNativeAndUiNames();
|
return new FilterByNativeAndUiNames();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void updateTextView(View convertView, TextView text, int position) {
|
||||||
|
LocaleStore.LocaleInfo item = (LocaleStore.LocaleInfo) getItem(position);
|
||||||
|
text.setText(item.getLabel(mCountryMode));
|
||||||
|
text.setTextLocale(item.getLocale());
|
||||||
|
text.setContentDescription(item.getContentDescription(mCountryMode));
|
||||||
|
if (mCountryMode) {
|
||||||
|
int layoutDir = TextUtils.getLayoutDirectionFromLocale(item.getParent());
|
||||||
|
//noinspection ResourceType
|
||||||
|
convertView.setLayoutDirection(layoutDir);
|
||||||
|
text.setTextDirection(layoutDir == View.LAYOUT_DIRECTION_RTL
|
||||||
|
? View.TEXT_DIRECTION_RTL
|
||||||
|
: View.TEXT_DIRECTION_LTR);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
24
core/res/res/drawable/ic_check_24dp.xml
Normal file
24
core/res/res/drawable/ic_check_24dp.xml
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
<!--
|
||||||
|
~ Copyright (C) 2022 The Android Open Source Project
|
||||||
|
~
|
||||||
|
~ Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
~ you may not use this file except in compliance with the License.
|
||||||
|
~ You may obtain a copy of the License at
|
||||||
|
~
|
||||||
|
~ http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
~
|
||||||
|
~ Unless required by applicable law or agreed to in writing, software
|
||||||
|
~ distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
~ See the License for the specific language governing permissions and
|
||||||
|
~ limitations under the License.
|
||||||
|
-->
|
||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="24dp"
|
||||||
|
android:height="24dp"
|
||||||
|
android:viewportWidth="24.0"
|
||||||
|
android:viewportHeight="24.0">
|
||||||
|
<path
|
||||||
|
android:pathData="M9,16.17L4.83,12l-1.42,1.41L9,19 21,7l-1.41,-1.41z"
|
||||||
|
android:fillColor="@android:color/white"/>
|
||||||
|
</vector>
|
||||||
@@ -0,0 +1,44 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!--
|
||||||
|
~ Copyright (C) 2022 The Android Open Source Project
|
||||||
|
~
|
||||||
|
~ Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
~ you may not use this file except in compliance with the License.
|
||||||
|
~ You may obtain a copy of the License at
|
||||||
|
~
|
||||||
|
~ http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
~
|
||||||
|
~ Unless required by applicable law or agreed to in writing, software
|
||||||
|
~ distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
~ See the License for the specific language governing permissions and
|
||||||
|
~ limitations under the License.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent">
|
||||||
|
<FrameLayout
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_weight=".8">
|
||||||
|
<include
|
||||||
|
android:id="@+id/language_picker_item"
|
||||||
|
layout="@layout/language_picker_item" />
|
||||||
|
</FrameLayout>
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_weight=".2"
|
||||||
|
android:gravity="center"
|
||||||
|
android:minHeight="?android:attr/listPreferredItemHeight">
|
||||||
|
<ImageView
|
||||||
|
android:id="@+id/imageView"
|
||||||
|
android:layout_width="24dp"
|
||||||
|
android:layout_height="24dp"
|
||||||
|
android:src="@drawable/ic_check_24dp"
|
||||||
|
app:tint="#0F9D58"/>
|
||||||
|
</LinearLayout>
|
||||||
|
</LinearLayout>
|
||||||
45
core/res/res/layout/app_language_picker_system_current.xml
Normal file
45
core/res/res/layout/app_language_picker_system_current.xml
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
<!--
|
||||||
|
~ Copyright (C) 2022 The Android Open Source Project
|
||||||
|
~
|
||||||
|
~ Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
~ you may not use this file except in compliance with the License.
|
||||||
|
~ You may obtain a copy of the License at
|
||||||
|
~
|
||||||
|
~ http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
~
|
||||||
|
~ Unless required by applicable law or agreed to in writing, software
|
||||||
|
~ distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
~ See the License for the specific language governing permissions and
|
||||||
|
~ limitations under the License.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent">
|
||||||
|
|
||||||
|
<FrameLayout
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_weight=".8">
|
||||||
|
<include
|
||||||
|
android:id="@+id/system_language_view"
|
||||||
|
layout="@layout/app_language_picker_system_default" />
|
||||||
|
</FrameLayout>
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_weight=".2"
|
||||||
|
android:gravity="center"
|
||||||
|
android:minHeight="?android:attr/listPreferredItemHeight">
|
||||||
|
<ImageView
|
||||||
|
android:id="@+id/imageView"
|
||||||
|
android:layout_width="24dp"
|
||||||
|
android:layout_height="24dp"
|
||||||
|
android:src="@drawable/ic_check_24dp"
|
||||||
|
app:tint="#0F9D58"/>
|
||||||
|
</LinearLayout>
|
||||||
|
</LinearLayout>
|
||||||
@@ -4754,7 +4754,11 @@
|
|||||||
<java-symbol type="drawable" name="ic_swap_horiz" />
|
<java-symbol type="drawable" name="ic_swap_horiz" />
|
||||||
<java-symbol type="bool" name="config_notificationForceUserSetOnUpgrade" />
|
<java-symbol type="bool" name="config_notificationForceUserSetOnUpgrade" />
|
||||||
|
|
||||||
|
<!-- For app language picker -->
|
||||||
<java-symbol type="string" name="system_locale_title" />
|
<java-symbol type="string" name="system_locale_title" />
|
||||||
<java-symbol type="layout" name="app_language_picker_system_default" />
|
<java-symbol type="layout" name="app_language_picker_system_default" />
|
||||||
|
<java-symbol type="layout" name="app_language_picker_system_current" />
|
||||||
|
<java-symbol type="layout" name="app_language_picker_current_locale_item" />
|
||||||
<java-symbol type="id" name="system_locale_subtitle" />
|
<java-symbol type="id" name="system_locale_subtitle" />
|
||||||
|
<java-symbol type="id" name="language_picker_item" />
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
Reference in New Issue
Block a user