1/*
2 * Copyright (C) 2012 Google Inc.
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
5 * use this file except in compliance with the License. You may obtain a copy of
6 * the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13 * License for the specific language governing permissions and limitations under
14 * the License.
15 */
16
17package com.googlecode.eyesfree.braille.display;
18
19import android.os.Parcel;
20import android.os.Parcelable;
21
22import java.util.Collections;
23import java.util.HashMap;
24import java.util.Map;
25
26/**
27 * Properties of a braille display such as dimensions and keyboard
28 * configuration.
29 */
30public class BrailleDisplayProperties implements Parcelable {
31    private final int mNumTextCells;
32    private final int mNumStatusCells;
33    private final BrailleKeyBinding[] mKeyBindings;
34    private final Map<String, String> mFriendlyKeyNames;
35
36    public BrailleDisplayProperties(int numTextCells, int numStatusCells,
37            BrailleKeyBinding[] keyBindings,
38            Map<String, String> friendlyKeyNames) {
39        mNumTextCells = numTextCells;
40        mNumStatusCells = numStatusCells;
41        mKeyBindings = keyBindings;
42        mFriendlyKeyNames = friendlyKeyNames;
43    }
44
45    /**
46     * Returns the number of cells on the main display intended for display of
47     * text or other content.
48     */
49    public int getNumTextCells() {
50        return mNumTextCells;
51    }
52
53    /**
54     * Returns the number of status cells that are separated from the main
55     * display.  This value will be {@code 0} for displays without any separate
56     * status cells.
57     */
58    public int getNumStatusCells() {
59        return mNumStatusCells;
60    }
61
62    /**
63     * Returns the list of key bindings for this display.
64     */
65    public BrailleKeyBinding[] getKeyBindings() {
66        return mKeyBindings;
67    }
68
69    /**
70     * Returns an unmodifiable map mapping key names in {@link BrailleKeyBinding}
71     * objects to localized user-friendly key names.
72     */
73    public Map<String, String> getFriendlyKeyNames() {
74        return mFriendlyKeyNames;
75    }
76
77    @Override
78    public String toString() {
79        return String.format(
80            "BrailleDisplayProperties [numTextCells: %d, numStatusCells: %d, "
81            + "keyBindings: %d]",
82            mNumTextCells, mNumStatusCells, mKeyBindings.length);
83    }
84
85    // For Parcelable support.
86
87    public static final Parcelable.Creator<BrailleDisplayProperties> CREATOR =
88        new Parcelable.Creator<BrailleDisplayProperties>() {
89            @Override
90            public BrailleDisplayProperties createFromParcel(Parcel in) {
91                return new BrailleDisplayProperties(in);
92            }
93
94            @Override
95            public BrailleDisplayProperties[] newArray(int size) {
96                return new BrailleDisplayProperties[size];
97            }
98        };
99
100    @Override
101    public int describeContents() {
102        return 0;
103    }
104
105    @Override
106    public void writeToParcel(Parcel out, int flags) {
107        out.writeInt(mNumTextCells);
108        out.writeInt(mNumStatusCells);
109        out.writeTypedArray(mKeyBindings, flags);
110        out.writeInt(mFriendlyKeyNames.size());
111        for (Map.Entry<String, String> entry : mFriendlyKeyNames.entrySet()) {
112            out.writeString(entry.getKey());
113            out.writeString(entry.getValue());
114        }
115    }
116
117    private BrailleDisplayProperties(Parcel in) {
118        mNumTextCells = in.readInt();
119        mNumStatusCells = in.readInt();
120        mKeyBindings = in.createTypedArray(BrailleKeyBinding.CREATOR);
121        int size = in.readInt();
122        Map<String, String> names = new HashMap<String, String>(size);
123        for (int i = 0; i < size; ++i) {
124            names.put(in.readString(), in.readString());
125        }
126        mFriendlyKeyNames = Collections.unmodifiableMap(names);
127    }
128}
129