19f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown/*
29f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown * Copyright (C) 2012 The Android Open Source Project
39f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown *
49f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown * Licensed under the Apache License, Version 2.0 (the "License");
59f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown * you may not use this file except in compliance with the License.
69f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown * You may obtain a copy of the License at
79f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown *
89f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown *      http://www.apache.org/licenses/LICENSE-2.0
99f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown *
109f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown * Unless required by applicable law or agreed to in writing, software
119f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown * distributed under the License is distributed on an "AS IS" BASIS,
129f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown * See the License for the specific language governing permissions and
149f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown * limitations under the License.
159f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown */
169f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown
179f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brownpackage android.hardware.input;
189f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown
195660fad79808c6d1823a7135b283003b0947773aYohei Yukawaimport android.annotation.NonNull;
2023cbe85610f780134cc77dd4a54732a22ed6e86eYohei Yukawaimport android.os.LocaleList;
219f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brownimport android.os.Parcel;
229f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brownimport android.os.Parcelable;
239f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown
240748342d2ed264c01384fbaa4446a702a8824813Michael Wrightimport java.util.Locale;
250748342d2ed264c01384fbaa4446a702a8824813Michael Wright
269f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown/**
279f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown * Describes a keyboard layout.
289f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown *
299f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown * @hide
309f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown */
319f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brownpublic final class KeyboardLayout implements Parcelable,
329f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        Comparable<KeyboardLayout> {
339f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    private final String mDescriptor;
349f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    private final String mLabel;
35d9fec5d317c09da6bcc7a54df4e0190a76d21eaeJeff Brown    private final String mCollection;
368ebac231966e27364e5d463b63540a0527d40c4bMichael Wright    private final int mPriority;
375660fad79808c6d1823a7135b283003b0947773aYohei Yukawa    @NonNull
385660fad79808c6d1823a7135b283003b0947773aYohei Yukawa    private final LocaleList mLocales;
390748342d2ed264c01384fbaa4446a702a8824813Michael Wright    private final int mVendorId;
400748342d2ed264c01384fbaa4446a702a8824813Michael Wright    private final int mProductId;
419f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown
429f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    public static final Parcelable.Creator<KeyboardLayout> CREATOR =
439f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown            new Parcelable.Creator<KeyboardLayout>() {
449f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        public KeyboardLayout createFromParcel(Parcel source) {
459f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown            return new KeyboardLayout(source);
469f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        }
479f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        public KeyboardLayout[] newArray(int size) {
489f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown            return new KeyboardLayout[size];
499f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        }
509f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    };
519f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown
520748342d2ed264c01384fbaa4446a702a8824813Michael Wright    public KeyboardLayout(String descriptor, String label, String collection, int priority,
535660fad79808c6d1823a7135b283003b0947773aYohei Yukawa            LocaleList locales, int vid, int pid) {
549f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        mDescriptor = descriptor;
559f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        mLabel = label;
56d9fec5d317c09da6bcc7a54df4e0190a76d21eaeJeff Brown        mCollection = collection;
578ebac231966e27364e5d463b63540a0527d40c4bMichael Wright        mPriority = priority;
585660fad79808c6d1823a7135b283003b0947773aYohei Yukawa        mLocales = locales;
590748342d2ed264c01384fbaa4446a702a8824813Michael Wright        mVendorId = vid;
600748342d2ed264c01384fbaa4446a702a8824813Michael Wright        mProductId = pid;
619f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    }
629f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown
639f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    private KeyboardLayout(Parcel source) {
649f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        mDescriptor = source.readString();
659f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        mLabel = source.readString();
66d9fec5d317c09da6bcc7a54df4e0190a76d21eaeJeff Brown        mCollection = source.readString();
678ebac231966e27364e5d463b63540a0527d40c4bMichael Wright        mPriority = source.readInt();
685660fad79808c6d1823a7135b283003b0947773aYohei Yukawa        mLocales = LocaleList.CREATOR.createFromParcel(source);
690748342d2ed264c01384fbaa4446a702a8824813Michael Wright        mVendorId = source.readInt();
700748342d2ed264c01384fbaa4446a702a8824813Michael Wright        mProductId = source.readInt();
719f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    }
729f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown
739f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    /**
749f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown     * Gets the keyboard layout descriptor, which can be used to retrieve
759f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown     * the keyboard layout again later using
769f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown     * {@link InputManager#getKeyboardLayout(String)}.
779f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown     *
789f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown     * @return The keyboard layout descriptor.
799f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown     */
809f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    public String getDescriptor() {
819f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        return mDescriptor;
829f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    }
839f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown
849f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    /**
859f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown     * Gets the keyboard layout descriptive label to show in the user interface.
869f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown     * @return The keyboard layout descriptive label.
879f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown     */
889f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    public String getLabel() {
899f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        return mLabel;
909f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    }
919f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown
92d9fec5d317c09da6bcc7a54df4e0190a76d21eaeJeff Brown    /**
93d9fec5d317c09da6bcc7a54df4e0190a76d21eaeJeff Brown     * Gets the name of the collection to which the keyboard layout belongs.  This is
94d9fec5d317c09da6bcc7a54df4e0190a76d21eaeJeff Brown     * the label of the broadcast receiver or application that provided the keyboard layout.
95d9fec5d317c09da6bcc7a54df4e0190a76d21eaeJeff Brown     * @return The keyboard layout collection name.
96d9fec5d317c09da6bcc7a54df4e0190a76d21eaeJeff Brown     */
97d9fec5d317c09da6bcc7a54df4e0190a76d21eaeJeff Brown    public String getCollection() {
98d9fec5d317c09da6bcc7a54df4e0190a76d21eaeJeff Brown        return mCollection;
99d9fec5d317c09da6bcc7a54df4e0190a76d21eaeJeff Brown    }
100d9fec5d317c09da6bcc7a54df4e0190a76d21eaeJeff Brown
1010748342d2ed264c01384fbaa4446a702a8824813Michael Wright    /**
1020748342d2ed264c01384fbaa4446a702a8824813Michael Wright     * Gets the locales that this keyboard layout is intended for.
1030748342d2ed264c01384fbaa4446a702a8824813Michael Wright     * This may be empty if a locale has not been assigned to this keyboard layout.
1040748342d2ed264c01384fbaa4446a702a8824813Michael Wright     * @return The keyboard layout's intended locale.
1050748342d2ed264c01384fbaa4446a702a8824813Michael Wright     */
1065660fad79808c6d1823a7135b283003b0947773aYohei Yukawa    public LocaleList getLocales() {
1070748342d2ed264c01384fbaa4446a702a8824813Michael Wright        return mLocales;
1080748342d2ed264c01384fbaa4446a702a8824813Michael Wright    }
1090748342d2ed264c01384fbaa4446a702a8824813Michael Wright
1100748342d2ed264c01384fbaa4446a702a8824813Michael Wright    /**
1110748342d2ed264c01384fbaa4446a702a8824813Michael Wright     * Gets the vendor ID of the hardware device this keyboard layout is intended for.
1120748342d2ed264c01384fbaa4446a702a8824813Michael Wright     * Returns -1 if this is not specific to any piece of hardware.
1130748342d2ed264c01384fbaa4446a702a8824813Michael Wright     * @return The hardware vendor ID of the keyboard layout's intended device.
1140748342d2ed264c01384fbaa4446a702a8824813Michael Wright     */
1150748342d2ed264c01384fbaa4446a702a8824813Michael Wright    public int getVendorId() {
1160748342d2ed264c01384fbaa4446a702a8824813Michael Wright        return mVendorId;
1170748342d2ed264c01384fbaa4446a702a8824813Michael Wright    }
1180748342d2ed264c01384fbaa4446a702a8824813Michael Wright
1190748342d2ed264c01384fbaa4446a702a8824813Michael Wright    /**
1200748342d2ed264c01384fbaa4446a702a8824813Michael Wright     * Gets the product ID of the hardware device this keyboard layout is intended for.
1210748342d2ed264c01384fbaa4446a702a8824813Michael Wright     * Returns -1 if this is not specific to any piece of hardware.
1220748342d2ed264c01384fbaa4446a702a8824813Michael Wright     * @return The hardware product ID of the keyboard layout's intended device.
1230748342d2ed264c01384fbaa4446a702a8824813Michael Wright     */
1240748342d2ed264c01384fbaa4446a702a8824813Michael Wright    public int getProductId() {
1250748342d2ed264c01384fbaa4446a702a8824813Michael Wright        return mProductId;
1260748342d2ed264c01384fbaa4446a702a8824813Michael Wright    }
1270748342d2ed264c01384fbaa4446a702a8824813Michael Wright
1289f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    @Override
1299f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    public int describeContents() {
1309f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        return 0;
1319f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    }
1329f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown
1339f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    @Override
1349f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    public void writeToParcel(Parcel dest, int flags) {
1359f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        dest.writeString(mDescriptor);
1369f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        dest.writeString(mLabel);
137d9fec5d317c09da6bcc7a54df4e0190a76d21eaeJeff Brown        dest.writeString(mCollection);
1388ebac231966e27364e5d463b63540a0527d40c4bMichael Wright        dest.writeInt(mPriority);
1395660fad79808c6d1823a7135b283003b0947773aYohei Yukawa        mLocales.writeToParcel(dest, 0);
1400748342d2ed264c01384fbaa4446a702a8824813Michael Wright        dest.writeInt(mVendorId);
1410748342d2ed264c01384fbaa4446a702a8824813Michael Wright        dest.writeInt(mProductId);
1429f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    }
1439f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown
1449f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    @Override
1459f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    public int compareTo(KeyboardLayout another) {
1468ebac231966e27364e5d463b63540a0527d40c4bMichael Wright        // Note that these arguments are intentionally flipped since you want higher priority
1478ebac231966e27364e5d463b63540a0527d40c4bMichael Wright        // keyboards to be listed before lower priority keyboards.
1488ebac231966e27364e5d463b63540a0527d40c4bMichael Wright        int result = Integer.compare(another.mPriority, mPriority);
1498ebac231966e27364e5d463b63540a0527d40c4bMichael Wright        if (result == 0) {
1508ebac231966e27364e5d463b63540a0527d40c4bMichael Wright            result = mLabel.compareToIgnoreCase(another.mLabel);
1518ebac231966e27364e5d463b63540a0527d40c4bMichael Wright        }
152d9fec5d317c09da6bcc7a54df4e0190a76d21eaeJeff Brown        if (result == 0) {
153d9fec5d317c09da6bcc7a54df4e0190a76d21eaeJeff Brown            result = mCollection.compareToIgnoreCase(another.mCollection);
154d9fec5d317c09da6bcc7a54df4e0190a76d21eaeJeff Brown        }
155d9fec5d317c09da6bcc7a54df4e0190a76d21eaeJeff Brown        return result;
1569f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    }
1579f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown
1589f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    @Override
1599f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    public String toString() {
160d9fec5d317c09da6bcc7a54df4e0190a76d21eaeJeff Brown        if (mCollection.isEmpty()) {
161d9fec5d317c09da6bcc7a54df4e0190a76d21eaeJeff Brown            return mLabel;
162d9fec5d317c09da6bcc7a54df4e0190a76d21eaeJeff Brown        }
163d9fec5d317c09da6bcc7a54df4e0190a76d21eaeJeff Brown        return mLabel + " - " + mCollection;
1649f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    }
1658ebac231966e27364e5d463b63540a0527d40c4bMichael Wright}
166