Skip to content
This repository has been archived by the owner on Nov 8, 2023. It is now read-only.

Commit

Permalink
Make LocaleList Parcelable.
Browse files Browse the repository at this point in the history
This is a preparation work to pass LocaleList from TextView to IMEs via
EditorInfo.

Marshalling and unmrshlling LocaleList via Parcel is actually not so
difficult.  We can reuse its internal data representation "localeTags"
as a canonical serialization format.

As for implementation, there are two choices.  One is making LocaleList
Parcelable and the other is having a utility method to do that.

This CL uses Parcelable approach so that not only Framework but also
application developers can reuse the code.

Bug: 22859862
Change-Id: Ib28363bd5ff74228d2abeaa95004ec8bed72bddd
  • Loading branch information
yukawa committed Dec 3, 2015
1 parent d78c5d7 commit 789d8fd
Show file tree
Hide file tree
Showing 5 changed files with 60 additions and 4 deletions.
5 changes: 4 additions & 1 deletion api/current.txt
Expand Up @@ -38610,10 +38610,11 @@ package android.util {
field public static final int RTL = 1; // 0x1
}

public final class LocaleList {
public final class LocaleList implements android.os.Parcelable {
ctor public LocaleList();
ctor public LocaleList(java.util.Locale);
ctor public LocaleList(java.util.Locale[]);
method public int describeContents();
method public static android.util.LocaleList forLanguageTags(java.lang.String);
method public java.util.Locale get(int);
method public java.util.Locale getBestMatch(java.lang.String[]);
Expand All @@ -38623,6 +38624,8 @@ package android.util {
method public boolean isEmpty();
method public int size();
method public java.lang.String toLanguageTags();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.util.LocaleList> CREATOR;
}

public final class Log {
Expand Down
5 changes: 4 additions & 1 deletion api/system-current.txt
Expand Up @@ -40935,10 +40935,11 @@ package android.util {
field public static final int RTL = 1; // 0x1
}

public final class LocaleList {
public final class LocaleList implements android.os.Parcelable {
ctor public LocaleList();
ctor public LocaleList(java.util.Locale);
ctor public LocaleList(java.util.Locale[]);
method public int describeContents();
method public static android.util.LocaleList forLanguageTags(java.lang.String);
method public java.util.Locale get(int);
method public java.util.Locale getBestMatch(java.lang.String[]);
Expand All @@ -40948,6 +40949,8 @@ package android.util {
method public boolean isEmpty();
method public int size();
method public java.lang.String toLanguageTags();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.util.LocaleList> CREATOR;
}

public final class Log {
Expand Down
5 changes: 4 additions & 1 deletion api/test-current.txt
Expand Up @@ -38612,10 +38612,11 @@ package android.util {
field public static final int RTL = 1; // 0x1
}

public final class LocaleList {
public final class LocaleList implements android.os.Parcelable {
ctor public LocaleList();
ctor public LocaleList(java.util.Locale);
ctor public LocaleList(java.util.Locale[]);
method public int describeContents();
method public static android.util.LocaleList forLanguageTags(java.lang.String);
method public java.util.Locale get(int);
method public java.util.Locale getBestMatch(java.lang.String[]);
Expand All @@ -38625,6 +38626,8 @@ package android.util {
method public boolean isEmpty();
method public int size();
method public java.lang.String toLanguageTags();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.util.LocaleList> CREATOR;
}

public final class Log {
Expand Down
19 changes: 19 additions & 0 deletions core/java/android/util/LocaleList.aidl
@@ -0,0 +1,19 @@
/*
* Copyright (C) 2015 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.
*/

package android.util;

parcelable LocaleList;
30 changes: 29 additions & 1 deletion core/java/android/util/LocaleList.java
Expand Up @@ -19,6 +19,8 @@
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.Size;
import android.os.Parcel;
import android.os.Parcelable;

import com.android.internal.annotations.GuardedBy;

Expand All @@ -35,11 +37,12 @@
* LocaleList is an immutable list of Locales, typically used to keep an
* ordered user preferences for locales.
*/
public final class LocaleList {
public final class LocaleList implements Parcelable {
private final Locale[] mList;
// This is a comma-separated list of the locales in the LocaleList created at construction time,
// basically the result of running each locale's toLanguageTag() method and concatenating them
// with commas in between.
@NonNull
private final String mStringRepresentation;

private static final Locale[] sEmptyList = new Locale[0];
Expand Down Expand Up @@ -101,6 +104,16 @@ public String toString() {
return sb.toString();
}

@Override
public int describeContents() {
return 0;
}

@Override
public void writeToParcel(Parcel dest, int parcelableFlags) {
dest.writeString(mStringRepresentation);
}

@NonNull
public String toLanguageTags() {
return mStringRepresentation;
Expand Down Expand Up @@ -163,10 +176,25 @@ public LocaleList(@Nullable Locale[] list) {
}
}

public static final Parcelable.Creator<LocaleList> CREATOR
= new Parcelable.Creator<LocaleList>() {
@Override
public LocaleList createFromParcel(Parcel source) {
return LocaleList.forLanguageTags(source.readString());
}

@Override
public LocaleList[] newArray(int size) {
return new LocaleList[size];
}
};

@NonNull
public static LocaleList getEmptyLocaleList() {
return sEmptyLocaleList;
}

@NonNull
public static LocaleList forLanguageTags(@Nullable String list) {
if (list == null || list.equals("")) {
return getEmptyLocaleList();
Expand Down

0 comments on commit 789d8fd

Please sign in to comment.