abouttreesummaryrefslogcommitdiff
path: root/srcs/juloo.keyboard2/DeviceLocales.java
blob: c0c489c67f6586b6a860609c34e26bcf1a747483 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
package juloo.keyboard2;

import android.content.Context;
import android.os.Build.VERSION;
import android.view.inputmethod.InputMethodInfo;
import android.view.inputmethod.InputMethodManager;
import android.view.inputmethod.InputMethodSubtype;
import java.util.ArrayList;
import java.util.List;

public final class DeviceLocales
{
  public final List<Loc> installed;
  public final Loc default_;

  public static DeviceLocales load(Context ctx)
  {
    InputMethodManager imm =
      (InputMethodManager)ctx.getSystemService(Context.INPUT_METHOD_SERVICE);
    List<Loc> locs = get_installed_locales(ctx.getPackageName(), imm);
    return new DeviceLocales(locs, current_locale(imm, locs));
  }

  /** Extra keys required by all the installed locales. */
  public ExtraKeys extra_keys()
  {
    List<ExtraKeys> extra_keys = new ArrayList<ExtraKeys>();
    for (Loc l : installed)
      extra_keys.add(l.extra_keys);
    return ExtraKeys.merge(extra_keys);
  }

  public static final class Loc
  {
    public final String lang_tag;
    public final String script;
    public final String default_layout; // Might be [null]
    public final ExtraKeys extra_keys;
    public final String dictionary; // Might be [null]

    public Loc(InputMethodSubtype st)
    {
      lang_tag = st.getLanguageTag();
      script = st.getExtraValueOf("script");
      default_layout = st.getExtraValueOf("default_layout");
      String extra_keys_s = st.getExtraValueOf("extra_keys");
      extra_keys = (extra_keys_s != null) ?
        ExtraKeys.parse(script, extra_keys_s) : ExtraKeys.EMPTY;
      dictionary = st.getExtraValueOf("dictionary");
    }
  }

  private DeviceLocales(List<Loc> locs, Loc def)
  { installed = locs; default_ = def; }

  private static List<Loc> get_installed_locales(String pkg, InputMethodManager imm)
  {
    List<Loc> locs = new ArrayList<Loc>();
    for (InputMethodInfo imi : imm.getEnabledInputMethodList())
      if (imi.getPackageName().equals(pkg))
      {
        for (InputMethodSubtype subtype :
            imm.getEnabledInputMethodSubtypeList(imi, true))
          locs.add(new Loc(subtype));
        break;
      }
    return locs;
  }

  private static Loc current_locale(InputMethodManager imm, List<Loc> installed)
  {
    // Android might return a random subtype, for example, the first in the
    // list alphabetically.
    InputMethodSubtype current_subtype = imm.getCurrentInputMethodSubtype();
    if (current_subtype == null)
      return null;
    if (VERSION.SDK_INT < 24)
      return new Loc(current_subtype);
    String default_lang_tag = current_subtype.getLanguageTag();
    for (Loc l : installed)
      if (l.lang_tag.equals(default_lang_tag))
        return l;
    return null;
  }
}