Enable Material theme for Android
With this CL, Mozc for Android supports Material theme.
Note that this CL also contains a lot of other improvements and bug fixes that might not be directly related to the Material theme. Here are some examples:
* Floating candidate window support in Android 5.0.
* Improved accessibility support.
* Start bundling Key Character Map (KCM) file of Japanese 109 keyboard.
See the release note for details.
As for desktop versions, no behavior change is intended.
BUG=none
TEST=manually done with Nexus 5 / Android 5.0.1 (LRX22C)
git-svn-id: https://mozc.googlecode.com/svn/trunk@467 a6090854-d499-a067-5803-1114d4e51264
diff --git a/src/DEPS b/src/DEPS
index d58edc4..03c4ff4 100644
--- a/src/DEPS
+++ b/src/DEPS
@@ -29,6 +29,7 @@
vars = {
"breakpad_revision": "1391",
+ "fonttools_revision": "5ba7d98a4153fad57258fca23b0bcb238717aec3",
"gtest_revision": "700",
"gmock_revision": "501",
"gyp_revision": "2012",
@@ -82,6 +83,9 @@
File("http://findbugs.googlecode.com/"
+ "svn/repos/release-repository/com/google/code/findbugs/jsr305/"
+ Var("jsr305_version") + "/jsr305-" + Var("jsr305_version") + ".jar"),
+ "src/third_party/fontTools":
+ "https://github.com/googlei18n/fonttools.git@" +
+ Var("fonttools_revision"),
"src/third_party/zlib/v1_2_8":
"https://src.chromium.org/chrome/trunk/src/third_party/zlib@" +
Var("zlib_revision"),
diff --git a/src/android/AndroidManifest_template.xml b/src/android/AndroidManifest_template.xml
index 988b823..5d3a845 100644
--- a/src/android/AndroidManifest_template.xml
+++ b/src/android/AndroidManifest_template.xml
@@ -33,15 +33,21 @@
package="@ANDROID_APPLICATION_ID@"
android:versionCode="@ANDROID_VERSION_CODE@"
android:versionName="@MAJOR@.@MINOR@.@BUILD@.@REVISION@-@ANDROID_ARCH@">
- <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="19" />
+ <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="21" />
<!-- Google Japanese Input (the main code) requires the following permissions. -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.VIBRATE" />
+ <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
+ <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
+ <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
- <application android:icon="@drawable/application_icon" android:label="@string/app_full_name" >
+ <application android:icon="@drawable/application_icon"
+ android:label="@string/app_full_name"
+ android:allowBackup="false"
+ android:theme="@style/AppThemeSelector" >
<service android:name="@ANDROID_SERVICE_NAME@"
android:permission="android.permission.BIND_INPUT_METHOD"
android:label="@string/app_full_name">
@@ -51,18 +57,32 @@
<meta-data android:name="android.view.im" android:resource="@xml/method" />
</service>
- <!-- Preference -->
- <activity android:name="org.mozc.android.inputmethod.japanese.preference.MozcProxyPreferenceActivity"
+ <!-- Launcher Icon -->
+ <activity android:name="org.mozc.android.inputmethod.japanese.LauncherActivity"
+ android:enabled="@bool/show_launcher_icon"
android:label="@string/app_full_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
+
+ <receiver android:name="org.mozc.android.inputmethod.japanese.LauncherIconVisibilityInitializer">
+ <intent-filter>
+ <action android:name="android.intent.action.BOOT_COMPLETED" />
+ <action android:name="android.intent.action.MY_PACKAGE_REPLACED" />
+ <action android:name="android.intent.action.USER_INITIALIZE" />
+ </intent-filter>
+ </receiver>
+
+ <!-- Preference -->
+ <activity android:name="org.mozc.android.inputmethod.japanese.preference.MozcProxyPreferenceActivity" />
<activity android:name="org.mozc.android.inputmethod.japanese.preference.MozcFragmentPreferenceActivity"
- android:launchMode="singleTask" />
+ android:launchMode="singleTask"
+ android:theme="@style/AppThemeSelectorSettings"/>
<activity android:name="org.mozc.android.inputmethod.japanese.preference.MozcFragmentSoftwareKeyboardAdvancedSettingsPreferenceActivity"
- android:launchMode="singleTop" />
+ android:launchMode="singleTop"
+ android:theme="@style/AppThemeSelectorSettings"/>
<activity android:name="org.mozc.android.inputmethod.japanese.FirstTimeLaunchActivity" />
<activity android:name="org.mozc.android.inputmethod.japanese.preference.MiniBrowserActivity"
@@ -70,11 +90,11 @@
<!-- User dictionary tool -->
<activity android:name="org.mozc.android.inputmethod.japanese.userdictionary.UserDictionaryToolActivity"
- android:enabled="@bool/enable_user_dictionary_tools_activity"
android:label="@string/user_dictionary_tool_app_name"
- android:theme="@style/MozcLightTheme"
android:uiOptions="splitActionBarWhenNarrow"
- android:configChanges="orientation|screenSize">
+ android:configChanges="orientation|screenSize"
+ android:theme="@style/AppThemeSelectorSettings">
+
<!-- Intent filters to receive a file-sending intent for importing user dictionary data.
UserDictionaryToolActivity accepts only file scheme.
-->
@@ -111,11 +131,20 @@
<activity android:name="org.mozc.android.inputmethod.japanese.mushroom.MushroomSelectionActivity"
android:launchMode="singleTask"
android:taskAffinity=".mushroom"
- android:theme="@style/MozcMushroomDialogTheme"
+ android:theme="@android:style/Theme.DeviceDefault.Light.Dialog"
android:windowSoftInputMode="stateAlwaysHidden"
android:excludeFromRecents="true" />
+ <!-- Input device manager -->
+ <receiver android:name="org.mozc.android.inputmethod.japanese.InputDeviceReceiver">
+ <intent-filter>
+ <action android:name="android.hardware.input.action.QUERY_KEYBOARD_LAYOUTS" />
+ </intent-filter>
+ <meta-data android:name="android.hardware.input.metadata.KEYBOARD_LAYOUTS"
+ android:resource="@xml/keyboard_layouts" />
+ </receiver>
+
<!-- Following entry is for unit tests. Do not remove. -->
<!-- The activity is used for testing views. -->
<activity android:name="android.app.Activity" />
diff --git a/src/android/android.gyp b/src/android/android.gyp
index 9943cf8..147f2a3 100644
--- a/src/android/android.gyp
+++ b/src/android/android.gyp
@@ -100,6 +100,7 @@
'type': 'none',
'dependencies': [
'protobuf/protobuf.gyp:protobuf_java',
+ 'resources/resources.gyp:resources',
'sdk_apk_dependencies',
'userfeedback/userfeedback.gyp:userfeedback',
],
@@ -153,9 +154,10 @@
'android_manifest',
'assets',
'mozc',
- 'gen_mozc_drawable',
'guava_library',
'userfeedback/userfeedback.gyp:userfeedback_project',
+ 'subset_font',
+ 'resources/resources.gyp:resources_project',
'support_libraries',
],
},
@@ -219,7 +221,6 @@
'files': [
# Copies the copyright and credit info.
'../data/installer/credits_en.html',
- '../data/installer/credits_ja.html',
],
}],
},
@@ -407,7 +408,7 @@
'outputs': ['dummy_touch_stat_data'],
'action': [
'python', 'gen_touch_event_stats.py',
- '--output_dir', 'assets',
+ '--output_dir', '<(sdk_asset_dir)',
'--stats_data', '../data/typing/touch_event_stats.csv',
'--collected_keyboards', 'collected_keyboards.csv',
],
@@ -528,22 +529,34 @@
],
},
{
- 'target_name': 'gen_mozc_drawable',
+ 'target_name': 'subset_font',
'type': 'none',
+ 'dependencies': [
+ # TODO(komatsu): Is it better to move android_base.gyp?
+ 'resources/resources.gyp:copy_asis_svg',
+ 'resources/resources.gyp:transform_template_svg',
+ ],
+ 'variables': {
+ 'input_font': '<(font_dir)/Noto-Roboto2-Regular.otf',
+ 'fonttools_path': '<(third_party_dir)/fontTools/Lib/fontTools',
+ },
'actions': [
{
- 'action_name': 'generate_pic_files',
+ 'action_name': 'make_subset_font',
'inputs': [
- '<(dummy_input_file)',
- 'gen_mozc_drawable.py',
+ '<(input_font)',
+ 'gen_subset_font.py',
],
'outputs': [
- 'dummy_gen_mozc_drawable_output',
+ '<(sdk_asset_dir)/subset_font.otf',
],
'action': [
- 'python', 'gen_mozc_drawable.py',
- '--svg_dir=../data/images/android/svg',
- '--output_dir=<(resources_project_path)/res/raw',
+ 'python',
+ 'gen_subset_font.py',
+ '--svg_paths=<(shared_intermediate_mozc_dir)/data/images/android/svg/transformed.zip,<(shared_intermediate_mozc_dir)/data/images/android/svg/asis.zip',
+ '--input_font', '<(input_font)',
+ '--output_font', '<@(_outputs)',
+ '--fonttools_path', '<(fonttools_path)',
],
},
],
diff --git a/src/android/android_env.gypi b/src/android/android_env.gypi
index c92a1ba..579b53f 100644
--- a/src/android/android_env.gypi
+++ b/src/android/android_env.gypi
@@ -78,7 +78,7 @@
'native_test_small_targets': [
'oss_data_manager_test',
],
- 'resources_project_path': 'static_resources/resources_oss',
+ 'font_dir': '<(third_party_dir)/noto_font',
},
}],
['android_arch=="arm" and android_compiler=="gcc"', {
diff --git a/src/android/android_resources.gypi b/src/android/android_resources.gypi
new file mode 100644
index 0000000..853b35d
--- /dev/null
+++ b/src/android/android_resources.gypi
@@ -0,0 +1,60 @@
+# Copyright 2010-2014, Google Inc.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+{
+ 'variables': {
+ 'android_translations': [
+ '<!@(ls -1 <(original_sdk_resources_dir)/res/values-ja/*.xml)',
+ ],
+
+ 'android_resources': [
+ '<@(android_translations)',
+
+ '<!@(ls -1 <(original_sdk_resources_dir)/res/drawable/*.xml)',
+ '<!@(ls -1 <(original_sdk_resources_dir)/res/drawable-hdpi/*.png)',
+ '<!@(ls -1 <(original_sdk_resources_dir)/res/drawable-xhdpi/*.png)',
+ '<!@(ls -1 <(original_sdk_resources_dir)/res/layout/*.xml)',
+ '<!@(ls -1 <(original_sdk_resources_dir)/res/layout-land/*.xml)',
+ '<!@(ls -1 <(original_sdk_resources_dir)/res/menu/*.xml)',
+ '<!@(ls -1 <(original_sdk_resources_dir)/res/values/*.xml)',
+ '<!@(ls -1 <(original_sdk_resources_dir)/res/values-h380dp-land/*.xml)',
+ '<!@(ls -1 <(original_sdk_resources_dir)/res/values-h500dp-land/*.xml)',
+ '<!@(ls -1 <(original_sdk_resources_dir)/res/values-h570dp-land/*.xml)',
+ '<!@(ls -1 <(original_sdk_resources_dir)/res/values-h650dp-port/*.xml)',
+ '<!@(ls -1 <(original_sdk_resources_dir)/res/values-h720dp-land/*.xml)',
+ '<!@(ls -1 <(original_sdk_resources_dir)/res/values-h800dp-port/*.xml)',
+ '<!@(ls -1 <(original_sdk_resources_dir)/res/values-h900dp-port/*.xml)',
+ '<!@(ls -1 <(original_sdk_resources_dir)/res/values-land/*.xml)',
+ '<!@(ls -1 <(original_sdk_resources_dir)/res/values-v16/*.xml)',
+ '<!@(ls -1 <(original_sdk_resources_dir)/res/values-v21/*.xml)',
+ '<!@(ls -1 <(original_sdk_resources_dir)/res/xml/*.xml)',
+ ],
+ },
+}
+
diff --git a/src/android/gen_mozc_drawable.py b/src/android/gen_mozc_drawable.py
index ad11a4b..b4f7699 100644
--- a/src/android/gen_mozc_drawable.py
+++ b/src/android/gen_mozc_drawable.py
@@ -70,6 +70,7 @@
CMD_PICTURE_DRAW_ELLIPSE = 7
CMD_PICTURE_DRAW_GROUP_START = 8
CMD_PICTURE_DRAW_GROUP_END = 9
+CMD_PICTURE_DRAW_TEXT = 10
CMD_PICTURE_PATH_EOP = 0
CMD_PICTURE_PATH_MOVE = 1
@@ -88,6 +89,20 @@
CMD_PICTURE_PAINT_STROKE_CAP = 5
CMD_PICTURE_PAINT_STROKE_JOIN = 6
CMD_PICTURE_PAINT_SHADER = 7
+CMD_PICTURE_PAINT_FONT_SIZE = 8
+CMD_PICTURE_PAINT_TEXT_ANCHOR = 9
+CMD_PICTURE_PAINT_DOMINANT_BASELINE = 10
+CMD_PICTURE_PAINT_FONT_WEIGHT = 11
+
+CMD_PICTURE_PAINT_TEXT_ANCHOR_START = 0
+CMD_PICTURE_PAINT_TEXT_ANCHOR_MIDDLE = 1
+CMD_PICTURE_PAINT_TEXT_ANCHOR_END = 2
+
+CMD_PICTURE_PAINT_DOMINANTE_BASELINE_AUTO = 0
+CMD_PICTURE_PAINT_DOMINANTE_BASELINE_CENTRAL = 1
+
+CMD_PICTURE_PAINT_FONT_WEIGHT_NORMAL = 0
+CMD_PICTURE_PAINT_FONT_WEIGHT_BOLD = 1
CMD_PICTURE_SHADER_LINEAR_GRADIENT = 1
CMD_PICTURE_SHADER_RADIAL_GRADIENT = 2
@@ -99,19 +114,22 @@
STYLE_CATEGORY_KEYICON_MAIN_HIGHLIGHT = 3
STYLE_CATEGORY_KEYICON_GUIDE_HIGHLIGHT = 4
STYLE_CATEGORY_KEYICON_BOUND = 5
-STYLE_CATEGORY_KEYICON_FUNCTION = 6
-STYLE_CATEGORY_KEYICON_FUNCTION_DARK = 7
-STYLE_CATEGORY_KEYICON_QWERTY_SHIFT_ON_ARROW = 8
-STYLE_CATEGORY_KEYICON_QWERTY_CAPS_ON_ARROW = 9
-STYLE_CATEGORY_KEYPOPUP_HIGHLIGHT = 10
-STYLE_CATEGORY_KEYICON_POPUP_FUNCTION = 11
-STYLE_CATEGORY_KEYICON_POPUP_FUNCTION_DARK = 12
+STYLE_CATEGORY_KEYICON_TWELVEKEYS_FUNCTION = 6
+STYLE_CATEGORY_KEYICON_TWELVEKEYS_GLOBE = 7
+STYLE_CATEGORY_KEYICON_QWERTY_FUNCTION = 8
+STYLE_CATEGORY_KEYICON_FUNCTION_DARK = 9
+STYLE_CATEGORY_KEYICON_ENTER = 10
+STYLE_CATEGORY_KEYICON_ENTER_CIRCLE = 11
+STYLE_CATEGORY_KEYICON_QWERTY_SHIFT_ON_ARROW = 12
+STYLE_CATEGORY_KEYPOPUP_HIGHLIGHT = 13
# We may be able to reuse same resources for symbol major/minor icons.
-STYLE_CATEGORY_SYMBOL_MAJOR = 13
-STYLE_CATEGORY_SYMBOL_MAJOR_SELECTED = 14
-STYLE_CATEGORY_SYMBOL_MINOR = 15
-STYLE_CATEGORY_SYMBOL_MINOR_SELECTED = 16
-STYLE_CATEGORY_KEYBOARD_FOLDING_BUTTON_BACKGROUND = 17
+STYLE_CATEGORY_SYMBOL_MAJOR = 14
+STYLE_CATEGORY_SYMBOL_MAJOR_SELECTED = 15
+STYLE_CATEGORY_SYMBOL_MAJOR_EMOJI_DISABLE_CIRCLE = 16
+STYLE_CATEGORY_SYMBOL_MINOR = 17
+STYLE_CATEGORY_SYMBOL_MINOR_SELECTED = 18
+STYLE_CATEGORY_KEYBOARD_FOLDING_BUTTON_BACKGROUND_DEFAULT = 19
+STYLE_CATEGORY_KEYBOARD_FOLDING_BUTTON_BACKGROUND_SCROLLED = 20
# We'll check the category id by reverse sorted order, to resolve prefix match
# confliction.
@@ -124,23 +142,28 @@
('style-keyicon-guide-highlight',
STYLE_CATEGORY_KEYICON_GUIDE_HIGHLIGHT),
('style-keyicon-bound', STYLE_CATEGORY_KEYICON_BOUND),
- ('style-keyicon-function', STYLE_CATEGORY_KEYICON_FUNCTION),
+ ('style-keyicon-twelvekeys-function',
+ STYLE_CATEGORY_KEYICON_TWELVEKEYS_FUNCTION),
+ ('style-keyicon-twelvekeys-globe',
+ STYLE_CATEGORY_KEYICON_TWELVEKEYS_GLOBE),
+ ('style-keyicon-qwerty-function',
+ STYLE_CATEGORY_KEYICON_QWERTY_FUNCTION),
('style-keyicon-function-dark', STYLE_CATEGORY_KEYICON_FUNCTION_DARK),
+ ('style-keyicon-enter', STYLE_CATEGORY_KEYICON_ENTER),
+ ('style-keyicon-enter-circle', STYLE_CATEGORY_KEYICON_ENTER_CIRCLE),
('style-keyicon-qwerty-shift-on-arrow',
STYLE_CATEGORY_KEYICON_QWERTY_SHIFT_ON_ARROW),
- ('style-keyicon-qwerty-caps-on-arrow',
- STYLE_CATEGORY_KEYICON_QWERTY_CAPS_ON_ARROW),
('style-keypopup-highlight', STYLE_CATEGORY_KEYPOPUP_HIGHLIGHT),
- ('style-keyicon-popup-function',
- STYLE_CATEGORY_KEYICON_POPUP_FUNCTION),
- ('style-keyicon-popup-function-dark',
- STYLE_CATEGORY_KEYICON_POPUP_FUNCTION_DARK),
('style-symbol-major', STYLE_CATEGORY_SYMBOL_MAJOR),
('style-symbol-major-selected', STYLE_CATEGORY_SYMBOL_MAJOR_SELECTED),
+ ('style-symbol-major-emoji-disable-circle',
+ STYLE_CATEGORY_SYMBOL_MAJOR_EMOJI_DISABLE_CIRCLE),
('style-symbol-minor', STYLE_CATEGORY_SYMBOL_MINOR),
('style-symbol-minor-selected', STYLE_CATEGORY_SYMBOL_MINOR_SELECTED),
- ('style-keyboard-folding-button-background',
- STYLE_CATEGORY_KEYBOARD_FOLDING_BUTTON_BACKGROUND),
+ ('style-keyboard-folding-button-background-default',
+ STYLE_CATEGORY_KEYBOARD_FOLDING_BUTTON_BACKGROUND_DEFAULT),
+ ('style-keyboard-folding-button-background-scrolled',
+ STYLE_CATEGORY_KEYBOARD_FOLDING_BUTTON_BACKGROUND_SCROLLED),
],
reverse=True)
@@ -150,11 +173,11 @@
#
# Format of StateListDrawable:
# 2, [[state_list], drawable]
-COLOR_PATTERN = re.compile(r'#([0-9A-Fa-f]{6})')
+COLOR_PATTERN = re.compile(r'#([0-9A-Fa-f]{3,8}(?![0-9A-Fa-f]))')
PIXEL_PATTERN = re.compile(r'(\d+)(?:px)?')
FLOAT_PATTERN = re.compile(r'^\s*,?\s*([+-]?\d+(?:\.\d*)?(:?e[+-]\d+)?)')
SHADER_PATTERN = re.compile(r'url\(#(.*)\)')
-TRANSFORM_PATTERN = re.compile(r'(matrix|translate)\((.*)\)')
+TRANSFORM_PATTERN = re.compile(r'(matrix|translate|scale)\((.*)\)')
MATRIX_PATTERN = re.compile(r'matrix\((.*)\)')
STOP_COLOR_PATTERN = re.compile(r'stop-color:(.*)')
@@ -162,14 +185,16 @@
HAS_SHADOW = 1
HAS_BELOW_SHADOW = 2
+
class _OutputStream(object):
"""Simple wrapper of output stream by by packing value in big endian."""
+
def __init__(self, output):
self.output = output
def WriteByte(self, value):
if not (0 <= value <= 255):
- logging.critical('overflow')
+ logging.critical('overflow byte')
sys.exit(1)
self.output.write(struct.pack('>B', value & 0xFF))
@@ -187,15 +212,21 @@
# so we can compress the data by using fixed-precision values.
self.output.write(struct.pack('>f', value))
+ def WriteString(self, value):
+ utf8_string = value.encode('utf-8')
+ self.WriteInt16(len(utf8_string))
+ self.output.write(utf8_string)
+
def __enter__(self):
self.output.__enter__()
- def __exit__(self):
- self.output.__exit__()
+ def __exit__(self, exec_type, exec_value, traceback):
+ self.output.__exit__(exec_type, exec_value, traceback)
class MozcDrawableConverter(object):
"""Converter from .svg file to .pic file."""
+
def __init__(self):
pass
@@ -209,12 +240,22 @@
if not m:
return None
- c = int(m.group(1), 16)
- if c < 0 or 0x1000000 <= c:
+ c_str = m.group(1)
+ if 3 <= len(c_str) <= 4:
+ expanded_c_str = ''
+ for ch in c_str:
+ expanded_c_str = expanded_c_str + ch + ch
+ c_str = expanded_c_str
+ if len(c_str) == 6:
+ c_str = 'FF' + c_str
+ if len(c_str) != 8:
+ logging.critical('Invalid color format.')
+ sys.exit(1)
+ c = int(c_str, 16)
+ if c < 0 or 0x100000000 <= c:
logging.critical('Out of color range: %s', color)
sys.exit(1)
- # Set alpha.
- return c | 0xFF000000
+ return c
def _ParseShader(self, color, shader_map):
"""Parses shader attribute and returns a shader name from the given map."""
@@ -278,77 +319,104 @@
y1 = float(node.get('y1'))
x2 = float(node.get('x2'))
y2 = float(node.get('y2'))
- gradientTransform = node.get('gradientTransform')
- if gradientTransform:
- m = MATRIX_PATTERN.match(gradientTransform)
- (m11, m21, m12, m22, m13, m23) = self._ParseFloatList(m.group(1))
+ gradient_transform = node.get('gradientTransform')
+ if gradient_transform:
+ m = MATRIX_PATTERN.match(gradient_transform)
+ (m11, m21, m12, m22, m13, m23) = tuple(self._ParseFloatList(m.group(1)))
(x1, y1) = (m11 * x1 + m12 * y1 + m13, m21 * x1 + m22 * y1 + m23)
(x2, y2) = (m11 * x2 + m12 * y2 + m13, m21 * x2 + m22 * y2 + m23)
color_list = self._ParseStopList(node)
- return { element_id: ('linear', x1, y1, x2, y2, color_list) }
+ return {element_id: ('linear', x1, y1, x2, y2, color_list)}
if node.tag == '{http://www.w3.org/2000/svg}radialGradient':
element_id = node.get('id')
cx = float(node.get('cx'))
cy = float(node.get('cy'))
r = float(node.get('r'))
- gradientTransform = node.get('gradientTransform')
- if gradientTransform:
- m = MATRIX_PATTERN.match(gradientTransform)
+ gradient_transform = node.get('gradientTransform')
+ if gradient_transform:
+ m = MATRIX_PATTERN.match(gradient_transform)
matrix = self._ParseFloatList(m.group(1))
else:
matrix = None
color_list = self._ParseStopList(node)
- return { element_id: ('radial', cx, cy, r, matrix, color_list) }
+ return {element_id: ('radial', cx, cy, r, matrix, color_list)}
return {}
def _ParseStyle(self, node, has_shadow, shader_map):
"""Parses style attribute of the given node."""
- result = {}
+ common_map = {}
+ # Default fill color is black (SVG's spec)
+ fill_map = {'style': 'fill', 'color': 0xFF000000, 'shadow': has_shadow}
+ # Default stroke color is none (SVG's spec)
+ stroke_map = {'style': 'stroke', 'shadow': has_shadow}
+
+ # Special warning for font-size.
+ # Inkscape often unexpectedly converts from sytle to font-size attribute.
+ if node.get('font-size', ''):
+ logging.warning('font-size attribute is not supported.')
+
for attr in node.get('style', '').split(';'):
attr = attr.strip()
if not attr:
continue
command, arg = attr.split(':')
if command == 'fill' or command == 'stroke':
- shader = self._ParseShader(arg, shader_map)
- color = self._ParseColor(arg)
-
- if shader is None and color is None:
- if arg != 'none':
- logging.error('Unknown pattern: %s', arg)
+ paint_map = fill_map if command == 'fill' else stroke_map
+ if arg == 'none':
+ paint_map.pop('color', None)
+ paint_map.pop('shader', None)
continue
- paint_map = {}
+ shader = self._ParseShader(arg, shader_map)
+ color = self._ParseColor(arg)
+ if shader is None and color is None:
+ if arg != 'none':
+ logging.critical('Unknown pattern: %s', arg)
+ sys.exit(1)
+ continue
+
paint_map['style'] = command
if shader is not None:
paint_map['shader'] = shader
if color is not None:
paint_map['color'] = color
- paint_map['shadow'] = has_shadow
-
- result[command] = paint_map
continue
if command == 'stroke-width':
- paint_map = result['stroke']
- paint_map['stroke-width'] = float(arg)
+ stroke_map['stroke-width'] = float(arg)
continue
if command == 'stroke-linecap':
- paint_map = result['stroke']
- paint_map['stroke-linecap'] = arg
+ stroke_map['stroke-linecap'] = arg
continue
if command == 'stroke-linejoin':
- paint_map = result['stroke']
- paint_map['stroke-linejoin'] = arg
+ stroke_map['stroke-linejoin'] = arg
continue
- return sorted(result.values(), key=lambda e: e['style'])
+ # font relating attributes are common to all commands.
+ if command == 'font-size':
+ common_map['font-size'] = self._ParsePixel(arg)
+ if command == 'text-anchor':
+ common_map['text-anchor'] = arg
+ if command == 'dominant-baseline':
+ common_map['dominant-baseline'] = arg
+ if command == 'font-weight':
+ common_map['font-weight'] = arg
+
+ # 'fill' comes first in order to draw 'fill' first (SVG specification).
+ result = []
+ if 'color' in fill_map or 'shader' in fill_map:
+ fill_map.update(common_map)
+ result.append(fill_map)
+ if 'color' in stroke_map or 'shader' in stroke_map:
+ stroke_map.update(common_map)
+ result.append(stroke_map)
+ return result
def _ParseStopList(self, parent_node):
result = []
@@ -390,7 +458,8 @@
output.WriteFloat(2.)
output.WriteInt32(0xFF292929)
- def _ConvertStyle(self, style, output):
+ def _ConvertStyleCommand(self, style, output):
+ """Converts style attribute."""
if style == 'fill':
output.WriteByte(CMD_PICTURE_PAINT_STYLE)
output.WriteByte(0)
@@ -490,23 +559,57 @@
logging.critical('unknown stroke-linejoin: %s', stroke_linejoin)
sys.exit(1)
- def _ConvertStyleMap(self, style_map, output):
- self._ConvertStyle(style_map['style'], output)
- self._MaybeConvertColor(style_map.get('color'), output)
- self._MaybeConvertShader(style_map.get('shader'), output)
- self._MaybeConvertShadow(style_map['shadow'], output)
- self._MaybeConvertStrokeWidth(style_map.get('stroke-width'), output)
- self._MaybeConvertStrokeLinecap(style_map.get('stroke-linecap'), output)
- self._MaybeConvertStrokeLinejoin(style_map.get('stroke-linejoin'), output)
- output.WriteByte(CMD_PICTURE_PAINT_EOP)
+ def _MaybeConvertFontSize(self, font_size, output):
+ if font_size is None:
+ return
+ output.WriteByte(CMD_PICTURE_PAINT_FONT_SIZE)
+ output.WriteFloat(font_size)
+ return
- def _ConvertStyleList(self, style_list, output):
- output.WriteByte(len(style_list))
- for style_map in style_list:
- self._ConvertStyleMap(style_map, output)
+ def _MaybeConvertTextAnchor(self, text_anchor, output):
+ if text_anchor is None:
+ return
+ output.WriteByte(CMD_PICTURE_PAINT_TEXT_ANCHOR)
+ if text_anchor == 'start':
+ output.WriteByte(CMD_PICTURE_PAINT_TEXT_ANCHOR_START)
+ elif text_anchor == 'middle':
+ output.WriteByte(CMD_PICTURE_PAINT_TEXT_ANCHOR_MIDDLE)
+ elif text_anchor == 'end':
+ output.WriteByte(CMD_PICTURE_PAINT_TEXT_ANCHOR_END)
+ else:
+ logging.critical('text-anchor is invalid (%s)', text_anchor)
+ sys.exit(1)
+ return
- def _ConvertStyleCategory(self, style_category, output):
- output.WriteByte(1)
+ def _MaybeConvertDominantBaseline(self, baseline, output):
+ if baseline is None:
+ return
+ output.WriteByte(CMD_PICTURE_PAINT_DOMINANT_BASELINE)
+ if baseline == 'auto':
+ output.WriteByte(CMD_PICTURE_PAINT_DOMINANTE_BASELINE_AUTO)
+ elif baseline == 'central':
+ output.WriteByte(CMD_PICTURE_PAINT_DOMINANTE_BASELINE_CENTRAL)
+ else:
+ logging.critical('dominant-baseline is invalid (%s)', baseline)
+ sys.exit(1)
+ return
+
+ def _MaybeConvertFontWeight(self, weight, output):
+ if weight is None:
+ return
+ output.WriteByte(CMD_PICTURE_PAINT_FONT_WEIGHT)
+ if weight == 'normal':
+ output.WriteByte(CMD_PICTURE_PAINT_FONT_WEIGHT_NORMAL)
+ elif weight == 'bold':
+ output.WriteByte(CMD_PICTURE_PAINT_FONT_WEIGHT_BOLD)
+ else:
+ logging.critical('font-weight is invalid (%s)', weight)
+ sys.exit(1)
+ return
+
+ def _MaybeConvertStyleCategory(self, style_category, output):
+ if style_category is None:
+ return
for id_prefix, category in STYLE_CATEGORY_MAP:
if style_category.startswith(id_prefix):
output.WriteByte(STYLE_CATEGORY_TAG + category)
@@ -514,6 +617,25 @@
logging.critical('unknown style_category: "%s"', style_category)
sys.exit(1)
+ def _ConvertStyle(self, style_category, style_list, output):
+ style_len = len(style_list)
+ output.WriteByte(style_len)
+ for style_map in style_list:
+ self._ConvertStyleCommand(style_map['style'], output)
+ self._MaybeConvertColor(style_map.get('color'), output)
+ self._MaybeConvertShader(style_map.get('shader'), output)
+ self._MaybeConvertShadow(style_map['shadow'], output)
+ self._MaybeConvertStrokeWidth(style_map.get('stroke-width'), output)
+ self._MaybeConvertStrokeLinecap(style_map.get('stroke-linecap'), output)
+ self._MaybeConvertStrokeLinejoin(style_map.get('stroke-linejoin'), output)
+ self._MaybeConvertFontSize(style_map.get('font-size'), output)
+ self._MaybeConvertTextAnchor(style_map.get('text-anchor'), output)
+ self._MaybeConvertDominantBaseline(style_map.get('dominant-baseline'),
+ output)
+ self._MaybeConvertFontWeight(style_map.get('font-weight'), output)
+ self._MaybeConvertStyleCategory(style_category, output)
+ output.WriteByte(CMD_PICTURE_PAINT_EOP)
+
def _ConvertPath(self, node, output):
path = node.get('d')
if path is None:
@@ -650,10 +772,7 @@
self, node, style_category, has_shadow, shader_map, output):
style_list = self._ParseStyle(node, has_shadow, shader_map)
self._ConvertPath(node, output)
- if style_category is not None:
- self._ConvertStyleCategory(style_category, output)
- else:
- self._ConvertStyleList(style_list, output)
+ self._ConvertStyle(style_category, style_list, output)
def _ConvertPolylineElement(
self, node, style_category, has_shadow, shader_map, output):
@@ -667,10 +786,7 @@
output.WriteByte(len(point_list))
for coord in point_list:
output.WriteFloat(coord)
- if style_category is not None:
- self._ConvertStyleCategory(style_category, output)
- else:
- self._ConvertStyleList(style_list, output)
+ self._ConvertStyle(style_category, style_list, output)
def _ConvertPolygonElement(
self, node, style_category, has_shadow, shader_map, output):
@@ -681,10 +797,7 @@
output.WriteByte(len(point_list))
for coord in point_list:
output.WriteFloat(coord)
- if style_category is not None:
- self._ConvertStyleCategory(style_category, output)
- else:
- self._ConvertStyleList(style_list, output)
+ self._ConvertStyle(style_category, style_list, output)
def _ConvertLineElement(
self, node, style_category, has_shadow, shader_map, output):
@@ -698,10 +811,7 @@
output.WriteFloat(y1)
output.WriteFloat(x2)
output.WriteFloat(y2)
- if style_category is not None:
- self._ConvertStyleCategory(style_category, output)
- else:
- self._ConvertStyleList(style_list, output)
+ self._ConvertStyle(style_category, style_list, output)
def _ConvertCircleElement(
self, node, style_category, has_shadow, shader_map, output):
@@ -713,10 +823,7 @@
output.WriteFloat(cx)
output.WriteFloat(cy)
output.WriteFloat(r)
- if style_category is not None:
- self._ConvertStyleCategory(style_category, output)
- else:
- self._ConvertStyleList(style_list, output)
+ self._ConvertStyle(style_category, style_list, output)
def _ConvertEllipseElement(
self, node, style_category, has_shadow, shader_map, output):
@@ -730,10 +837,7 @@
output.WriteFloat(cy)
output.WriteFloat(rx)
output.WriteFloat(ry)
- if style_category is not None:
- self._ConvertStyleCategory(style_category, output)
- else:
- self._ConvertStyleList(style_list, output)
+ self._ConvertStyle(style_category, style_list, output)
def _ConvertRectElement(
self, node, style_category, has_shadow, shader_map, output):
@@ -747,14 +851,39 @@
output.WriteFloat(y)
output.WriteFloat(w)
output.WriteFloat(h)
- if style_category is not None:
- self._ConvertStyleCategory(style_category, output)
- else:
- self._ConvertStyleList(style_list, output)
+ self._ConvertStyle(style_category, style_list, output)
+
+ def _ConvertTextElement(
+ self, node, style_category, has_shadow, shader_map, output):
+ """Converts text element.
+
+ The text element must not have any children.
+
+ Args:
+ node: node
+ style_category: style_category(optional)
+ has_shadow: shadow value
+ shader_map: shader map
+ output: output stream
+ """
+ if not node.text:
+ # Ignore empty text node
+ return
+
+ style_list = self._ParseStyle(node, has_shadow, shader_map)
+ x = float(node.get('x', 0))
+ y = float(node.get('y', 0))
+ output.WriteByte(CMD_PICTURE_DRAW_TEXT)
+ output.WriteFloat(x)
+ output.WriteFloat(y)
+ if node:
+ logging.critical('<text> with children is not supported.')
+ sys.exit(1)
+ output.WriteString(node.text)
+ self._ConvertStyle(style_category, style_list, output)
def _ConvertGroupElement(
self, node, style_category, has_shadow, shader_map, output):
-
transform = node.get('transform')
if transform:
# Output order of 3x3 matrix;
@@ -794,6 +923,25 @@
output.WriteFloat(tx)
output.WriteFloat(ty)
output.WriteFloat(1)
+ elif transformation == 'scale':
+ parsed_coords = tuple(self._ParseFloatList(coords))
+ if len(parsed_coords) != 1 and len(parsed_coords) != 2:
+ logging.critical('Invalid argument for scale: %s', coords)
+ sys.exit(1)
+ sx = parsed_coords[0]
+ if len(parsed_coords) == 1:
+ sy = sx
+ else:
+ sy = parsed_coords[1]
+ output.WriteFloat(sx)
+ output.WriteFloat(0)
+ output.WriteFloat(0)
+ output.WriteFloat(0)
+ output.WriteFloat(sy)
+ output.WriteFloat(0)
+ output.WriteFloat(0)
+ output.WriteFloat(0)
+ output.WriteFloat(1)
else:
# Never reach here. Just in case.
logging.critical('Unsupported transform: %s', transform)
@@ -855,17 +1003,26 @@
node, style_category, has_shadow, shader_map, output)
return
+ if node.tag == '{http://www.w3.org/2000/svg}text':
+ self._ConvertTextElement(
+ node, style_category, has_shadow, shader_map, output)
+ return
+
if node.tag in ['{http://www.w3.org/2000/svg}g',
'{http://www.w3.org/2000/svg}svg']:
self._ConvertGroupElement(
node, style_category, has_shadow, shader_map, output)
return
+ # Ignore following tags.
if node.tag in ['{http://www.w3.org/2000/svg}linearGradient',
- '{http://www.w3.org/2000/svg}radialGradient']:
+ '{http://www.w3.org/2000/svg}radialGradient',
+ '{http://www.w3.org/2000/svg}metadata',
+ '{http://www.w3.org/2000/svg}defs',]:
return
- logging.warning('Unknown element: %s', node.tag)
+ logging.critical('Unknown element: %s', node.tag)
+ sys.exit(1)
def _OutputEOP(self, output):
output.WriteByte(CMD_PICTURE_EOP)
@@ -899,21 +1056,22 @@
return output.output.getvalue()
-def ConvertFiles(svg_dir, output_dir):
+def ConvertFiles(svg_paths, output_dir):
"""Converts SVG files into MechaMozc specific *pic* files.
Args:
- svg_dir: Path to a directory which has svg files (recursively).
+ svg_paths: Comma separated paths to a directory/zip which has svg files
+ (recursively).
output_dir: Path of the destination directory.
"""
- logging.debug('Start SVG conversion. From:%s, To:%s', svg_dir, output_dir)
+ logging.debug('Start SVG conversion. From:%s, To:%s', svg_paths, output_dir)
# Ensure that the output directory exists.
if not os.path.exists(output_dir):
os.makedirs(output_dir)
converter = MozcDrawableConverter()
number_of_conversion = 0
- for dirpath, dirnames, filenames in os.walk(svg_dir):
+ for dirpath, _, filenames in util.WalkFileContainers(svg_paths):
for filename in filenames:
basename, ext = os.path.splitext(filename)
if ext != '.svg':
@@ -971,11 +1129,16 @@
def ParseOptions():
+ """Parses options."""
parser = optparse.OptionParser()
- parser.add_option('--svg_dir', dest='svg_dir',
- help='Path to a directory containing .svg files.')
+ parser.add_option('--svg_paths', dest='svg_paths',
+ help='Comma separated paths to a directory or'
+ ' a .zip file containing .svg files.')
parser.add_option('--output_dir', dest='output_dir',
help='Path to the output directory,')
+ parser.add_option('--build_log', dest='build_log',
+ help='(Optional) Path to build log to generate.'
+ ' If set, nothing will be sent to stderr.')
parser.add_option('--verbose', '-v', dest='verbose',
action='store_true', default=False,
help='Shows verbose message.')
@@ -987,9 +1150,12 @@
logging.getLogger().addFilter(util.ColoredLoggingFilter())
options = ParseOptions()
- if options.verbose:
+ if options.build_log:
+ logging.getLogger().handlers = []
+ logging.getLogger().addHandler(logging.FileHandler(options.build_log, 'w'))
+ if options.verbose or options.build_log:
logging.getLogger().setLevel(logging.DEBUG)
- ConvertFiles(options.svg_dir, options.output_dir)
+ ConvertFiles(options.svg_paths, options.output_dir)
if __name__ == '__main__':
diff --git a/src/android/gen_subset_font.py b/src/android/gen_subset_font.py
new file mode 100644
index 0000000..67db258
--- /dev/null
+++ b/src/android/gen_subset_font.py
@@ -0,0 +1,139 @@
+# -*- coding: utf-8 -*-
+# Copyright 2010-2014, Google Inc.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+"""Generates subset font.
+
+1. Corrects characters from .svg files in given directory.
+ Only text nodes in <text> element are taken into account.
+2. Make subset font which contains only the characters corrected above.
+"""
+
+import logging
+import optparse
+import os
+import shutil
+import subprocess
+import sys
+import tempfile
+from xml.etree import cElementTree as ElementTree
+
+from build_tools import util
+
+
+def ExtractCharactersFromSvgFile(svg_file):
+ result = set()
+ for text in ElementTree.parse(svg_file).findall(
+ './/{http://www.w3.org/2000/svg}text'):
+ if text.text:
+ result.update(tuple(text.text)) # Split into characters.
+ logging.debug('%s: %s', svg_file, result)
+ return result
+
+
+def ExtractCharactersFromDirectory(svg_paths):
+ result = set()
+ for dirpath, _, filenames in util.WalkFileContainers(svg_paths):
+ for filename in filenames:
+ if os.path.splitext(filename)[1] != '.svg':
+ # Do nothing for files other than svg.
+ continue
+ result.update(ExtractCharactersFromSvgFile(
+ os.path.join(dirpath, filename)))
+ return list(result)
+
+
+def MakeSubsetFont(fonttools_path, unicodes, input_font, output_font):
+ """Makes subset font using fontTools toolchain.
+
+ Args:
+ fonttools_path: Path to fontTools library.
+ unicodes: A list of unicode characters of which glyph should be in
+ the output.
+ input_font: Path to input font.
+ output_font: Path to output font.
+ """
+ if not unicodes:
+ # subset.py requires at least one unicode character.
+ logging.debug('No unicode character is specified. Use "A" as stub.')
+ unicodes = [u'A']
+
+ tempdir = tempfile.mkdtemp()
+ try:
+ # fontTools's output file name is fixed (input file path + '.subset').
+ # To get result with specified file name, copy the input font
+ # to temporary directory and copy the result with renaming.
+ shutil.copy(input_font, tempdir)
+ temp_input_font = os.path.join(tempdir, os.path.basename(input_font))
+ commands = ['python', os.path.join(fonttools_path, 'subset.py'),
+ temp_input_font]
+ commands.extend(['U+%08x' % ord(char) for char in unicodes])
+ env = os.environ.copy()
+ # In fontTools toolchain, "from fontTools import XXXX" is executed.
+ # In order for successfull import, add parent directory of the toolchain
+ # into PYTHONPATH.
+ env['PYTHONPATH'] += ':%s' % os.path.join(fonttools_path, '..')
+ if subprocess.call(commands, env=env) != 0:
+ sys.exit(1)
+ shutil.copyfile('%s.subset' % temp_input_font, output_font)
+ finally:
+ shutil.rmtree(tempdir)
+
+
+def ParseOptions():
+ """Parses options."""
+ parser = optparse.OptionParser()
+ parser.add_option('--svg_paths', dest='svg_paths',
+ help='Comma separated paths to a directory or'
+ ' a .zip file containing .svg files.')
+ parser.add_option('--input_font', dest='input_font',
+ help='Path to the input font.')
+ parser.add_option('--output_font', dest='output_font',
+ help='Path to the output font.')
+ parser.add_option('--fonttools_path', dest='fonttools_path',
+ help='Path to fontTools toolchain.')
+ parser.add_option('--verbose', dest='verbose',
+ help='Verbosity')
+ return parser.parse_args()[0]
+
+
+def main():
+ logging.basicConfig(level=logging.INFO, format='%(levelname)s: %(message)s')
+
+ options = ParseOptions()
+ if options.verbose:
+ logging.getLogger().setLevel(logging.DEBUG)
+ unicodes = ExtractCharactersFromDirectory(options.svg_paths)
+ MakeSubsetFont(options.fonttools_path, unicodes,
+ options.input_font, options.output_font)
+
+
+if __name__ == '__main__':
+ main()
+
diff --git a/src/android/proguard-project.txt b/src/android/proguard-project.txt
index f401f16..26c35b4 100644
--- a/src/android/proguard-project.txt
+++ b/src/android/proguard-project.txt
@@ -54,6 +54,11 @@
public static <methods>;
}
+# Skin's fields are accessed by reflection.
+-keepclassmembers class org.mozc.android.inputmethod.japanese.view.Skin {
+ <fields>;
+}
+
# Needed for Guava library.
-libraryjars libs/jsr305.jar
-dontwarn sun.misc.Unsafe
diff --git a/src/android/project.properties b/src/android/project.properties
index 8d01942..8cef1f3 100644
--- a/src/android/project.properties
+++ b/src/android/project.properties
@@ -30,7 +30,7 @@
# Project target.
-target=android-19
+target=android-21
# Location of the ProGuard configuration.
proguard.config=${sdk.dir}/tools/proguard/proguard-android-optimize.txt:proguard-project.txt
@@ -38,5 +38,5 @@
# Library projects
# 'resources' project must not be placed at the tail of reference definition.
# Otherwise aapt command crashes.
-android.library.reference.1=static_resources/resources_oss
+android.library.reference.1=resources
android.library.reference.2=protobuf
diff --git a/src/android/protobuf/project.properties b/src/android/protobuf/project.properties
index 9aacf2f..c3b6d82 100644
--- a/src/android/protobuf/project.properties
+++ b/src/android/protobuf/project.properties
@@ -39,4 +39,4 @@
android.library=true
# Project target.
-target=android-19
+target=android-21
diff --git a/src/android/resources/AndroidManifest.xml b/src/android/resources/AndroidManifest.xml
new file mode 100644
index 0000000..b060f87
--- /dev/null
+++ b/src/android/resources/AndroidManifest.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<manifest
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ package="org.mozc.android.inputmethod.japanese.resources">
+ <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="21" />
+</manifest>
diff --git a/src/android/static_resources/resources_oss/ant.properties b/src/android/resources/ant.properties
similarity index 100%
rename from src/android/static_resources/resources_oss/ant.properties
rename to src/android/resources/ant.properties
diff --git a/src/android/static_resources/resources_oss/build.xml b/src/android/resources/build.xml
similarity index 100%
rename from src/android/static_resources/resources_oss/build.xml
rename to src/android/resources/build.xml
diff --git a/src/android/resources/proguard-project.txt b/src/android/resources/proguard-project.txt
new file mode 100644
index 0000000..5317df3
--- /dev/null
+++ b/src/android/resources/proguard-project.txt
@@ -0,0 +1,49 @@
+# Copyright 2010-2014, Google Inc.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# To enable ProGuard in your project, edit project.properties
+# to define the proguard.config property as described in that file.
+#
+# Add project specific ProGuard rules here.
+# By default, the flags in this file are appended to flags specified
+# in ${sdk.dir}/tools/proguard/proguard-android.txt
+# You can edit the include path and order by changing the ProGuard
+# include property in project.properties.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# Add any project specific keep options here:
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
diff --git a/src/android/resources/project.properties b/src/android/resources/project.properties
new file mode 100644
index 0000000..613d5c2
--- /dev/null
+++ b/src/android/resources/project.properties
@@ -0,0 +1,44 @@
+# Copyright 2010-2014, Google Inc.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# This file is automatically generated by Android Tools.
+# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
+#
+# This file must be checked in Version Control Systems.
+#
+# To customize properties used by the Ant build system edit
+# "ant.properties", and override values to adapt the script to your
+# project structure.
+#
+# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
+#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
+
+# Project target.
+target=android-21
+android.library=true
diff --git a/src/android/resources/resources.gyp b/src/android/resources/resources.gyp
new file mode 100644
index 0000000..fa6b0b9
--- /dev/null
+++ b/src/android/resources/resources.gyp
@@ -0,0 +1,304 @@
+# Copyright 2010-2014, Google Inc.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+{
+ 'variables': {
+ 'relative_dir': 'android/resources',
+ 'abs_android_dir': '<(abs_depth)/<(relative_dir)',
+ # Actions with an existing input and non-existing output behave like
+ # phony rules. Nothing matters for an input but its existence, so
+ # we use 'resources.gyp' as a dummy input since it must exist.
+ 'dummy_input_file': 'resources.gyp',
+ # GYP's 'copies' rule cannot copy a whole directory recursively, so we use
+ # our own script to copy files.
+ 'copy_file': ['python', '../../build_tools/copy_file.py'],
+ 'shared_intermediate_mozc_dir': '<(SHARED_INTERMEDIATE_DIR)/',
+ 'static_resources_dir': '<(abs_depth)/android/static_resources',
+ 'sdk_resources_dir': '<(shared_intermediate_mozc_dir)/android/resources',
+ },
+ 'conditions': [
+ ['branding=="GoogleJapaneseInput"', {
+ 'conditions': [
+ ['android_hide_icon==1', {
+ 'variables': {
+ 'launcher_icon_bools': '<(static_resources_dir)/launcher_icon_resources/launcher_icon_preinstall_bools.xml',
+ },
+ }, { # else
+ 'variables': {
+ 'launcher_icon_bools': '<(static_resources_dir)/launcher_icon_resources/launcher_icon_standard_bools.xml',
+ },
+ }],
+ ['android_release_icon==1', {
+ 'variables': {
+ 'application_icon_dir': '<(static_resources_dir)/application_icon/release_icon/',
+ },
+ }, { # else
+ 'variables': {
+ 'application_icon_dir': '<(static_resources_dir)/application_icon/dogfood_icon/',
+ },
+ }],
+ ],
+ 'variables': {
+ 'original_sdk_resources_dir': '<(static_resources_dir)/resources',
+ },
+ }, { # 'branding!="GoogleJapaneseInput"'
+ 'variables': {
+ 'launcher_icon_bools': '<(static_resources_dir)/launcher_icon_resources/launcher_icon_standard_bools.xml',
+ 'original_sdk_resources_dir': '<(static_resources_dir)/resources_oss',
+ 'application_icon_dir': '<(static_resources_dir)/application_icon/oss_icon/',
+ },
+ }],
+ ],
+ 'targets': [
+ {
+ 'target_name': 'resources',
+ 'type': 'none',
+ 'dependencies': [
+ 'resources_project',
+ ],
+ 'actions': [
+ {
+ 'action_name': 'build_resources',
+ 'inputs': [
+ 'AndroidManifest.xml',
+ 'build.xml',
+ 'project.properties',
+ 'ant.properties',
+ 'proguard-project.txt',
+ ],
+ 'outputs': [
+ 'bin/classes.jar',
+ 'gen/org/mozc/android/inputmethod/japanese/resources/R.java',
+ ],
+ 'includes': ['../ant.gypi'],
+ },
+ ],
+ },
+ {
+ 'target_name': 'resources_project',
+ 'type': 'none',
+ 'dependencies': [
+ 'copy_resources',
+ 'gen_kcm_data',
+ 'gen_mozc_drawable',
+ ],
+ },
+ {
+ # Copies original resources to intermediate directory.
+ # Then make symbolic link from android/resources to the intermediate directory.
+ # The symbolic link is required to build both by ADT and ant.
+ 'target_name': 'copy_resources',
+ 'type': 'none',
+ 'includes': ['../android_resources.gypi'],
+ 'inputs': ['<@(android_resources)'],
+ 'outputs': ['dummy_copy_resources'],
+ 'actions': [
+ {
+ 'action_name': 'copy_files',
+ 'inputs': ['<@(android_resources)'],
+ 'outputs': ['dummy_copy_files'],
+ 'action': [
+ '<@(copy_file)', '-pr',
+ '<@(android_resources)',
+ '<(sdk_resources_dir)',
+ '--src_base', '<(original_sdk_resources_dir)',
+ ],
+ },
+ {
+ # Make sure the link of resources/res does not exist.
+ # the new link is created in the next step.
+ 'action_name': 'remove_symbolic_link',
+ 'inputs': [
+ 'dummy_copy_files'
+ ],
+ 'outputs': [
+ 'dummy_remove_symbolic_link',
+ ],
+ 'action': [
+ 'rm', '-f', 'res',
+ ],
+ },
+ {
+ 'action_name': 'make_symbolic_link',
+ 'inputs': [
+ 'dummy_remove_symbolic_link'
+ ],
+ 'outputs': [
+ 'dummy_make_symbolic_link',
+ ],
+ 'action': [
+ 'ln', '-r', '-s', '-f',
+ '<(sdk_resources_dir)/res',
+ 'res',
+ ],
+ },
+ {
+ 'action_name': 'copy_configuration_dependent_resources',
+ 'inputs': [
+ 'dummy_make_symbolic_link',
+ ],
+ 'outputs': [
+ 'dummy_copy_configuration_dependent_resources',
+ ],
+ 'action': [
+ 'ln', '-s', '-f',
+ '<(launcher_icon_bools)',
+ '<(sdk_resources_dir)/res/values/',
+ ],
+ },
+ {
+ 'action_name': 'copy_application_icons',
+ 'variables': {
+ 'icon_files': [
+ '<(application_icon_dir)/drawable-hdpi/application_icon.png',
+ '<(application_icon_dir)/drawable-mdpi/application_icon.png',
+ '<(application_icon_dir)/drawable-xhdpi/application_icon.png',
+ '<(application_icon_dir)/drawable-xxhdpi/application_icon.png',
+ '<(application_icon_dir)/drawable-xxxhdpi/application_icon.png',
+ ],
+ },
+ 'inputs': [
+ 'dummy_make_symbolic_link',
+ '<@(icon_files)',
+ ],
+ 'outputs': [
+ '<(sdk_resources_dir)/res/drawable-hdpi/application_icon.png',
+ '<(sdk_resources_dir)/res/drawable-mdpi/application_icon.png',
+ '<(sdk_resources_dir)/res/drawable-xhdpi/application_icon.png',
+ '<(sdk_resources_dir)/res/drawable-xxhdpi/application_icon.png',
+ '<(sdk_resources_dir)/res/drawable-xxxhdpi/application_icon.png',
+ ],
+ 'action': ['<@(copy_file)', '-pr',
+ '<@(icon_files)',
+ '<(sdk_resources_dir)/res/',
+ '--src_base', '<(application_icon_dir)'],
+ },
+ ],
+ },
+ {
+ 'target_name': 'gen_kcm_data',
+ 'type': 'none',
+ 'dependencies': ['copy_resources'],
+ 'copies': [{
+ 'destination': '<(sdk_resources_dir)/res/raw',
+ 'files': [
+ '../../data/android/keyboard_layout_japanese109a.kcm',
+ ],
+ }],
+ },
+ {
+ # This (and 'copy_asis_svg') tareget outputs single .zip file
+ # in order to make build system work correctly.
+ # Without this hack, all the names of the generated files
+ # should be listed up in 'inputs' and/or 'outputs' field.
+ 'target_name': 'transform_template_svg',
+ 'type': 'none',
+ 'actions': [
+ {
+ 'action_name': 'transform_template_svg',
+ 'inputs': [
+ '../../data/images/android/template/transform.py',
+ ],
+ 'outputs': [
+ '<(shared_intermediate_mozc_dir)/data/images/android/svg/transformed.zip',
+ ],
+ 'conditions': [
+ ['OS=="linux" or OS=="mac"', {
+ 'inputs': ['<!@(ls -1 ../../data/images/android/template/*.svg)']
+ }, {
+ # TODO: Support Windows.
+ 'inputs': ['<(dummy_input_file)']
+ }],
+ ],
+ 'action': [
+ 'python', '../../data/images/android/template/transform.py',
+ '--output_zip', '<@(_outputs)',
+ ],
+ },
+ ],
+ },
+ {
+ 'target_name': 'copy_asis_svg',
+ 'type': 'none',
+ 'actions': [
+ {
+ 'action_name': 'archive_asis_svg',
+ 'outputs': [
+ '<(shared_intermediate_mozc_dir)/data/images/android/svg/asis.zip',
+ ],
+ 'conditions': [
+ ['OS=="linux" or OS=="mac"', {
+ 'inputs': ['<!@(ls -1 ../../data/images/android/svg/*.svg)']
+ }, {
+ # TODO: Support Windows.
+ 'inputs': ['<(dummy_input_file)']
+ }],
+ ],
+ 'action': [
+ # TODO: Support Windows.
+ 'zip',
+ '-q', # quiet operation
+ '-1', # compress faster
+ '-j', # don't record directory names
+ '<@(_outputs)',
+ '<@(_inputs)',
+ ],
+ },
+ ],
+ },
+ {
+ 'target_name': 'gen_mozc_drawable',
+ 'type': 'none',
+ 'dependencies': [
+ 'copy_asis_svg',
+ 'transform_template_svg',
+ ],
+ 'actions': [
+ {
+ 'action_name': 'generate_pic_files',
+ 'inputs': [
+ '<(shared_intermediate_mozc_dir)/data/images/android/svg/asis.zip',
+ '<(shared_intermediate_mozc_dir)/data/images/android/svg/transformed.zip',
+ '../gen_mozc_drawable.py',
+ ],
+ 'outputs': [
+ '<(shared_intermediate_mozc_dir)/data/images/android/svg/gen_mozc_drawable.log',
+ ],
+ 'dependencies': ['copy_resources'],
+ 'action': [
+ 'python', '../gen_mozc_drawable.py',
+ '--svg_paths=<(shared_intermediate_mozc_dir)/data/images/android/svg/asis.zip,<(shared_intermediate_mozc_dir)/data/images/android/svg/transformed.zip',
+ '--output_dir=<(sdk_resources_dir)/res/raw',
+ '--build_log=<(shared_intermediate_mozc_dir)/data/images/android/svg/gen_mozc_drawable.log',
+ ],
+ },
+ ],
+ },
+ ],
+}
diff --git a/src/android/resources/src/DONT_REMOVE_THIS_DIRECTORY b/src/android/resources/src/DONT_REMOVE_THIS_DIRECTORY
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/android/resources/src/DONT_REMOVE_THIS_DIRECTORY
diff --git a/src/android/src/com/google/android/inputmethod/japanese/ApplicationInitializerFactory.java b/src/android/src/com/google/android/inputmethod/japanese/ApplicationInitializerFactory.java
index d16377a..cd74d4e 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/ApplicationInitializerFactory.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/ApplicationInitializerFactory.java
@@ -32,7 +32,9 @@
import org.mozc.android.inputmethod.japanese.MozcUtil.TelephonyManagerInterface;
import org.mozc.android.inputmethod.japanese.emoji.EmojiProviderType;
import org.mozc.android.inputmethod.japanese.preference.PreferenceUtil;
+import org.mozc.android.inputmethod.japanese.preference.PreferenceUtil.PreferenceManagerStaticInterface;
import org.mozc.android.inputmethod.japanese.resources.R;
+import org.mozc.android.inputmethod.japanese.util.LauncherIconManagerFactory.LauncherIconManager;
import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Optional;
import com.google.common.base.Preconditions;
@@ -90,9 +92,6 @@
@VisibleForTesting
static final String PREF_LAUNCHED_AT_LEAST_ONCE = "pref_launched_at_least_once";
@VisibleForTesting
- static final String PREF_LAST_LAUNCH_ABI_INDEPENDENT_VERSION_CODE =
- "pref_last_launch_abi_independent_version_code";
- @VisibleForTesting
static final String PREF_WELCOME_ACTIVITY_SHOWN = "pref_welcome_activity_shown";
private static class ApplicationInitializerImpl implements ApplicationInitializationStatus {
@@ -113,11 +112,13 @@
@Override
public Optional<Integer> getLastLaunchAbiIndependentVersionCode() {
- if (!this.sharedPreferences.contains(PREF_LAST_LAUNCH_ABI_INDEPENDENT_VERSION_CODE)) {
+ if (!this.sharedPreferences.contains(
+ PreferenceUtil.PREF_LAST_LAUNCH_ABI_INDEPENDENT_VERSION_CODE)) {
return Optional.absent();
}
return Optional.of(
- this.sharedPreferences.getInt(PREF_LAST_LAUNCH_ABI_INDEPENDENT_VERSION_CODE, 0));
+ this.sharedPreferences.getInt(
+ PreferenceUtil.PREF_LAST_LAUNCH_ABI_INDEPENDENT_VERSION_CODE, 0));
}
@Override
@@ -149,10 +150,45 @@
this.telephonyManager = Preconditions.checkNotNull(telephonyManager);
}
- public Optional<Intent> initialize(boolean omitWelcomeActivity,
+ /**
+ * Initializes the application.
+ *
+ * <p>Updates some preferences.
+ * Here we use three preference items.
+ * <ul>
+ * <li>pref_welcome_activity_shown: True if the "Welcome" activity has shown at least once.
+ * <li>pref_last_launch_abi_independent_version_code: The latest version number which
+ * has launched at least once.
+ * <li>pref_launched_at_least_once: Deprecated. True if the the IME has launched at least once.
+ * </ul>
+ * Some preferences should be set at the first time launch.
+ * If the IME is a system application (preinstalled), it shouldn't show "Welcome" activity.
+ * If an update is performed (meaning that the IME becomes non-system app),
+ * the activity should be shown at the first time launch.
+ *
+ * We have to do migration process.
+ * If pref_launched_at_least_once exists, pref_welcome_activity_shown is recognized as
+ * true and pref_last_launch_abi_independent_version_code is recognized as
+ * LAUNCHED_AT_LEAST_ONCE_DEPRECATED_VERSION_CODE. And then pref_launched_at_least_once is
+ * removed.
+ *
+ * @param isSystemApplication true if the app is a system application (== preinstall)
+ * @param isDevChannel true if the app is built for dev channel
+ * @param isWelcomeActivityPreferred true if the configuration prefers to shown welcome activity
+ * if it's not been shown yet.
+ * @param abiIndependentVersionCode ABI independent version code, typically obtained
+ * from {@link MozcUtil#getAbiIndependentVersionCode(Context)}
+ *
+ * @return if forwarding is needed Intent is returned. The caller side should invoke the Intent.
+ */
+ public Optional<Intent> initialize(boolean isSystemApplication,
boolean isDevChannel,
boolean isWelcomeActivityPreferred,
- int abiIndependentVersionCode) {
+ int abiIndependentVersionCode,
+ LauncherIconManager launcherIconManager,
+ PreferenceManagerStaticInterface preferenceManager) {
+ Preconditions.checkNotNull(launcherIconManager);
+ Preconditions.checkNotNull(preferenceManager);
SharedPreferences.Editor editor = sharedPreferences.edit();
Resources resources = context.getResources();
try {
@@ -175,27 +211,43 @@
// Preferences: Update if this is the first launch
if (!lastVersionCode.isPresent()) {
// Store full-screen relating preferences.
+ DisplayMetrics portraitMetrics = getPortraitDisplayMetrics(
+ resources.getDisplayMetrics(), resources.getConfiguration().orientation);
storeDefaultFullscreenMode(
- sharedPreferences,
- getPortraitDisplayMetrics(resources.getDisplayMetrics(),
- resources.getConfiguration().orientation),
- resources.getDimension(R.dimen.fullscreen_threshold),
- resources.getDimension(R.dimen.ime_window_height_portrait),
- resources.getDimension(R.dimen.ime_window_height_landscape));
+ sharedPreferences, portraitMetrics.heightPixels, portraitMetrics.widthPixels,
+ (int) Math.ceil(getDimensionForOrientation(
+ resources, R.dimen.input_frame_height, Configuration.ORIENTATION_PORTRAIT)),
+ (int) Math.ceil(getDimensionForOrientation(
+ resources, R.dimen.input_frame_height, Configuration.ORIENTATION_LANDSCAPE)),
+ resources.getDimensionPixelOffset(R.dimen.fullscreen_threshold));
// Run emoji provider type detection, so that the detected provider will be
// used as the default values of the preference activity.
EmojiProviderType.maybeSetDetectedEmojiProviderType(
sharedPreferences, telephonyManager);
}
+ // Update launcher icon visibility and relating preference.
+ launcherIconManager.updateLauncherIconVisibility(context);
+ // Save default preference to the storage.
+ // NOTE: This method must NOT be called before updateLauncherIconVisibility() above.
+ // Above method requires PREF_LAUNCHER_ICON_VISIBILITY_KEY is not filled with
+ // the default value.
+ // If PREF_LAUNCHER_ICON_VISIBILITY_KEY is filled prior to
+ // updateLauncherIconVisibility(), the launcher icon will be unexpectedly shown
+ // when 2.16.1955.3 (preinstall version) is overwritten by PlayStore version.
+ PreferenceUtil.setDefaultValues(
+ preferenceManager, context, MozcUtil.isDebug(context),
+ resources.getBoolean(R.bool.sending_information_features_enabled));
if (isDevChannel) {
// Usage Stats: Make pref_other_usage_stats_key enabled when dev channel.
editor.putBoolean(PreferenceUtil.PREF_OTHER_USAGE_STATS_KEY, true);
+ maybeShowNotificationForDevChannel(abiIndependentVersionCode,
+ lastVersionCode);
}
// Welcome Activity
- if (!isActivityShown && !omitWelcomeActivity && isWelcomeActivityPreferred) {
+ if (!isActivityShown && !isSystemApplication && isWelcomeActivityPreferred) {
editor.putBoolean(PREF_WELCOME_ACTIVITY_SHOWN, true);
Intent intent = new Intent(context, FirstTimeLaunchActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
@@ -204,18 +256,21 @@
return Optional.absent();
} finally {
editor.remove(PREF_LAUNCHED_AT_LEAST_ONCE);
- editor.putInt(PREF_LAST_LAUNCH_ABI_INDEPENDENT_VERSION_CODE, abiIndependentVersionCode);
+ editor.putInt(PreferenceUtil.PREF_LAST_LAUNCH_ABI_INDEPENDENT_VERSION_CODE,
+ abiIndependentVersionCode);
editor.commit();
}
}
+ private void maybeShowNotificationForDevChannel(
+ int abiIndependentVersionCode, Optional<Integer> lastVersionCode) {
+ }
+
/**
* Returns a modified {@code DisplayMetrics} which equals to portrait modes's one.
*
* If current orientation is PORTRAIT, given {@code currentMetrics} is returned.
* Otherwise {@code currentMetrics}'s {@code heightPixels} and {@code widthPixels} are swapped.
- *
- * Package private for testing purpose.
*/
@VisibleForTesting
static DisplayMetrics getPortraitDisplayMetrics(DisplayMetrics currentMetrics,
@@ -232,27 +287,43 @@
}
/**
+ * Get a dimension for the specified orientation.
+ * This method may be heavy since it updates the {@code resources} twice.
+ */
+ @VisibleForTesting
+ static float getDimensionForOrientation(Resources resources, int id, int orientation) {
+ Configuration configuration = resources.getConfiguration();
+ if (configuration.orientation == orientation) {
+ return resources.getDimension(id);
+ }
+
+ Configuration originalConfiguration = new Configuration(resources.getConfiguration());
+ try {
+ configuration.orientation = orientation;
+ resources.updateConfiguration(configuration, null);
+ return resources.getDimension(id);
+ } finally {
+ resources.updateConfiguration(originalConfiguration, null);
+ }
+ }
+
+ /**
* Stores the default value of "fullscreen mode" to the shared preference.
- *
- * Package private for testing purpose.
*/
@VisibleForTesting
static void storeDefaultFullscreenMode(
- SharedPreferences sharedPreferences, DisplayMetrics displayMetrics,
- float fullscreenThresholdInPixel,
- float portraitImeHeightInPixel, float landscapeImeHeightInPixel) {
+ SharedPreferences sharedPreferences,
+ int portraitDisplayHeight, int landscapeDisplayHeight,
+ int portraitInputFrameHeight, int landscapeInputFrameHeight, int fullscreenThreshold) {
Preconditions.checkNotNull(sharedPreferences);
- Preconditions.checkNotNull(displayMetrics);
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putBoolean(
"pref_portrait_fullscreen_key",
- displayMetrics.heightPixels - portraitImeHeightInPixel
- < fullscreenThresholdInPixel);
+ portraitDisplayHeight - portraitInputFrameHeight < fullscreenThreshold);
editor.putBoolean(
"pref_landscape_fullscreen_key",
- displayMetrics.widthPixels - landscapeImeHeightInPixel
- < fullscreenThresholdInPixel);
+ landscapeDisplayHeight - landscapeInputFrameHeight < fullscreenThreshold);
editor.commit();
}
}
diff --git a/src/android/src/com/google/android/inputmethod/japanese/CandidateView.java b/src/android/src/com/google/android/inputmethod/japanese/CandidateView.java
index 74ceecd..8e3ac7f 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/CandidateView.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/CandidateView.java
@@ -29,6 +29,7 @@
package org.mozc.android.inputmethod.japanese;
+import org.mozc.android.inputmethod.japanese.MozcView.InputFrameFoldButtonClickListener;
import org.mozc.android.inputmethod.japanese.keyboard.BackgroundDrawableFactory.DrawableType;
import org.mozc.android.inputmethod.japanese.protobuf.ProtoCandidates.CandidateList;
import org.mozc.android.inputmethod.japanese.protobuf.ProtoCandidates.CandidateWord;
@@ -40,19 +41,22 @@
import org.mozc.android.inputmethod.japanese.ui.CandidateLayoutRenderer.DescriptionLayoutPolicy;
import org.mozc.android.inputmethod.japanese.ui.CandidateLayoutRenderer.ValueScalingPolicy;
import org.mozc.android.inputmethod.japanese.ui.ConversionCandidateLayouter;
+import org.mozc.android.inputmethod.japanese.ui.InputFrameFoldButtonView;
import org.mozc.android.inputmethod.japanese.ui.ScrollGuideView;
import org.mozc.android.inputmethod.japanese.ui.SpanFactory;
-import org.mozc.android.inputmethod.japanese.view.MozcDrawableFactory;
-import org.mozc.android.inputmethod.japanese.view.SkinType;
+import org.mozc.android.inputmethod.japanese.view.Skin;
+import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Optional;
import com.google.common.base.Preconditions;
import android.content.Context;
import android.content.res.Resources;
+import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.MotionEvent;
+import android.view.View;
import android.view.animation.Animation;
-import android.widget.CompoundButton;
+import android.widget.LinearLayout;
/**
* The view to show candidates.
@@ -60,17 +64,13 @@
*/
public class CandidateView extends InOutAnimatedFrameLayout implements MemoryManageable {
- /**
- * Adapter for conversion candidate selection.
- */
+ /** Adapter for conversion candidate selection. */
+ @VisibleForTesting
static class ConversionCandidateSelectListener implements CandidateSelectListener {
private final ViewEventListener viewEventListener;
ConversionCandidateSelectListener(ViewEventListener viewEventListener) {
- if (viewEventListener == null) {
- throw new NullPointerException("viewEventListener should be non-null.");
- }
- this.viewEventListener = viewEventListener;
+ this.viewEventListener = Preconditions.checkNotNull(viewEventListener);
}
@Override
@@ -80,7 +80,6 @@
}
}
-
private class OutAnimationAdapter extends AnimationAdapter {
@Override
public void onAnimationEnd(Animation animation) {
@@ -94,6 +93,8 @@
private static final String DESCRIPTION_DELIMITER = " \t\n\r\f";
ScrollGuideView scrollGuideView = null;
+ InputFrameFoldButtonView inputFrameFoldButtonView = null;
+ @VisibleForTesting int foldButtonBackgroundVisibilityThreshold = 0;
// TODO(hidehiko): Simplify the interface as this is needed just for expandSuggestion.
private ViewEventListener viewEventListener;
@@ -104,7 +105,7 @@
private boolean isExpanded = false;
{
- setBackgroundDrawableType(DrawableType.CANDIDATE_BACKGROUND);
+ setSpanBackgroundDrawableType(DrawableType.CANDIDATE_BACKGROUND);
layouter = new ConversionCandidateLayouter();
}
@@ -117,6 +118,7 @@
resources.getInteger(R.integer.candidate_scroller_minimum_velocity));
}
+ @VisibleForTesting
void setCandidateTextDimension(float candidateTextSize, float descriptionTextSize) {
Preconditions.checkArgument(candidateTextSize > 0);
Preconditions.checkArgument(descriptionTextSize > 0);
@@ -130,7 +132,9 @@
resources.getDimension(R.dimen.symbol_description_right_padding);
float descriptionVerticalPadding =
resources.getDimension(R.dimen.symbol_description_bottom_padding);
+ float separatorWidth = resources.getDimensionPixelSize(R.dimen.candidate_separator_width);
+ carrierEmojiRenderHelper.setCandidateTextSize(candidateTextSize);
candidateLayoutRenderer.setValueTextSize(candidateTextSize);
candidateLayoutRenderer.setValueHorizontalPadding(valueHorizontalPadding);
candidateLayoutRenderer.setValueScalingPolicy(ValueScalingPolicy.HORIZONTAL);
@@ -138,6 +142,7 @@
candidateLayoutRenderer.setDescriptionHorizontalPadding(descriptionHorizontalPadding);
candidateLayoutRenderer.setDescriptionVerticalPadding(descriptionVerticalPadding);
candidateLayoutRenderer.setDescriptionLayoutPolicy(DescriptionLayoutPolicy.EXCLUSIVE);
+ candidateLayoutRenderer.setSeparatorWidth(separatorWidth);
SpanFactory spanFactory = new SpanFactory();
spanFactory.setValueTextSize(candidateTextSize);
@@ -160,6 +165,8 @@
layouter.setValueHeight(candidateTextSize);
layouter.setValueHorizontalPadding(valueHorizontalPadding);
layouter.setValueVerticalPadding(valueVerticalPadding);
+
+ foldButtonBackgroundVisibilityThreshold = (int) (1.8 * valueVerticalPadding);
}
@Override
@@ -171,7 +178,9 @@
this.viewEventListener = viewEventListener;
}
+ @Override
void reset() {
+ super.reset();
isExpanded = false;
}
@@ -179,6 +188,10 @@
protected void onScrollChanged(int scrollX, int scrollY, int oldScrollX, int oldScrollY) {
super.onScrollChanged(scrollX, scrollY, oldScrollX, oldScrollY);
updateScrollGuide();
+ if (inputFrameFoldButtonView != null) {
+ inputFrameFoldButtonView.showBackgroundForScrolled(
+ scrollY > foldButtonBackgroundVisibilityThreshold);
+ }
expandSuggestionIfNeeded();
}
@@ -228,6 +241,17 @@
super.update(candidateList);
updateScrollGuide();
}
+
+ @Override
+ protected Drawable getViewBackgroundDrawable(Skin skin) {
+ return skin.conversionCandidateViewBackgroundDrawable;
+ }
+
+ @Override
+ public void setSkin(Skin skin) {
+ super.setSkin(skin);
+ candidateLayoutRenderer.setSeparatorColor(skin.candidateBackgroundSeparatorColor);
+ }
}
public CandidateView(Context context) {
@@ -250,32 +274,36 @@
ConversionCandidateWordView conversionCandidateWordView = getConversionCandidateWordView();
scrollGuideView.setScroller(conversionCandidateWordView.scroller);
conversionCandidateWordView.scrollGuideView = scrollGuideView;
-
- // Initialize inputFrameFoldButton.
- CompoundButton inputFrameFoldButton = getInputFrameFoldButton();
- inputFrameFoldButton.setBackgroundDrawable(
- new MozcDrawableFactory(getResources()).getDrawable(R.raw.keyboard__fold__tab).orNull());
+ conversionCandidateWordView.inputFrameFoldButtonView = getInputFrameFoldButton();
+ // To use Canvas#drawPicture(), the view shouldn't be h/w accelerated.
+ getInputFrameFoldButton().setLayerType(View.LAYER_TYPE_SOFTWARE, null);
reset();
}
- CompoundButton getInputFrameFoldButton() {
- return CompoundButton.class.cast(findViewById(R.id.input_frame_fold_button));
+ @VisibleForTesting InputFrameFoldButtonView getInputFrameFoldButton() {
+ return InputFrameFoldButtonView.class.cast(findViewById(R.id.input_frame_fold_button));
}
- ConversionCandidateWordView getConversionCandidateWordView() {
+ @VisibleForTesting ConversionCandidateWordView getConversionCandidateWordView() {
return ConversionCandidateWordView.class.cast(findViewById(R.id.candidate_word_view));
}
- ScrollGuideView getScrollGuideView() {
+ private ConversionCandidateWordContainerView getConversionCandidateWordContainerView() {
+ return ConversionCandidateWordContainerView.class.cast(
+ findViewById(R.id.conversion_candidate_word_container_view));
+ }
+
+ @VisibleForTesting ScrollGuideView getScrollGuideView() {
return ScrollGuideView.class.cast(findViewById(R.id.candidate_scroll_guide_view));
}
- /**
- * Updates the view based on {@code Command}.
- * Exposed as protected for testing purpose.
- */
- protected void update(Command outCommand) {
+ @VisibleForTesting LinearLayout getCandidateWordFrame() {
+ return LinearLayout.class.cast(findViewById(R.id.candidate_word_frame));
+ }
+
+ /** Updates the view based on {@code Command}. */
+ void update(Command outCommand) {
if (outCommand == null) {
getConversionCandidateWordView().update(null);
return;
@@ -283,8 +311,8 @@
Input input = outCommand.getInput();
CandidateList allCandidateWords = outCommand.getOutput().getAllCandidateWords();
- if (input.getType() == CommandType.SEND_COMMAND &&
- input.getCommand().getType() == SessionCommand.CommandType.EXPAND_SUGGESTION) {
+ if (input.getType() == CommandType.SEND_COMMAND
+ && input.getCommand().getType() == SessionCommand.CommandType.EXPAND_SUGGESTION) {
getConversionCandidateWordView().updateForExpandSuggestion(allCandidateWords);
} else {
getConversionCandidateWordView().update(allCandidateWords);
@@ -293,19 +321,18 @@
/**
* Register callback object.
- * Note: exposed as a protected method for testing purpose.
* @param listener
*/
- protected void setViewEventListener(ViewEventListener listener,
- OnClickListener inputFrameFoldButtonClickListner) {
- if (listener == null) {
- throw new NullPointerException("lister must be non-null.");
- }
+ void setViewEventListener(ViewEventListener listener) {
+ Preconditions.checkNotNull(listener);
ConversionCandidateWordView conversionCandidateWordView = getConversionCandidateWordView();
conversionCandidateWordView.setViewEventListener(listener);
conversionCandidateWordView.setCandidateSelectListener(
new ConversionCandidateSelectListener(listener));
- getInputFrameFoldButton().setOnClickListener(inputFrameFoldButtonClickListner);
+ }
+
+ void setInputFrameFoldButtonOnClickListener(InputFrameFoldButtonClickListener listener) {
+ getInputFrameFoldButton().setOnClickListener(Preconditions.checkNotNull(listener));
}
void reset() {
@@ -317,9 +344,14 @@
getInputFrameFoldButton().setChecked(checked);
}
- void setSkinType(SkinType skinType) {
- getScrollGuideView().setSkinType(skinType);
- getConversionCandidateWordView().setSkinType(skinType);
+ @SuppressWarnings("deprecation")
+ void setSkin(Skin skin) {
+ Preconditions.checkNotNull(skin);
+ getScrollGuideView().setSkin(skin);
+ getConversionCandidateWordView().setSkin(skin);
+ getInputFrameFoldButton().setSkin(skin);
+ getCandidateWordFrame().setBackgroundColor(skin.candidateBackgroundBottomColor);
+ invalidate();
}
void setCandidateTextDimension(float candidateTextSize, float descriptionTextSize) {
@@ -328,12 +360,13 @@
getConversionCandidateWordView().setCandidateTextDimension(candidateTextSize,
descriptionTextSize);
+ getConversionCandidateWordContainerView().setCandidateTextDimension(candidateTextSize);
}
- void setNarrowMode(boolean narrowMode) {
- getInputFrameFoldButton().setVisibility(narrowMode ? GONE : VISIBLE);
+ void enableFoldButton(boolean enabled) {
+ getInputFrameFoldButton().setVisibility(enabled ? VISIBLE : GONE);
getConversionCandidateWordView().getCandidateLayouter()
- .reserveEmptySpanForInputFoldButton(!narrowMode);
+ .reserveEmptySpanForInputFoldButton(enabled);
}
@Override
diff --git a/src/android/src/com/google/android/inputmethod/japanese/CandidateViewManager.java b/src/android/src/com/google/android/inputmethod/japanese/CandidateViewManager.java
new file mode 100644
index 0000000..6b875f9
--- /dev/null
+++ b/src/android/src/com/google/android/inputmethod/japanese/CandidateViewManager.java
@@ -0,0 +1,456 @@
+// Copyright 2010-2014, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package org.mozc.android.inputmethod.japanese;
+
+import org.mozc.android.inputmethod.japanese.InOutAnimatedFrameLayout.VisibilityChangeListener;
+import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Command;
+import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.CompositionMode;
+import org.mozc.android.inputmethod.japanese.view.Skin;
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Optional;
+import com.google.common.base.Preconditions;
+
+import android.annotation.SuppressLint;
+import android.annotation.TargetApi;
+import android.content.res.Resources;
+import android.view.View;
+import android.view.animation.AlphaAnimation;
+import android.view.animation.Animation;
+import android.view.animation.AnimationSet;
+import android.view.animation.DecelerateInterpolator;
+import android.view.animation.TranslateAnimation;
+import android.view.inputmethod.CursorAnchorInfo;
+import android.view.inputmethod.EditorInfo;
+
+/**
+ * Manages candidate views (floating, on-keyboard).
+ */
+class CandidateViewManager implements MemoryManageable {
+
+ /** Listener interface to handle the height change of a keyboard candidate view. */
+ public interface KeyboardCandidateViewHeightListener {
+ public void onExpanded();
+ public void onCollapse();
+ }
+
+ private static class ClearCandidateAnimationListener implements Animation.AnimationListener {
+ private final CandidateView candidateView;
+
+ public ClearCandidateAnimationListener(CandidateView candidateView) {
+ this.candidateView = Preconditions.checkNotNull(candidateView);
+ }
+
+ @Override
+ public void onAnimationEnd(Animation animation) {
+ candidateView.update(EMPTY_COMMAND);
+ }
+
+ @Override
+ public void onAnimationRepeat(Animation animation) {
+ }
+
+ @Override
+ public void onAnimationStart(Animation animation) {
+ }
+ }
+
+ /** {@link CandidateMode#FLOATING} is only available on Lollipop or later. */
+ private enum CandidateMode {
+ KEYBOARD, NUMBER, FLOATING,
+ }
+
+ private static final Animation NO_ANIMATION = new Animation() {};
+ @VisibleForTesting static final Command EMPTY_COMMAND = Command.getDefaultInstance();
+
+ @VisibleForTesting final CandidateView keyboardCandidateView;
+ @VisibleForTesting final FloatingCandidateView floatingCandidateView;
+ /**
+ * SymbolInputView which number candidate view belongs to is created lazily.
+ * Therefore number candidate view is not accessible when CandidateViewManager is instantiated.
+ */
+ @VisibleForTesting Optional<CandidateView> numberCandidateView = Optional.absent();
+
+ private Optional<KeyboardCandidateViewHeightListener> keyboardCandidateViewHeightListener =
+ Optional.absent();
+ /**
+ * Current active candidate view.
+ * {@link CandidateMode#FLOATING} is only available on Lollipop or later.
+ */
+ private CandidateMode candidateMode = CandidateMode.KEYBOARD;
+
+ /** Cache of {@link EditorInfo} instance to switch candidate views. */
+ private EditorInfo editorInfo = new EditorInfo();
+ /** Cache of {@link Skin} instance to switch candidate views. */
+ private Skin skin = Skin.getFallbackInstance();
+ /** Cache of candidate text size. */
+ private float candidateTextSize;
+ /** Cache of description text size. */
+ private float descriptionTextSize;
+ /** Cache of {@link ViewEventListener}. */
+ private Optional<ViewEventListener> viewEventListener = Optional.absent();
+ /** Cache of {@link VisibilityChangeListener}. */
+ private Optional<VisibilityChangeListener> onVisibilityChangeListener = Optional.absent();
+ /**
+ * True if extracted mode (== fullscreen mode) is activated.
+ * <p>
+ * On extracted mode, floating candidate should be disabled in order to show extracted view
+ * in the screen.
+ */
+ private boolean isExtractedMode = false;
+ private boolean allowFloatingMode = false;
+ private boolean narrowMode = false;
+
+ /**
+ * Cache of {@link CursorAnchorInfo} instance to switch candidate views.
+ * This field is null if and only-if Floating candidate view is NOT available, so we don't mark
+ * this value as {code @Nullable} since this field should NOT be used in that situation.
+ */
+ private CursorAnchorInfo cursorAnchorInfo;
+
+ private Animation numberCandidateViewInAnimation = NO_ANIMATION;
+ private Animation numberCandidateViewOutAnimation = NO_ANIMATION;
+
+ @SuppressLint("NewApi")
+ public CandidateViewManager(
+ CandidateView keyboardCandidateView, FloatingCandidateView floatingCandidateView) {
+ this.keyboardCandidateView = Preconditions.checkNotNull(keyboardCandidateView);
+ this.floatingCandidateView = Preconditions.checkNotNull(floatingCandidateView);
+ if (FloatingCandidateView.isAvailable()) {
+ cursorAnchorInfo = new CursorAnchorInfo.Builder().build();
+ }
+
+ keyboardCandidateView.setOutAnimationListener(
+ new ClearCandidateAnimationListener(keyboardCandidateView));
+ }
+
+ public void setNumberCandidateView(CandidateView numberCandidateView) {
+ this.numberCandidateView = Optional.of(numberCandidateView);
+ numberCandidateView.setSkin(skin);
+ numberCandidateView.enableFoldButton(true);
+ numberCandidateView.setInAnimation(numberCandidateViewInAnimation);
+ numberCandidateView.setOutAnimation(numberCandidateViewOutAnimation);
+ numberCandidateView.setOutAnimationListener(
+ new ClearCandidateAnimationListener(numberCandidateView));
+ if (candidateTextSize > 0 && descriptionTextSize > 0) {
+ numberCandidateView.setCandidateTextDimension(candidateTextSize, descriptionTextSize);
+ }
+ if (viewEventListener.isPresent()) {
+ numberCandidateView.setViewEventListener(viewEventListener.get());
+ }
+ numberCandidateView.setOnVisibilityChangeListener(onVisibilityChangeListener.orNull());
+ }
+
+ /**
+ * Updates the candidate views by {@code outCommand} and may invoke some animations.
+ * <p>
+ * On-keyboard candidate view may animate and the animation listener may be invoked.
+ */
+ public void update(Command outCommand) {
+ updateInternal(Preconditions.checkNotNull(outCommand), true);
+ }
+
+ private void updateWithoutAnimation(Command outCommand) {
+ updateInternal(outCommand, false);
+ }
+
+ private void updateInternal(Command outCommand, boolean withAnimation) {
+ if (candidateMode == CandidateMode.FLOATING) {
+ floatingCandidateView.setCandidates(outCommand);
+ return;
+ }
+
+ Preconditions.checkState(
+ candidateMode == CandidateMode.KEYBOARD
+ || (candidateMode == CandidateMode.NUMBER && numberCandidateView.isPresent()));
+ CandidateView candidateView = (candidateMode == CandidateMode.KEYBOARD)
+ ? keyboardCandidateView : numberCandidateView.get();
+
+ if (withAnimation) {
+ if (hasCandidates(outCommand)) {
+ candidateView.update(outCommand);
+ // Call CandidateView#update only if there are some candidates in the output.
+ // In such case the candidate view will clear its canvas.
+ startKeyboardCandidateViewInAnimation();
+ } else {
+ // We don't call update method here and clear candidates at the end of this animation,
+ // because it will clear the view's contents during the animation.
+ startKeyboardCandidateViewOutAnimation();
+ }
+ } else {
+ candidateView.update(outCommand);
+ if (hasCandidates(outCommand)) {
+ candidateView.setVisibility(View.VISIBLE);
+ } else {
+ candidateView.setVisibility(View.GONE);
+ }
+ }
+ }
+
+ public void setOnVisibilityChangeListener(Optional<VisibilityChangeListener> listener) {
+ this.onVisibilityChangeListener = Preconditions.checkNotNull(listener);
+ keyboardCandidateView.setOnVisibilityChangeListener(listener.orNull());
+ if (numberCandidateView.isPresent()) {
+ numberCandidateView.get().setOnVisibilityChangeListener(listener.orNull());
+ }
+ }
+
+ /**
+ * Enables/Disables a floating candidate view.
+ * <p>
+ * This method turned floating mode on if it is preferred.
+ * The floating candidate view is only available on Lollipop or later.
+ */
+ private void updateCandiadateWindowActivation() {
+ boolean floatingMode = narrowMode && allowFloatingMode && !isExtractedMode;
+ if (floatingMode == (candidateMode == CandidateMode.FLOATING)) {
+ return;
+ }
+
+ // Clears candidates on the current candidate window.
+ updateWithoutAnimation(EMPTY_COMMAND);
+
+ // Updates the other candidate view.
+ candidateMode = floatingMode ? CandidateMode.FLOATING : CandidateMode.KEYBOARD;
+ updateWithoutAnimation(EMPTY_COMMAND);
+ setEditorInfo(editorInfo);
+ if (FloatingCandidateView.isAvailable()) {
+ setCursorAnchorInfo(cursorAnchorInfo);
+ }
+ // In order to show extracted view correctly, make the visibility GONE when it is not activated.
+ floatingCandidateView.setVisibility(floatingMode ? View.VISIBLE : View.GONE);
+ }
+
+ public void setAllowFloatingMode(boolean allowFloatingMode) {
+ Preconditions.checkArgument(!allowFloatingMode || FloatingCandidateView.isAvailable());
+ this.allowFloatingMode = allowFloatingMode;
+ updateCandiadateWindowActivation();
+ }
+
+ public void setNarrowMode(boolean narrowMode) {
+ this.narrowMode = narrowMode;
+ keyboardCandidateView.enableFoldButton(!narrowMode);
+ updateCandiadateWindowActivation();
+ }
+
+ public void setNumberMode(boolean numberMode) {
+ CandidateMode nextMode = numberMode ? CandidateMode.NUMBER : CandidateMode.KEYBOARD;
+ if (candidateMode == nextMode) {
+ return;
+ }
+ if (nextMode == CandidateMode.NUMBER) {
+ // Hide keyboard candidate view since it is higher than symbol view.
+ updateWithoutAnimation(EMPTY_COMMAND);
+ }
+ candidateMode = nextMode;
+ // Set empty command in order to clear the candidates which have been registered into the next
+ // view. Otherwise such candidates (typically they are obsolete) are shown unexpectedly.
+ // TODO(hsumita): Revisit when Mozc server returns candidates for SWITCH_INPUT_MODE command.
+ updateWithoutAnimation(EMPTY_COMMAND);
+ }
+
+ public void setCandidateTextDimension(float candidateTextSize, float descriptionTextSize) {
+ this.candidateTextSize = candidateTextSize;
+ this.descriptionTextSize = descriptionTextSize;
+ if (numberCandidateView.isPresent()) {
+ numberCandidateView.get().setCandidateTextDimension(
+ candidateTextSize, descriptionTextSize);
+ } else {
+ keyboardCandidateView.setCandidateTextDimension(candidateTextSize, descriptionTextSize);
+ }
+ }
+
+ public void setInputFrameFoldButtonChecked(boolean isChecked) {
+ switch (candidateMode) {
+ case KEYBOARD:
+ keyboardCandidateView.setInputFrameFoldButtonChecked(isChecked);
+ break;
+ case NUMBER:
+ numberCandidateView.get().setInputFrameFoldButtonChecked(isChecked);
+ break;
+ case FLOATING:
+ throw new IllegalStateException("Fold button is not available on floating mode.");
+ }
+ }
+
+ public void setEditorInfo(EditorInfo info) {
+ this.editorInfo = Preconditions.checkNotNull(info);
+ if (candidateMode == CandidateMode.FLOATING) {
+ floatingCandidateView.setEditorInfo(info);
+ }
+ }
+
+ @TargetApi(21)
+ public void setCursorAnchorInfo(CursorAnchorInfo info) {
+ this.cursorAnchorInfo = Preconditions.checkNotNull(info);
+ if (candidateMode == CandidateMode.FLOATING) {
+ floatingCandidateView.setCursorAnchorInfo(info);
+ }
+ }
+
+ public void setSkin(Skin skin) {
+ this.skin = Preconditions.checkNotNull(skin);
+ keyboardCandidateView.setSkin(skin);
+ if (numberCandidateView.isPresent()) {
+ numberCandidateView.get().setSkin(skin);
+ }
+ }
+
+ public void setEventListener(ViewEventListener viewEventListener,
+ KeyboardCandidateViewHeightListener hightListener) {
+ this.viewEventListener = Optional.of(viewEventListener);
+ this.keyboardCandidateViewHeightListener = Optional.of(hightListener);
+ keyboardCandidateView.setViewEventListener(viewEventListener);
+ floatingCandidateView.setViewEventListener(viewEventListener);
+ if (numberCandidateView.isPresent()) {
+ numberCandidateView.get().setViewEventListener(viewEventListener);
+ }
+ }
+
+ /**
+ * Set true if extracted mode (== fullscreen mode) is activated.
+ */
+ public void setExtractedMode(boolean isExtractedMode) {
+ this.isExtractedMode = isExtractedMode;
+ updateCandiadateWindowActivation();
+ }
+
+ public void setHardwareCompositionMode(CompositionMode mode) {
+ if (isFloatingMode()) {
+ floatingCandidateView.setCompositionMode(mode);
+ }
+ }
+
+ public void reset() {
+ keyboardCandidateView.clearAnimation();
+ keyboardCandidateView.setVisibility(View.GONE);
+ keyboardCandidateView.reset();
+ if (numberCandidateView.isPresent()) {
+ numberCandidateView.get().clearAnimation();
+ numberCandidateView.get().setVisibility(View.GONE);
+ numberCandidateView.get().reset();
+ }
+
+ candidateMode = CandidateMode.KEYBOARD;
+ floatingCandidateView.setVisibility(View.GONE);
+ }
+
+ public void resetHeightDependingComponents(
+ Resources resources, int windowHeight, int inputFrameHeight) {
+ Preconditions.checkNotNull(resources);
+
+ int keyboardCandidateViewHeight = windowHeight - inputFrameHeight;
+ long duration = resources.getInteger(R.integer.candidate_frame_transition_duration);
+ float fromAlpha = 0.0f;
+ float toAlpha = 1.0f;
+
+ keyboardCandidateView.setInAnimation(createKeyboardCandidateViewTransitionAnimation(
+ keyboardCandidateViewHeight, 0, fromAlpha, toAlpha, duration));
+ keyboardCandidateView.setOutAnimation(createKeyboardCandidateViewTransitionAnimation(
+ 0, keyboardCandidateViewHeight, toAlpha, fromAlpha, duration));
+
+ int numberCandidateViewHeight = resources.getDimensionPixelSize(R.dimen.button_frame_height);
+ numberCandidateViewInAnimation = createKeyboardCandidateViewTransitionAnimation(
+ numberCandidateViewHeight, 0, fromAlpha, toAlpha, duration);
+ numberCandidateViewOutAnimation = createKeyboardCandidateViewTransitionAnimation(
+ 0, numberCandidateViewHeight, toAlpha, fromAlpha, duration);
+ if (numberCandidateView.isPresent()) {
+ numberCandidateView.get().setInAnimation(numberCandidateViewInAnimation);
+ numberCandidateView.get().setOutAnimation(numberCandidateViewOutAnimation);
+ }
+ }
+
+ public boolean isKeyboardCandidateViewVisible() {
+ return keyboardCandidateView.getVisibility() == View.VISIBLE;
+ }
+
+ private static Animation createKeyboardCandidateViewTransitionAnimation(
+ int fromY, int toY, float fromAlpha, float toAlpha, long duration) {
+ AnimationSet animation = new AnimationSet(false);
+ animation.setDuration(duration);
+
+ AlphaAnimation alphaAnimation = new AlphaAnimation(fromAlpha, toAlpha);
+ alphaAnimation.setDuration(duration);
+ animation.addAnimation(alphaAnimation);
+
+ TranslateAnimation translateAnimation = new TranslateAnimation(0, 0, fromY, toY);
+ translateAnimation.setInterpolator(new DecelerateInterpolator());
+ translateAnimation.setDuration(duration);
+ animation.addAnimation(translateAnimation);
+ return animation;
+ }
+
+ private void startKeyboardCandidateViewInAnimation() {
+ switch (candidateMode) {
+ case KEYBOARD:
+ keyboardCandidateView.startInAnimation();
+ if (keyboardCandidateViewHeightListener.isPresent()) {
+ keyboardCandidateViewHeightListener.get().onExpanded();
+ }
+ break;
+ case NUMBER:
+ numberCandidateView.get().startInAnimation();
+ break;
+ case FLOATING:
+ throw new IllegalStateException("Floating mode doesn't support in-animation.");
+ }
+ }
+
+ private void startKeyboardCandidateViewOutAnimation() {
+ switch (candidateMode) {
+ case KEYBOARD:
+ if (keyboardCandidateViewHeightListener.isPresent()) {
+ keyboardCandidateViewHeightListener.get().onCollapse();
+ }
+ keyboardCandidateView.startOutAnimation();
+ break;
+ case NUMBER:
+ numberCandidateView.get().startOutAnimation();
+ break;
+ case FLOATING:
+ throw new IllegalStateException("Floating mode doesn't support out-animation.");
+ }
+ }
+
+ private static boolean hasCandidates(Command command) {
+ return command.getOutput().getAllCandidateWords().getCandidatesCount() > 0;
+ }
+
+ @Override
+ public void trimMemory() {
+ keyboardCandidateView.trimMemory();
+ if (numberCandidateView.isPresent()) {
+ numberCandidateView.get().trimMemory();
+ }
+ }
+
+ public boolean isFloatingMode() {
+ return candidateMode == CandidateMode.FLOATING;
+ }
+}
diff --git a/src/android/src/com/google/android/inputmethod/japanese/CandidateWordView.java b/src/android/src/com/google/android/inputmethod/japanese/CandidateWordView.java
index d456b99..f9ff8be 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/CandidateWordView.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/CandidateWordView.java
@@ -42,23 +42,23 @@
import org.mozc.android.inputmethod.japanese.ui.CandidateLayoutRenderer;
import org.mozc.android.inputmethod.japanese.ui.CandidateLayouter;
import org.mozc.android.inputmethod.japanese.ui.SnapScroller;
-import org.mozc.android.inputmethod.japanese.view.SkinType;
+import org.mozc.android.inputmethod.japanese.view.CarrierEmojiRenderHelper;
+import org.mozc.android.inputmethod.japanese.view.Skin;
import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Optional;
import com.google.common.base.Preconditions;
import android.content.Context;
import android.graphics.Canvas;
-import android.graphics.Paint;
-import android.graphics.Paint.Align;
import android.graphics.RectF;
+import android.graphics.drawable.Drawable;
import android.support.v4.view.ViewCompat;
-import android.support.v4.widget.EdgeEffectCompat;
import android.util.AttributeSet;
import android.view.GestureDetector;
import android.view.GestureDetector.SimpleOnGestureListener;
import android.view.MotionEvent;
import android.view.View;
+import android.widget.EdgeEffect;
import javax.annotation.Nullable;
@@ -73,14 +73,16 @@
* Handles gestures to scroll candidate list and choose a candidate.
*/
class CandidateWordGestureDetector {
+
class CandidateWordViewGestureListener extends SimpleOnGestureListener {
+
@Override
public boolean onFling(
MotionEvent event1, MotionEvent event2, float velocityX, float velocityY) {
float velocity = orientationTrait.projectVector(velocityX, velocityY);
// As fling is started, current action is not tapping.
// Reset pressing state so that candidate selection is not triggered at touch up event.
- releaseCandidate();
+ reset();
// Fling makes scrolling.
scroller.fling(-(int) velocity);
invalidate();
@@ -96,7 +98,7 @@
orientationTrait.scrollTo(CandidateWordView.this, scroller.getScrollPosition());
// As scroll is started, current action is not tapping.
// Reset pressing state so that candidate selection is not triggered at touch up event.
- releaseCandidate();
+ reset();
// Edge effect. Now, in production, we only support vertical scroll.
if (oldScrollPosition + distance < 0) {
@@ -119,7 +121,7 @@
// GestureDetector cannot handle all complex gestures which we need.
// But we use GestureDetector for some gesture recognition
// because implementing whole gesture detection logic by ourselves is a bit tedious.
- final GestureDetector gestureDetector;
+ private final GestureDetector gestureDetector;
/**
* Points to an instance of currently pressed candidate word. Or {@code null} if any
@@ -146,9 +148,10 @@
span.getRight(), row.getTop() + row.getHeight());
}
- private void releaseCandidate() {
+ void reset() {
pressedCandidate = null;
pressedRowIndex = Optional.absent();
+ // NOTE: candidateRect doesn't need reset.
}
CandidateWord getPressedCandidate() {
@@ -195,6 +198,14 @@
}
boolean onTouchEvent(MotionEvent event) {
+ // Before delegation to gesture detector, handle ACTION_UP event
+ // in order to release edge effect.
+ if (event.getAction() == MotionEvent.ACTION_UP) {
+ topEdgeEffect.onRelease();
+ bottomEdgeEffect.onRelease();
+ invalidate();
+ }
+
if (gestureDetector.onTouchEvent(event)) {
return true;
}
@@ -207,23 +218,25 @@
scroller.stopScrolling();
if (!topEdgeEffect.isFinished()) {
topEdgeEffect.onRelease();
+ invalidate();
}
if (!bottomEdgeEffect.isFinished()) {
bottomEdgeEffect.onRelease();
+ invalidate();
}
return true;
case MotionEvent.ACTION_MOVE:
if (pressedCandidate != null) {
// Turn off highlighting if contact point gets out of the candidate.
if (!candidateRect.contains(scrolledX, scrolledY)) {
- releaseCandidate();
+ reset();
invalidate();
}
}
return true;
case MotionEvent.ACTION_CANCEL:
if (pressedCandidate != null) {
- releaseCandidate();
+ reset();
invalidate();
}
return true;
@@ -232,7 +245,7 @@
if (candidateRect.contains(scrolledX, scrolledY) && candidateSelectListener != null) {
candidateSelectListener.onCandidateSelected(pressedCandidate, pressedRowIndex);
}
- releaseCandidate();
+ reset();
invalidate();
}
return true;
@@ -346,8 +359,8 @@
// Finally, we only need vertical scrolling.
// TODO(hidehiko): Remove horizontal scrolling related codes.
- private final EdgeEffectCompat topEdgeEffect = new EdgeEffectCompat(getContext());
- private final EdgeEffectCompat bottomEdgeEffect = new EdgeEffectCompat(getContext());
+ private final EdgeEffect topEdgeEffect = new EdgeEffect(getContext());
+ private final EdgeEffect bottomEdgeEffect = new EdgeEffect(getContext());
// The Scroller which manages the status of scrolling the view.
// Default behavior of ScrollView does not suffice our UX design
@@ -367,8 +380,10 @@
// No padding by default.
private int horizontalPadding = 0;
+ protected final CarrierEmojiRenderHelper carrierEmojiRenderHelper =
+ new CarrierEmojiRenderHelper(this);
protected final CandidateLayoutRenderer candidateLayoutRenderer =
- new CandidateLayoutRenderer(this);
+ new CandidateLayoutRenderer();
CandidateWordGestureDetector candidateWordGestureDetector =
new CandidateWordGestureDetector(getContext());
@@ -377,7 +392,7 @@
private final OrientationTrait orientationTrait;
protected final BackgroundDrawableFactory backgroundDrawableFactory =
- new BackgroundDrawableFactory(getResources().getDisplayMetrics().density);
+ new BackgroundDrawableFactory(getResources());
private DrawableType backgroundDrawableType = null;
private final CandidateWindowAccessibilityDelegate accessibilityDelegate;
@@ -404,6 +419,12 @@
ViewCompat.setAccessibilityDelegate(this, accessibilityDelegate);
}
+ void reset() {
+ calculatedLayout = null;
+ currentCandidateList = null;
+ candidateWordGestureDetector.reset();
+ }
+
void setCandidateSelectListener(CandidateSelectListener candidateSelectListener) {
this.candidateSelectListener = candidateSelectListener;
}
@@ -436,19 +457,18 @@
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
- candidateLayoutRenderer.onAttachedToWindow();
+ carrierEmojiRenderHelper.onAttachedToWindow();
}
@Override
protected void onDetachedFromWindow() {
- candidateLayoutRenderer.onDetachedFromWindow();
+ carrierEmojiRenderHelper.onDetachedFromWindow();
super.onDetachedFromWindow();
}
public void setEmojiProviderType(EmojiProviderType providerType) {
Preconditions.checkNotNull(providerType);
-
- candidateLayoutRenderer.setEmojiProviderType(providerType);
+ carrierEmojiRenderHelper.setEmojiProviderType(providerType);
}
@Override
@@ -506,7 +526,8 @@
CandidateWord pressedCandidate = candidateWordGestureDetector.getPressedCandidate();
int pressedCandidateIndex = (pressedCandidate != null && pressedCandidate.hasIndex())
? pressedCandidate.getIndex() : -1;
- candidateLayoutRenderer.drawCandidateLayout(canvas, calculatedLayout, pressedCandidateIndex);
+ candidateLayoutRenderer.drawCandidateLayout(
+ canvas, calculatedLayout, pressedCandidateIndex, carrierEmojiRenderHelper);
} finally {
canvas.restoreToCount(saveCount);
}
@@ -525,11 +546,13 @@
topEdgeEffect.onAbsorb(velocity.intValue());
if (!bottomEdgeEffect.isFinished()) {
bottomEdgeEffect.onRelease();
+ invalidate();
}
} else if (velocity > 0) {
bottomEdgeEffect.onAbsorb(velocity.intValue());
if (!topEdgeEffect.isFinished()) {
topEdgeEffect.onRelease();
+ invalidate();
}
}
}
@@ -586,7 +609,9 @@
void update(CandidateList candidateList) {
CandidateList previousCandidateList = currentCandidateList;
currentCandidateList = candidateList;
- candidateLayoutRenderer.setCandidateList(Optional.fromNullable(candidateList));
+ Optional<CandidateList> optionalCandidateList = Optional.fromNullable(candidateList);
+ candidateLayoutRenderer.setCandidateList(optionalCandidateList);
+ carrierEmojiRenderHelper.setCandidateList(optionalCandidateList);
if (layouter != null && !equals(candidateList, previousCandidateList)) {
updateCalculatedLayout();
}
@@ -655,32 +680,29 @@
return currentCandidateList;
}
- /**
- * Utility method for creating paint instance.
- */
- protected static Paint createPaint(
- boolean antiAlias, int color, Align textAlign, float textSize) {
- Paint paint = new Paint();
- paint.setAntiAlias(antiAlias);
- paint.setColor(color);
- paint.setTextAlign(textAlign);
- paint.setTextSize(textSize);
- return paint;
- }
-
- protected void setBackgroundDrawableType(DrawableType drawableType) {
+ protected void setSpanBackgroundDrawableType(DrawableType drawableType) {
backgroundDrawableType = drawableType;
- resetBackground();
+ resetSpanBackground();
}
- private void resetBackground() {
- candidateLayoutRenderer.setSpanBackgroundDrawable(
- Optional.fromNullable(backgroundDrawableFactory.getDrawable(backgroundDrawableType)));
+ private void resetSpanBackground() {
+ Drawable drawable = (backgroundDrawableType != null)
+ ? backgroundDrawableFactory.getDrawable(backgroundDrawableType) : null;
+ candidateLayoutRenderer.setSpanBackgroundDrawable(Optional.fromNullable(drawable));
}
- void setSkinType(SkinType skinType) {
- backgroundDrawableFactory.setSkinType(skinType);
- resetBackground();
+ /**
+ * Returns a Drawable which should be set as the view's background.
+ */
+ protected abstract Drawable getViewBackgroundDrawable(Skin skin);
+
+ @SuppressWarnings("deprecation")
+ void setSkin(Skin skin) {
+ backgroundDrawableFactory.setSkin(Preconditions.checkNotNull(skin));
+ resetSpanBackground();
+ candidateLayoutRenderer.setSkin(skin);
+ setBackgroundDrawable(
+ getViewBackgroundDrawable(skin).getConstantState().newDrawable());
}
@Override
@@ -697,4 +719,15 @@
}
return false;
}
+
+ @Override
+ protected void onVisibilityChanged(View changedView, int visibility) {
+ super.onVisibilityChanged(changedView, visibility);
+ // If this view gets invisible, reset the internal state of the gesture detector.
+ // Otherwise UP event, which is sent after this view being invisible, will cause
+ // unexpected onCandidateSelected callback.
+ if (visibility != View.VISIBLE) {
+ candidateWordGestureDetector.reset();
+ }
+ }
}
diff --git a/src/android/src/com/google/android/inputmethod/japanese/ComposingTextTrackingInputConnection.java b/src/android/src/com/google/android/inputmethod/japanese/ComposingTextTrackingInputConnection.java
index 5325745..4a1e04d 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/ComposingTextTrackingInputConnection.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/ComposingTextTrackingInputConnection.java
@@ -194,4 +194,9 @@
}
return new ComposingTextTrackingInputConnection(baseConnection);
}
+
+ @Override
+ public boolean requestCursorUpdates(int cursorUpdateMode) {
+ return baseConnection.requestCursorUpdates(cursorUpdateMode);
+ }
}
diff --git a/src/android/src/com/google/android/inputmethod/japanese/ConversionCandidateWordContainerView.java b/src/android/src/com/google/android/inputmethod/japanese/ConversionCandidateWordContainerView.java
index 1c88a74..6507095 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/ConversionCandidateWordContainerView.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/ConversionCandidateWordContainerView.java
@@ -78,8 +78,7 @@
void setCandidateTextDimension(float candidateTextSize) {
Preconditions.checkArgument(candidateTextSize > 0);
- foldingIconSize = candidateTextSize
- + getResources().getDimension(R.dimen.candidate_vertical_padding_size) * 2;
+ foldingIconSize = getResources().getDimension(R.dimen.candidate_fold_icon_width);
}
@Override
diff --git a/src/android/src/com/google/android/inputmethod/japanese/DependencyFactory.java b/src/android/src/com/google/android/inputmethod/japanese/DependencyFactory.java
index 8880954..38c25e4 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/DependencyFactory.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/DependencyFactory.java
@@ -52,6 +52,7 @@
*/
public class DependencyFactory {
+
/**
* Dependencies.
*/
diff --git a/src/android/src/com/google/android/inputmethod/japanese/FeedbackManager.java b/src/android/src/com/google/android/inputmethod/japanese/FeedbackManager.java
index 50d5ff0..98a76e4 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/FeedbackManager.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/FeedbackManager.java
@@ -53,11 +53,35 @@
/**
* Fired when the input view is expanded (the candidate view is fold).
*/
- INPUTVIEW_EXPAND(true),
+ INPUTVIEW_EXPAND(true, AudioManager.FX_KEYPRESS_STANDARD),
/**
* Fired when the input view is fold (the candidate view is expand).
*/
- INPUTVIEW_FOLD(true),
+ INPUTVIEW_FOLD(true, AudioManager.FX_KEYPRESS_STANDARD),
+ /**
+ * Fired when the symbol input view is closed.
+ */
+ SYMBOL_INPUTVIEW_CLOSED(true, AudioManager.FX_KEYPRESS_STANDARD),
+ /**
+ * Fired when a minor category is selected.
+ */
+ SYMBOL_INPUTVIEW_MINOR_CATEGORY_SELECTED(true, AudioManager.FX_KEYPRESS_STANDARD),
+ /**
+ * Fired when a major category is selected.
+ */
+ SYMBOL_INPUTVIEW_MAJOR_CATEGORY_SELECTED(true, AudioManager.FX_KEYPRESS_STANDARD),
+ /**
+ * Fired when microphone button is touched.
+ */
+ MICROPHONE_BUTTON_DOWN(true, AudioManager.FX_KEYPRESS_STANDARD),
+ /**
+ * Fired when the hardware composition button in narrow frame is touched.
+ */
+ NARROW_FRAME_HARDWARE_COMPOSITION_BUTTON_DOWN(true, AudioManager.FX_KEYPRESS_STANDARD),
+ /**
+ * Fired when the widen button in narrow frame is touched.
+ */
+ NARROW_FRAME_WIDEN_BUTTON_DOWN(true, AudioManager.FX_KEYPRESS_STANDARD),
;
// Constant value to indicate no sound feedback should be played.
static final int NO_SOUND = -1;
@@ -103,7 +127,7 @@
private boolean isHapticFeedbackEnabled;
private long hapticFeedbackDuration = 30; // 30ms by default.
private boolean isSoundFeedbackEnabled;
- private float soundFeedbackVolume = 0.1f; // System default volume parameter.
+ private float soundFeedbackVolume = 0.4f; // System default volume parameter.
@VisibleForTesting final FeedbackListener feedbackListener;
/**
diff --git a/src/android/src/com/google/android/inputmethod/japanese/FloatingCandidateView.java b/src/android/src/com/google/android/inputmethod/japanese/FloatingCandidateView.java
new file mode 100644
index 0000000..97048db
--- /dev/null
+++ b/src/android/src/com/google/android/inputmethod/japanese/FloatingCandidateView.java
@@ -0,0 +1,550 @@
+// Copyright 2010-2014, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package org.mozc.android.inputmethod.japanese;
+
+import org.mozc.android.inputmethod.japanese.protobuf.ProtoCandidates.Category;
+import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Command;
+import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.CompositionMode;
+import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Output;
+import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Preedit.Segment;
+import org.mozc.android.inputmethod.japanese.ui.FloatingCandidateLayoutRenderer;
+import org.mozc.android.inputmethod.japanese.ui.FloatingModeIndicator;
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Optional;
+import com.google.common.base.Preconditions;
+
+import android.annotation.TargetApi;
+import android.content.Context;
+import android.content.res.Resources;
+import android.graphics.Canvas;
+import android.graphics.Rect;
+import android.graphics.RectF;
+import android.os.Build;
+import android.text.InputType;
+import android.util.AttributeSet;
+import android.view.Gravity;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.inputmethod.CursorAnchorInfo;
+import android.view.inputmethod.EditorInfo;
+import android.widget.PopupWindow;
+
+/**
+ * Floating candidate view for hardware keyboard.
+ */
+@TargetApi(21)
+public class FloatingCandidateView extends View {
+
+ private interface FloatingCandidateViewProxy {
+ public void draw(Canvas canvas);
+ public void viewSizeChanged(int width, int height);
+ public void setCursorAnchorInfo(CursorAnchorInfo info);
+ public void setCandidates(Command outCommand);
+ public void setEditorInfo(EditorInfo editorInfo);
+ public void setCompositionMode(CompositionMode mode);
+ public void setViewEventListener(ViewEventListener listener);
+ public void setVisibility(int visibility);
+ public Optional<Rect> getVisibleRect();
+ }
+
+ private static class FloatingCandidateViewStub implements FloatingCandidateViewProxy {
+ @Override
+ public void draw(Canvas canvas) {}
+
+ @Override
+ public void viewSizeChanged(int width, int height) {}
+
+ @Override
+ public void setCursorAnchorInfo(CursorAnchorInfo info) {}
+
+ @Override
+ public void setCandidates(Command outCommand) {}
+
+ @Override
+ public void setEditorInfo(EditorInfo editorInfo) {}
+
+ @Override
+ public void setCompositionMode(CompositionMode mode) {}
+
+ @Override
+ public void setViewEventListener(ViewEventListener listener) {}
+
+ @Override
+ public void setVisibility(int visibility) {}
+
+ @Override
+ public Optional<Rect> getVisibleRect() {
+ return Optional.absent();
+ }
+ }
+
+ @TargetApi(21)
+ private static class FloatingCandidateViewImpl implements FloatingCandidateViewProxy {
+
+ private final View parentView;
+
+ /** Layouts the floating candidate window and draws it's contents. */
+ private final FloatingCandidateLayoutRenderer layoutRenderer;
+
+ private final FloatingModeIndicator modeIndicator;
+
+ /**
+ * Pop-up window to handle touch events.
+ * <p>
+ * A touch down event on outside a touchable region (set by {@link MozcService#onComputeInsets})
+ * cannot be caught by view, and we cannot expand the touchable region since all touch down
+ * events inside the region are not delegated to a background application.
+ * To handle these touch events, we employ pop-up window.
+ * <p>
+ * This window is always invisible since we cannot control the transition behavior.
+ * (e.g. Pop-up window always move with animation)
+ */
+ private final PopupWindow touchEventReceiverWindow;
+
+ private final int windowVerticalMargin;
+ private final int windowHorizontalMargin;
+
+ /**
+ * Base position of the floating candidate window.
+ * <p>
+ * It is same as the cursor rectangle on pre-composition state, and the left-edge of the focused
+ * segment on other states.
+ */
+ private int basePositionTop;
+ private int basePositionBottom;
+ private int basePositionX;
+ private Optional<CursorAnchorInfo> cursorAnchorInfo = Optional.absent();
+ private Category candidatesCategory = Category.CONVERSION;
+ private int highlightedCharacterStart;
+ private int compositionCharacterEnd;
+ /** True if EditorInfo says suggestion should be suppressed. */
+ private boolean suppressSuggestion;
+ /**
+ * Horizontal offset of the candidate window. See also {@link FloatingCandidateLayoutRenderer}
+ */
+ private int offsetX;
+ /** Vertical offset of the candidate window. See also {@link FloatingCandidateLayoutRenderer} */
+ private int offsetY;
+ private boolean isCandidateWindowShowing;
+
+ public FloatingCandidateViewImpl(View parentView) {
+ Context context = Preconditions.checkNotNull(parentView).getContext();
+ this.parentView = parentView;
+ this.layoutRenderer = new FloatingCandidateLayoutRenderer(context.getResources());
+ this.modeIndicator = new FloatingModeIndicator(parentView);
+ this.touchEventReceiverWindow = createPopupWindow(context);
+ Resources resources = context.getResources();
+ this.windowVerticalMargin =
+ Math.round(resources.getDimension(R.dimen.floating_candidate_window_vertical_margin));
+ this.windowHorizontalMargin =
+ Math.round(resources.getDimension(R.dimen.floating_candidate_window_horizontal_margin));
+ }
+
+ public FloatingCandidateViewImpl(View parentView, PopupWindow popupWindowMock,
+ FloatingCandidateLayoutRenderer layoutRenderer,
+ FloatingModeIndicator modeIndicator) {
+ this.parentView = Preconditions.checkNotNull(parentView);
+ this.layoutRenderer = Preconditions.checkNotNull(layoutRenderer);
+ this.modeIndicator = Preconditions.checkNotNull(modeIndicator);
+ this.touchEventReceiverWindow = Preconditions.checkNotNull(popupWindowMock);
+ Resources resources = parentView.getContext().getResources();
+ this.windowVerticalMargin =
+ resources.getDimensionPixelSize(R.dimen.floating_candidate_window_vertical_margin);
+ this.windowHorizontalMargin =
+ resources.getDimensionPixelSize(R.dimen.floating_candidate_window_horizontal_margin);
+ }
+
+ private PopupWindow createPopupWindow(Context context) {
+ return new PopupWindow(new View(context) {
+ @Override
+ public boolean onTouchEvent(MotionEvent event) {
+ Optional<Rect> rect = layoutRenderer.getWindowRect();
+ if (!rect.isPresent()) {
+ return false;
+ }
+
+ MotionEvent copiedEvent = MotionEvent.obtain(event);
+ try {
+ copiedEvent.offsetLocation(rect.get().left, rect.get().top);
+ layoutRenderer.onTouchEvent(copiedEvent);
+ // TODO(hsumita): Don't invalidate the view if not necessary.
+ parentView.invalidate();
+ } finally {
+ copiedEvent.recycle();
+ }
+ return true;
+ }
+ });
+ }
+
+ @Override
+ public void draw(Canvas canvas) {
+ if (!isCandidateWindowShowing) {
+ return;
+ }
+
+ int saveId = canvas.save(Canvas.MATRIX_SAVE_FLAG);
+ try {
+ canvas.translate(offsetX, offsetY);
+ layoutRenderer.draw(canvas);
+ } finally {
+ canvas.restoreToCount(saveId);
+ }
+ }
+
+ @Override
+ public void viewSizeChanged(int width, int height) {
+ layoutRenderer.setMaxWidth(width - windowHorizontalMargin * 2);
+ updateCandidateWindowWithSize(width, height);
+ }
+
+ /** Sets {@link CursorAnchorInfo} to update the candidate window position. */
+ @Override
+ public void setCursorAnchorInfo(CursorAnchorInfo info) {
+ cursorAnchorInfo = Optional.of(info);
+ modeIndicator.setCursorAnchorInfo(info);
+ updateCandidateWindow();
+ }
+
+ /** Sets {@link Command} to update the contents of the candidate window. */
+ @Override
+ public void setCandidates(Command outCommand) {
+ Output output = Preconditions.checkNotNull(outCommand).getOutput();
+ layoutRenderer.setCandidates(outCommand);
+ modeIndicator.setCommand(outCommand);
+ highlightedCharacterStart = output.getPreedit().getHighlightedPosition();
+ int currentPreeditPosition = 0;
+ for (Segment segment : output.getPreedit().getSegmentList()) {
+ currentPreeditPosition += segment.getValueLength();
+ }
+ compositionCharacterEnd = currentPreeditPosition;
+ candidatesCategory = output.getCandidates().getCategory();
+ updateCandidateWindow();
+ }
+
+ /** Sets {@link EditorInfo} for context-aware behavior. */
+ @Override
+ public void setEditorInfo(EditorInfo editorInfo) {
+ Preconditions.checkNotNull(editorInfo);
+ boolean previusSuppressSuggestion = suppressSuggestion;
+ suppressSuggestion = shouldSuppressSuggestion(editorInfo);
+ if (previusSuppressSuggestion != suppressSuggestion) {
+ updateCandidateWindow();
+ }
+ }
+
+ @Override
+ public void setCompositionMode(CompositionMode mode) {
+ modeIndicator.setCompositionMode(mode);
+ }
+
+ /** Set view event listener to handle events invoked by the candidate window. */
+ @Override
+ public void setViewEventListener(ViewEventListener listener) {
+ layoutRenderer.setViewEventListener(Preconditions.checkNotNull(listener));
+ }
+
+ @Override
+ public void setVisibility(int visibility) {
+ if (visibility != View.VISIBLE) {
+ modeIndicator.hide();
+ }
+ }
+
+ /**
+ * Updates the candidate window.
+ * <p>
+ * All layout related states should be updated before call this method.
+ */
+ private void updateCandidateWindow() {
+ updateCandidateWindowWithSize(parentView.getWidth(), parentView.getHeight());
+ }
+
+ private int calculateWindowLeftPosition(Rect rect, int basePositionX, int viewWidth) {
+ return MozcUtil.clamp(
+ basePositionX + rect.left,
+ windowHorizontalMargin, viewWidth - rect.width() - windowHorizontalMargin);
+ }
+
+ /**
+ * Updates the candidate window with width and height.
+ * <p>
+ * All layout related states should be updated before call this method.
+ */
+ private void updateCandidateWindowWithSize(int viewWidth, int viewHeight) {
+ if (suppressSuggestion && candidatesCategory == Category.SUGGESTION) {
+ dismissCandidateWindow();
+ return;
+ }
+
+ Optional<Rect> optionalWindowRect = layoutRenderer.getWindowRect();
+ if (!optionalWindowRect.isPresent()) {
+ dismissCandidateWindow();
+ return;
+ }
+
+ Rect rect = optionalWindowRect.get();
+ updateBasePosition(rect, viewWidth);
+ int lowerAreaHeight = viewHeight - basePositionBottom - windowVerticalMargin;
+ int upperAreaHeight = basePositionTop - windowVerticalMargin;
+ int top = (lowerAreaHeight < rect.height() && lowerAreaHeight < upperAreaHeight)
+ ? MozcUtil.clamp(basePositionTop - rect.height() - windowVerticalMargin,
+ 0, viewHeight - rect.height())
+ : Math.max(0, basePositionBottom + windowVerticalMargin);
+ int left = calculateWindowLeftPosition(rect, basePositionX, viewWidth);
+
+ offsetX = left - rect.left;
+ offsetY = top - rect.top;
+
+ rect.offset(offsetX, offsetY);
+ showCandidateWindow(rect);
+ }
+
+ /** Return true if floating candidate window should be suppressed. */
+ private boolean shouldSuppressSuggestion(EditorInfo editorInfo) {
+ if ((editorInfo.inputType & EditorInfo.TYPE_MASK_CLASS) != InputType.TYPE_CLASS_TEXT) {
+ return true;
+ }
+
+ if ((editorInfo.inputType
+ & (InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS | InputType.TYPE_TEXT_FLAG_AUTO_COMPLETE))
+ != 0) {
+ return true;
+ }
+
+ switch (editorInfo.inputType & EditorInfo.TYPE_MASK_VARIATION) {
+ case InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS:
+ case InputType.TYPE_TEXT_VARIATION_WEB_EMAIL_ADDRESS:
+ case InputType.TYPE_TEXT_VARIATION_PASSWORD:
+ case InputType.TYPE_TEXT_VARIATION_WEB_PASSWORD:
+ case InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD:
+ case InputType.TYPE_TEXT_VARIATION_URI:
+ case InputType.TYPE_TEXT_VARIATION_FILTER:
+ return true;
+ default:
+ return false;
+ }
+ }
+
+ private void resetBasePosition() {
+ basePositionTop = 0;
+ basePositionBottom = 0;
+ basePositionX = 0;
+ return;
+ }
+
+ /**
+ * Update {@code basePositionTop}, {@code basePositionBottom} and {@code basePositionX} using
+ * {@code cursorAnchorInfo}.
+ */
+ private void updateBasePosition(Rect windowRect, int viewWidth) {
+ if (!cursorAnchorInfo.isPresent()) {
+ resetBasePosition();
+ return;
+ }
+
+ CursorAnchorInfo info = cursorAnchorInfo.get();
+ int composingStartIndex = info.getComposingTextStart() + highlightedCharacterStart;
+ int composingEndIndex = info.getComposingTextStart() + compositionCharacterEnd - 1;
+ RectF firstCharacterBounds = info.getCharacterBounds(composingStartIndex);
+ float[] points;
+ if (firstCharacterBounds != null) {
+ points = new float[] {firstCharacterBounds.left, firstCharacterBounds.top,
+ firstCharacterBounds.left, firstCharacterBounds.bottom};
+ } else if (!Float.isNaN(info.getInsertionMarkerHorizontal())) {
+ points = new float[] {info.getInsertionMarkerHorizontal(), info.getInsertionMarkerTop(),
+ info.getInsertionMarkerHorizontal(), info.getInsertionMarkerBottom()};
+ } else {
+ resetBasePosition();
+ return;
+ }
+
+ // Adjust the bottom base position not to hide composition characters by the floating
+ // candidate window.
+ int windowLeft = calculateWindowLeftPosition(windowRect, (int) points[0], viewWidth);
+ for (int i = composingEndIndex; i > composingStartIndex; --i) {
+ RectF bounds = info.getCharacterBounds(i);
+ if (bounds == null) {
+ continue;
+ }
+ if (bounds.bottom <= points[3]) {
+ break;
+ }
+ if (bounds.right > windowLeft) {
+ points[3] = bounds.bottom;
+ break;
+ }
+ }
+
+ info.getMatrix().mapPoints(points);
+ int[] screenOffset = new int[2];
+ parentView.getLocationOnScreen(screenOffset);
+ basePositionX = Math.round(points[0]) - screenOffset[0];
+ basePositionTop = Math.round(points[1]) - screenOffset[1];
+ basePositionBottom = Math.round(points[3]) - screenOffset[1];
+ }
+
+ /**
+ * Shows the candidate window.
+ * <p>
+ * First {@code touchEventReceiverWindow} is shown (or is updated its position if it has been
+ * already shown). Then this view is invalidated. As the result {@code draw} will be called back
+ * and visible candidate window will be shown.
+ */
+ private void showCandidateWindow(Rect rect) {
+ isCandidateWindowShowing = true;
+ if (touchEventReceiverWindow.isShowing()) {
+ touchEventReceiverWindow.update(rect.left, rect.top, rect.width(), rect.height());
+ } else {
+ touchEventReceiverWindow.setWidth(rect.width());
+ touchEventReceiverWindow.setHeight(rect.height());
+ touchEventReceiverWindow.showAtLocation(
+ parentView, Gravity.NO_GRAVITY, rect.left, rect.top);
+ }
+ parentView.postInvalidate();
+ }
+
+ /**
+ * Dismisses the candidate window.
+ * <p>
+ * Does the very similar things as {@showCandidateWindow}.
+ */
+ private void dismissCandidateWindow() {
+ if (isCandidateWindowShowing) {
+ isCandidateWindowShowing = false;
+ touchEventReceiverWindow.dismiss();
+ parentView.postInvalidate();
+ }
+ }
+
+ @Override
+ public Optional<Rect> getVisibleRect() {
+ Optional<Rect> rect = layoutRenderer.getWindowRect();
+ if (touchEventReceiverWindow.isShowing() && rect.isPresent()) {
+ rect.get().offset(offsetX, offsetY);
+ return rect;
+ } else {
+ return Optional.<Rect>absent();
+ }
+ }
+ }
+
+ private final FloatingCandidateViewProxy floatingCandidateViewProxy;
+
+ public FloatingCandidateView(Context context) {
+ super(context);
+ floatingCandidateViewProxy = createFloatingCandidateViewInstance(this);
+ }
+
+ public FloatingCandidateView(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ floatingCandidateViewProxy = createFloatingCandidateViewInstance(this);
+ }
+
+ @VisibleForTesting
+ FloatingCandidateView(Context context, PopupWindow popupWindowMock) {
+ super(context);
+ floatingCandidateViewProxy = new FloatingCandidateViewImpl(
+ this, popupWindowMock, new FloatingCandidateLayoutRenderer(context.getResources()),
+ new FloatingModeIndicator(this));
+ }
+
+ @VisibleForTesting
+ FloatingCandidateView(Context context, PopupWindow popupWindowMock,
+ FloatingCandidateLayoutRenderer layoutRenderer,
+ FloatingModeIndicator modeIndicator) {
+ super(context);
+ floatingCandidateViewProxy =
+ new FloatingCandidateViewImpl(this, popupWindowMock, layoutRenderer, modeIndicator);
+ }
+
+ private static FloatingCandidateViewProxy createFloatingCandidateViewInstance(View view) {
+ return isAvailable()
+ ? new FloatingCandidateViewImpl(view)
+ : new FloatingCandidateViewStub();
+ }
+
+ @Override
+ protected void onFinishInflate() {
+ // Use software renderer since hardware renderer doesn't support Paint#setShadowLayer() and
+ // Canvas#drawPicture() which is used by MozcDrawable.
+ this.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
+ }
+
+ public static boolean isAvailable() {
+ return Build.VERSION.SDK_INT >= 21;
+ }
+
+ @Override
+ public void setVisibility(int visibility) {
+ super.setVisibility(visibility);
+ floatingCandidateViewProxy.setVisibility(visibility);
+ }
+
+ @Override
+ public void onDraw(Canvas canvas) {
+ super.onDraw(canvas);
+ floatingCandidateViewProxy.draw(canvas);
+ }
+
+ @Override
+ public void onSizeChanged(int width, int height, int oldWidth, int oldHeight) {
+ super.onSizeChanged(width, height, oldWidth, oldHeight);
+ floatingCandidateViewProxy.viewSizeChanged(width, height);
+ }
+
+ /** Sets {@link CursorAnchorInfo} to update the candidate window position. */
+ public void setCursorAnchorInfo(CursorAnchorInfo info) {
+ floatingCandidateViewProxy.setCursorAnchorInfo(info);
+ }
+
+ /** Sets {@link Command} to update the contents of the candidate window. */
+ public void setCandidates(Command outCommand) {
+ floatingCandidateViewProxy.setCandidates(outCommand);
+ }
+
+ /** Sets {@link EditorInfo} for context-aware behavior. */
+ public void setEditorInfo(EditorInfo editorInfo) {
+ floatingCandidateViewProxy.setEditorInfo(editorInfo);
+ }
+
+ public void setCompositionMode(CompositionMode mode) {
+ floatingCandidateViewProxy.setCompositionMode(mode);
+ }
+
+ /** Set view event listener to handle events invoked by the candidate window. */
+ public void setViewEventListener(ViewEventListener listener) {
+ floatingCandidateViewProxy.setViewEventListener(listener);
+ }
+
+ @VisibleForTesting Optional<Rect> getVisibleRect() {
+ return floatingCandidateViewProxy.getVisibleRect();
+ }
+}
diff --git a/src/android/src/com/google/android/inputmethod/japanese/InputDeviceReceiver.java b/src/android/src/com/google/android/inputmethod/japanese/InputDeviceReceiver.java
new file mode 100644
index 0000000..847692c
--- /dev/null
+++ b/src/android/src/com/google/android/inputmethod/japanese/InputDeviceReceiver.java
@@ -0,0 +1,39 @@
+// Copyright 2010-2014, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package org.mozc.android.inputmethod.japanese;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+
+class InputDeviceReceiver extends BroadcastReceiver {
+ @Override
+ public void onReceive(Context context, Intent intent) {}
+}
diff --git a/src/android/src/com/google/android/inputmethod/japanese/JapaneseKeyboard.java b/src/android/src/com/google/android/inputmethod/japanese/JapaneseKeyboard.java
deleted file mode 100644
index 7b2ec9d..0000000
--- a/src/android/src/com/google/android/inputmethod/japanese/JapaneseKeyboard.java
+++ /dev/null
@@ -1,323 +0,0 @@
-// Copyright 2010-2014, Google Inc.
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-package org.mozc.android.inputmethod.japanese;
-
-import org.mozc.android.inputmethod.japanese.keyboard.Flick;
-import org.mozc.android.inputmethod.japanese.keyboard.Flick.Direction;
-import org.mozc.android.inputmethod.japanese.keyboard.Key;
-import org.mozc.android.inputmethod.japanese.keyboard.KeyEntity;
-import org.mozc.android.inputmethod.japanese.keyboard.KeyState;
-import org.mozc.android.inputmethod.japanese.keyboard.Keyboard;
-import org.mozc.android.inputmethod.japanese.keyboard.Row;
-import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.CompositionMode;
-import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Request.CrossingEdgeBehavior;
-import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Request.SpaceOnAlphanumeric;
-import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Request.SpecialRomanjiTable;
-import org.mozc.android.inputmethod.japanese.resources.R;
-import com.google.common.base.Optional;
-import com.google.common.base.Preconditions;
-
-import android.util.SparseIntArray;
-
-import java.util.List;
-
-/**
- */
-public class JapaneseKeyboard extends Keyboard {
- /**
- * Each keyboard has its own specification.
- *
- * For example, some keyboards use a special Romanji table.
- */
- public static enum KeyboardSpecification {
- // 12 keys.
- TWELVE_KEY_TOGGLE_KANA(
- new KeyboardSpecificationName("TWELVE_KEY_TOGGLE_KANA", 0, 1, 1),
- R.xml.kbd_12keys_kana,
- CompositionMode.HIRAGANA,
- SpecialRomanjiTable.TWELVE_KEYS_TO_HIRAGANA,
- SpaceOnAlphanumeric.SPACE_OR_CONVERT_KEEPING_COMPOSITION,
- true,
- CrossingEdgeBehavior.DO_NOTHING),
-
- TWELVE_KEY_TOGGLE_ALPHABET(
- new KeyboardSpecificationName("TWELVE_KEY_TOGGLE_ALPHABET", 0, 1, 1),
- R.xml.kbd_12keys_abc,
- CompositionMode.HALF_ASCII,
- SpecialRomanjiTable.TWELVE_KEYS_TO_HALFWIDTHASCII,
- SpaceOnAlphanumeric.COMMIT,
- false,
- CrossingEdgeBehavior.DO_NOTHING),
-
- TWELVE_KEY_TOGGLE_NUMBER(
- new KeyboardSpecificationName("TWELVE_KEY_TOGGLE_NUMBER", 0, 1, 1),
- R.xml.kbd_12keys_123,
- CompositionMode.HALF_ASCII,
- SpecialRomanjiTable.TWELVE_KEYS_TO_NUMBER,
- SpaceOnAlphanumeric.COMMIT,
- false,
- CrossingEdgeBehavior.DO_NOTHING),
-
- TWELVE_KEY_TOGGLE_QWERTY_ALPHABET(
- new KeyboardSpecificationName("TWELVE_KEY_TOGGLE_QWERTY_ALPHABET", 0, 4, 0),
- R.xml.kbd_12keys_qwerty_abc,
- CompositionMode.HALF_ASCII,
- SpecialRomanjiTable.QWERTY_MOBILE_TO_HALFWIDTHASCII,
- SpaceOnAlphanumeric.COMMIT,
- false,
- CrossingEdgeBehavior.COMMIT_WITHOUT_CONSUMING),
-
- // Flick mode.
- TWELVE_KEY_FLICK_KANA(
- new KeyboardSpecificationName("TWELVE_KEY_FLICK_KANA", 0, 1, 3),
- R.xml.kbd_12keys_flick_kana,
- CompositionMode.HIRAGANA,
- SpecialRomanjiTable.FLICK_TO_HIRAGANA,
- SpaceOnAlphanumeric.SPACE_OR_CONVERT_KEEPING_COMPOSITION,
- true,
- CrossingEdgeBehavior.DO_NOTHING),
-
- TWELVE_KEY_FLICK_ALPHABET(
- new KeyboardSpecificationName("TWELVE_KEY_FLICK_ALPHABET", 0, 1, 1),
- R.xml.kbd_12keys_flick_abc,
- CompositionMode.HALF_ASCII,
- SpecialRomanjiTable.FLICK_TO_HALFWIDTHASCII,
- SpaceOnAlphanumeric.COMMIT,
- false,
- CrossingEdgeBehavior.COMMIT_WITHOUT_CONSUMING),
-
- TWELVE_KEY_FLICK_NUMBER(
- new KeyboardSpecificationName("TWELVE_KEY_FLICK_NUMBER", 0, 1, 1),
- R.xml.kbd_12keys_flick_123,
- CompositionMode.HALF_ASCII,
- SpecialRomanjiTable.FLICK_TO_NUMBER,
- SpaceOnAlphanumeric.COMMIT,
- false,
- CrossingEdgeBehavior.COMMIT_WITHOUT_CONSUMING),
-
- TWELVE_KEY_TOGGLE_FLICK_KANA(
- new KeyboardSpecificationName("TWELVE_KEY_TOGGLE_FLICK_KANA", 0, 1, 3),
- R.xml.kbd_12keys_flick_kana,
- CompositionMode.HIRAGANA,
- SpecialRomanjiTable.TOGGLE_FLICK_TO_HIRAGANA,
- SpaceOnAlphanumeric.SPACE_OR_CONVERT_KEEPING_COMPOSITION,
- true,
- CrossingEdgeBehavior.DO_NOTHING),
-
- TWELVE_KEY_TOGGLE_FLICK_ALPHABET(
- new KeyboardSpecificationName("TWELVE_KEY_TOGGLE_FLICK_ALPHABET", 0, 1, 1),
- R.xml.kbd_12keys_flick_abc,
- CompositionMode.HALF_ASCII,
- SpecialRomanjiTable.TOGGLE_FLICK_TO_HALFWIDTHASCII,
- SpaceOnAlphanumeric.COMMIT,
- false,
- CrossingEdgeBehavior.DO_NOTHING),
-
- TWELVE_KEY_TOGGLE_FLICK_NUMBER(
- new KeyboardSpecificationName("TWELVE_KEY_TOGGLE_FLICK_ALPHABET", 0, 1, 1),
- R.xml.kbd_12keys_flick_123,
- CompositionMode.HALF_ASCII,
- SpecialRomanjiTable.TOGGLE_FLICK_TO_NUMBER,
- SpaceOnAlphanumeric.COMMIT,
- false,
- CrossingEdgeBehavior.DO_NOTHING),
-
- // QWERTY keyboard.
- QWERTY_KANA(
- new KeyboardSpecificationName("QWERTY_KANA", 0, 3, 1),
- R.xml.kbd_qwerty_kana,
- CompositionMode.HIRAGANA,
- SpecialRomanjiTable.QWERTY_MOBILE_TO_HIRAGANA,
- SpaceOnAlphanumeric.SPACE_OR_CONVERT_KEEPING_COMPOSITION,
- false,
- CrossingEdgeBehavior.DO_NOTHING),
-
- QWERTY_KANA_NUMBER(
- new KeyboardSpecificationName("QWERTY_KANA_NUMBER", 0, 2, 1),
- R.xml.kbd_qwerty_kana_123,
- CompositionMode.HIRAGANA,
- SpecialRomanjiTable.QWERTY_MOBILE_TO_HIRAGANA_NUMBER,
- SpaceOnAlphanumeric.SPACE_OR_CONVERT_KEEPING_COMPOSITION,
- false,
- CrossingEdgeBehavior.DO_NOTHING),
-
- QWERTY_ALPHABET(
- new KeyboardSpecificationName("QWERTY_ALPHABET", 0, 4, 0),
- R.xml.kbd_qwerty_abc,
- CompositionMode.HALF_ASCII,
- SpecialRomanjiTable.QWERTY_MOBILE_TO_HALFWIDTHASCII,
- SpaceOnAlphanumeric.COMMIT,
- false,
- CrossingEdgeBehavior.COMMIT_WITHOUT_CONSUMING),
-
- QWERTY_ALPHABET_NUMBER(
- new KeyboardSpecificationName("QWERTY_ALPHABET_NUMBER", 0, 2, 1),
- R.xml.kbd_qwerty_abc_123,
- CompositionMode.HALF_ASCII,
- SpecialRomanjiTable.QWERTY_MOBILE_TO_HALFWIDTHASCII,
- SpaceOnAlphanumeric.COMMIT,
- false,
- CrossingEdgeBehavior.COMMIT_WITHOUT_CONSUMING),
-
- // Godan keyboard.
- GODAN_KANA(
- new KeyboardSpecificationName("GODAN_KANA", 0, 1, 1),
- R.xml.kbd_godan_kana,
- CompositionMode.HIRAGANA,
- SpecialRomanjiTable.GODAN_TO_HIRAGANA,
- SpaceOnAlphanumeric.SPACE_OR_CONVERT_KEEPING_COMPOSITION,
- true,
- CrossingEdgeBehavior.COMMIT_WITHOUT_CONSUMING),
-
- // HARDWARE QWERTY keyboard.
- HARDWARE_QWERTY_KANA(
- new KeyboardSpecificationName("HARDWARE_QWERTY_KANA", 0, 1, 0),
- 0,
- CompositionMode.HIRAGANA,
- SpecialRomanjiTable.DEFAULT_TABLE,
- SpaceOnAlphanumeric.SPACE_OR_CONVERT_KEEPING_COMPOSITION,
- false,
- CrossingEdgeBehavior.DO_NOTHING),
-
- HARDWARE_QWERTY_ALPHABET(
- new KeyboardSpecificationName("HARDWARE_QWERTY_ALPHABET", 0, 1, 0),
- 0,
- CompositionMode.HALF_ASCII,
- SpecialRomanjiTable.DEFAULT_TABLE,
- SpaceOnAlphanumeric.COMMIT,
- false,
- CrossingEdgeBehavior.DO_NOTHING),
-
- ;
-
- private final KeyboardSpecificationName specName;
- private final int resourceId;
- private final CompositionMode compositionMode;
- private final SpecialRomanjiTable specialRomanjiTable;
- private final SpaceOnAlphanumeric spaceOnAlphanumeric;
- private final boolean kanaModifierInsensitiveConversion;
- private final CrossingEdgeBehavior crossingEdgeBehavior;
-
- private KeyboardSpecification(
- KeyboardSpecificationName specName,
- int resourceId,
- CompositionMode compositionMode,
- SpecialRomanjiTable specialRomanjiTable,
- SpaceOnAlphanumeric spaceOnAlphanumeric,
- boolean kanaModifierInsensitiveConversion,
- CrossingEdgeBehavior crossingEdgeBehavior) {
- this.specName = Preconditions.checkNotNull(specName);
- this.resourceId = resourceId;
- this.compositionMode = Preconditions.checkNotNull(compositionMode);
- this.specialRomanjiTable = Preconditions.checkNotNull(specialRomanjiTable);
- this.spaceOnAlphanumeric = Preconditions.checkNotNull(spaceOnAlphanumeric);
- this.kanaModifierInsensitiveConversion = kanaModifierInsensitiveConversion;
- this.crossingEdgeBehavior = Preconditions.checkNotNull(crossingEdgeBehavior);
- }
-
- public int getXmlLayoutResourceId() {
- return resourceId;
- }
-
- public CompositionMode getCompositionMode() {
- return compositionMode;
- }
-
- public KeyboardSpecificationName getKeyboardSpecificationName() {
- return specName;
- }
-
- public KeyboardSpecificationName getSpecName() {
- return specName;
- }
-
- public SpecialRomanjiTable getSpecialRomanjiTable() {
- return specialRomanjiTable;
- }
-
- public SpaceOnAlphanumeric getSpaceOnAlphanumeric() {
- return spaceOnAlphanumeric;
- }
-
- public boolean isKanaModifierInsensitiveConversion() {
- return kanaModifierInsensitiveConversion;
- }
-
- public CrossingEdgeBehavior getCrossingEdgeBehavior() {
- return crossingEdgeBehavior;
- }
- }
-
- private final KeyboardSpecification specification;
- private Optional<SparseIntArray> sourceIdToKeyCode = Optional.absent();
-
- public JapaneseKeyboard(
- Optional<String> contentDescription,
- List<Row> rowList, float flickThreshold, KeyboardSpecification specification) {
- super(Preconditions.checkNotNull(contentDescription),
- Preconditions.checkNotNull(rowList), flickThreshold);
- this.specification = Preconditions.checkNotNull(specification);
- }
-
- public KeyboardSpecification getSpecification() {
- return specification;
- }
-
- /**
- * Returns keyCode from {@code souceId}.
- *
- * <p>If not found, {@code Integer.MIN_VALUE} is returned.
- */
- public int getKeyCode(int sourceId) {
- ensureSourceIdToKeyCode();
- return sourceIdToKeyCode.get().get(sourceId, Integer.MIN_VALUE);
- }
-
- private void ensureSourceIdToKeyCode() {
- if (sourceIdToKeyCode.isPresent()) {
- return;
- }
- SparseIntArray result = new SparseIntArray();
- for (Row row : getRowList()) {
- for (Key key : row.getKeyList()) {
- for (KeyState keyState : key.getKeyStates()) {
- for (Direction direction : Direction.values()) {
- Flick flick = keyState.getFlick(direction);
- if (flick != null) {
- KeyEntity keyEntity = flick.getKeyEntity();
- result.put(keyEntity.getSourceId(), keyEntity.getKeyCode());
- }
- }
- }
- }
- }
- sourceIdToKeyCode = Optional.of(result);
- }
-}
diff --git a/src/android/src/com/google/android/inputmethod/japanese/JapaneseKeyboardFactory.java b/src/android/src/com/google/android/inputmethod/japanese/JapaneseKeyboardFactory.java
deleted file mode 100644
index 106ea58..0000000
--- a/src/android/src/com/google/android/inputmethod/japanese/JapaneseKeyboardFactory.java
+++ /dev/null
@@ -1,150 +0,0 @@
-// Copyright 2010-2014, Google Inc.
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-package org.mozc.android.inputmethod.japanese;
-
-import org.mozc.android.inputmethod.japanese.JapaneseKeyboard.KeyboardSpecification;
-import org.mozc.android.inputmethod.japanese.util.LeastRecentlyUsedCacheMap;
-
-import android.content.res.Resources;
-import android.content.res.Resources.NotFoundException;
-
-import org.xmlpull.v1.XmlPullParserException;
-
-import java.io.IOException;
-import java.util.Map;
-
-/**
- * Factory of the keyboard data based on xml.
- *
- */
-public class JapaneseKeyboardFactory {
-
- /**
- * Key for the cache map of keyboard.
- *
- * Currently the keyboard is depending on its specification and display's size.
- */
- private static class CacheKey {
- private final KeyboardSpecification specification;
- private final int width;
- private final int height;
-
- CacheKey(KeyboardSpecification specification, int width, int height) {
- this.specification = specification;
- this.width = width;
- this.height = height;
- }
-
- @Override
- public boolean equals(Object obj) {
- if (obj instanceof CacheKey) {
- CacheKey other = CacheKey.class.cast(obj);
- return specification == other.specification &&
- width == other.width &&
- height == other.height;
- }
- return false;
- }
-
- @Override
- public int hashCode() {
- return (specification.hashCode() * 31 ^ width) * 31 ^ height;
- }
- }
-
- /**
- * The max size of cached keyboards. This is based on the max number of keyboard variation
- * for a configuration.
- */
- private static final int CACHE_SIZE = 6;
-
- private final Map<CacheKey, JapaneseKeyboard> cache =
- new LeastRecentlyUsedCacheMap<CacheKey, JapaneseKeyboard>(CACHE_SIZE);
-
- /**
- * @return JapaneseKeyboard instance based on given resources and specification.
- * If it is already parsed, just returns cached one. Otherwise, tries to parse
- * corresponding xml data, then caches and returns it.
- * Returns {@code null} if parsing is failed.
- * @throws NullPointerException if given {@code resources} or {@code specification} is
- * {@code null}.
- */
- public JapaneseKeyboard get(Resources resources, KeyboardSpecification specification,
- int keyboardWidth, int keyboardHeight) {
- if (resources == null) {
- throw new NullPointerException("resources is null.");
- }
- if (specification == null) {
- throw new NullPointerException("specification is null.");
- }
-
- CacheKey cacheKey =
- new CacheKey(specification, keyboardWidth, keyboardHeight);
-
- // First, look up from the cache.
- JapaneseKeyboard keyboard = cache.get(cacheKey);
- if (keyboard == null) {
- // If not found, parse keyboard from a xml resource file. The result will be cached in
- // the cache map.
- keyboard = parseKeyboard(resources, specification, keyboardWidth, keyboardHeight);
- if (keyboard != null) {
- cache.put(cacheKey, keyboard);
- }
- }
- return keyboard;
- }
-
- private static JapaneseKeyboard parseKeyboard(
- Resources resources, KeyboardSpecification specification,
- int keyboardWidth, int keyboardHeight) {
- JapaneseKeyboardParser parser = new JapaneseKeyboardParser(
- resources, resources.getXml(specification.getXmlLayoutResourceId()), specification,
- keyboardWidth, keyboardHeight);
- try {
- return parser.parseKeyboard();
- } catch (NotFoundException e) {
- MozcLog.e(e.getMessage());
- } catch (XmlPullParserException e) {
- MozcLog.e(e.getMessage());
- } catch (IOException e) {
- MozcLog.e(e.getMessage());
- }
-
- // Returns null if failed.
- return null;
- }
-
- /**
- * Clears cached keyboards.
- */
- public void clear() {
- cache.clear();
- }
-}
diff --git a/src/android/src/com/google/android/inputmethod/japanese/JapaneseKeyboardParser.java b/src/android/src/com/google/android/inputmethod/japanese/JapaneseKeyboardParser.java
deleted file mode 100644
index 19cde71..0000000
--- a/src/android/src/com/google/android/inputmethod/japanese/JapaneseKeyboardParser.java
+++ /dev/null
@@ -1,80 +0,0 @@
-// Copyright 2010-2014, Google Inc.
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-package org.mozc.android.inputmethod.japanese;
-
-import org.mozc.android.inputmethod.japanese.JapaneseKeyboard.KeyboardSpecification;
-import org.mozc.android.inputmethod.japanese.keyboard.Keyboard;
-import org.mozc.android.inputmethod.japanese.keyboard.KeyboardParser;
-import org.mozc.android.inputmethod.japanese.keyboard.Row;
-import com.google.common.base.Optional;
-import com.google.common.base.Preconditions;
-
-import android.content.res.Resources;
-import android.content.res.XmlResourceParser;
-
-import org.xmlpull.v1.XmlPullParserException;
-
-import java.io.IOException;
-import java.util.List;
-
-/**
- */
-public class JapaneseKeyboardParser extends KeyboardParser {
- private final KeyboardSpecification specification;
-
- public JapaneseKeyboardParser(
- Resources resources, XmlResourceParser parser, KeyboardSpecification specification,
- int keyboardWidth, int keyboardHeight) {
- super(resources, parser, keyboardWidth, keyboardHeight);
- if (specification == null) {
- throw new NullPointerException("specification is null.");
- }
- this.specification = specification;
- }
-
- /**
- * Parses a XML file and returns the keyboard instance.
- * @return JapaneseKeyboard instance parsed from the resource.
- * @throws XmlPullParserException is thrown if parsing is failed.
- * @throws IOException is thrown if there is trouble to read data.
- */
- @Override
- public JapaneseKeyboard parseKeyboard() throws XmlPullParserException, IOException {
- return JapaneseKeyboard.class.cast(super.parseKeyboard());
- }
-
- @Override
- protected Keyboard buildKeyboard(Optional<String> contentDescription,
- List<Row> rowList, float flickThreshold) {
- return new JapaneseKeyboard(Preconditions.checkNotNull(contentDescription),
- Preconditions.checkNotNull(rowList), flickThreshold,
- specification);
- }
-}
diff --git a/src/android/src/com/google/android/inputmethod/japanese/JapaneseKeyboardView.java b/src/android/src/com/google/android/inputmethod/japanese/JapaneseKeyboardView.java
deleted file mode 100644
index 8b0e81d..0000000
--- a/src/android/src/com/google/android/inputmethod/japanese/JapaneseKeyboardView.java
+++ /dev/null
@@ -1,71 +0,0 @@
-// Copyright 2010-2014, Google Inc.
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-package org.mozc.android.inputmethod.japanese;
-
-import org.mozc.android.inputmethod.japanese.keyboard.KeyboardView;
-
-import android.content.Context;
-import android.util.AttributeSet;
-
-/**
- * Keyboard view for Japanese.
- *
- * The features dedicated to Japanese input are implemented in this class.
- *
- */
-public class JapaneseKeyboardView extends KeyboardView {
- public JapaneseKeyboardView(Context context) {
- super(context);
- }
-
- public JapaneseKeyboardView(Context context, AttributeSet attrs) {
- super(context, attrs);
- }
-
- public JapaneseKeyboardView(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
- }
-
- /**
- * Sets a Keyboard.
- *
- * Internally this method delegates to super.setKeyboard(), which is protected scope.
- * TODO(hidehiko): Rename following methods to {set,get}Keyboard, as covariant
- * return value should be supported Java 1.5 or later.
- * @param keyboard a keyboard instance to be set
- */
- public void setJapaneseKeyboard(JapaneseKeyboard keyboard) {
- super.setKeyboard(keyboard);
- }
-
- public JapaneseKeyboard getJapaneseKeyboard() {
- return JapaneseKeyboard.class.cast(super.getKeyboard());
- }
-}
diff --git a/src/android/src/com/google/android/inputmethod/japanese/KeyEventButtonTouchListener.java b/src/android/src/com/google/android/inputmethod/japanese/KeyEventButtonTouchListener.java
index 8316583..a43c9c5 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/KeyEventButtonTouchListener.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/KeyEventButtonTouchListener.java
@@ -29,6 +29,7 @@
package org.mozc.android.inputmethod.japanese;
+import org.mozc.android.inputmethod.japanese.keyboard.BackgroundDrawableFactory.DrawableType;
import org.mozc.android.inputmethod.japanese.keyboard.Flick;
import org.mozc.android.inputmethod.japanese.keyboard.Flick.Direction;
import org.mozc.android.inputmethod.japanese.keyboard.Key;
@@ -37,8 +38,10 @@
import org.mozc.android.inputmethod.japanese.keyboard.KeyEventContext;
import org.mozc.android.inputmethod.japanese.keyboard.KeyEventHandler;
import org.mozc.android.inputmethod.japanese.keyboard.KeyState;
+import org.mozc.android.inputmethod.japanese.keyboard.PopUp;
import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Input.TouchAction;
import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Optional;
import android.view.MotionEvent;
import android.view.View;
@@ -54,6 +57,7 @@
*
*/
public class KeyEventButtonTouchListener implements OnTouchListener {
+
private final int sourceId;
private final int keyCode;
private KeyEventHandler keyEventHandler = null;
@@ -95,9 +99,11 @@
* {@code keyCode}.
* This is exported as package private for testing.
*/
- static Key createKey(View button, int sourceId, int keyCode) {
- KeyEntity keyEntity =
- new KeyEntity(sourceId, keyCode, KeyEntity.INVALID_KEY_CODE, 0, null, null, false, null);
+ @VisibleForTesting static Key createKey(View button, int sourceId, int keyCode) {
+ KeyEntity keyEntity = new KeyEntity(
+ sourceId, keyCode, KeyEntity.INVALID_KEY_CODE, true, 0,
+ Optional.<String>absent(), false,
+ Optional.<PopUp>absent(), 0, 0, 0, 0);
Flick flick = new Flick(Direction.CENTER, keyEntity);
KeyState keyState =
new KeyState("",
@@ -105,9 +111,10 @@
Collections.<KeyState.MetaState>emptySet(),
Collections.<KeyState.MetaState>emptySet(),
Collections.singletonList(flick));
- // Now, we support repetable keys only.
+ // Now, we support repeatable keys only.
return new Key(0, 0, button.getWidth(), button.getHeight(), 0, 0,
- true, false, false, Stick.EVEN, Collections.singletonList(keyState));
+ true, false, Stick.EVEN, DrawableType.TWELVEKEYS_REGULAR_KEY_BACKGROUND,
+ Collections.singletonList(keyState));
}
private static KeyEventContext createKeyEventContext(
@@ -157,8 +164,9 @@
if (keyEventHandler != null && keyEventContext != null) {
keyEventContext.update(x, y, TouchAction.TOUCH_UP, timestamp);
keyEventHandler.cancelDelayedKeyEvent(keyEventContext);
+ // TODO(hsumita): Confirm that we can put null as a touch event or not.
keyEventHandler.sendKey(keyEventContext.getKeyCode(),
- Collections.singletonList(keyEventContext.getTouchEvent()));
+ Collections.singletonList(keyEventContext.getTouchEvent().orNull()));
keyEventHandler.sendRelease(keyEventContext.getPressedKeyCode());
}
this.keyEventContext = null;
diff --git a/src/android/src/com/google/android/inputmethod/japanese/KeycodeConverter.java b/src/android/src/com/google/android/inputmethod/japanese/KeycodeConverter.java
index c42e6d3..f7e3e7b 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/KeycodeConverter.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/KeycodeConverter.java
@@ -32,6 +32,8 @@
import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands;
import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.KeyEvent.ModifierKey;
import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.KeyEvent.SpecialKey;
+import com.google.common.base.Optional;
+import com.google.common.base.Preconditions;
/**
* Converts Androids's KeyEvent to Mozc's KeyEvent.
@@ -52,7 +54,7 @@
*/
public interface KeyEventInterface {
int getKeyCode();
- android.view.KeyEvent getNativeEvent();
+ Optional<android.view.KeyEvent> getNativeEvent();
}
private static final int ASCII_MIN = 32; // Space.
@@ -112,6 +114,7 @@
}
public static KeyEventInterface getKeyEventInterface(final android.view.KeyEvent keyEvent) {
+ Preconditions.checkNotNull(keyEvent);
return new KeyEventInterface() {
@Override
@@ -120,8 +123,8 @@
}
@Override
- public android.view.KeyEvent getNativeEvent() {
- return keyEvent;
+ public Optional<android.view.KeyEvent> getNativeEvent() {
+ return Optional.of(keyEvent);
}
};
}
@@ -135,14 +138,14 @@
}
@Override
- public android.view.KeyEvent getNativeEvent() {
- return null;
+ public Optional<android.view.KeyEvent> getNativeEvent() {
+ return Optional.<android.view.KeyEvent>absent();
}
};
}
public static boolean isMetaKey(android.view.KeyEvent keyEvent) {
- int keyCode = keyEvent.getKeyCode();
+ int keyCode = Preconditions.checkNotNull(keyEvent).getKeyCode();
return keyCode == android.view.KeyEvent.KEYCODE_SHIFT_LEFT ||
keyCode == android.view.KeyEvent.KEYCODE_SHIFT_RIGHT ||
keyCode == android.view.KeyEvent.KEYCODE_CTRL_LEFT ||
diff --git a/src/android/src/com/google/android/inputmethod/japanese/LauncherActivity.java b/src/android/src/com/google/android/inputmethod/japanese/LauncherActivity.java
new file mode 100644
index 0000000..b8063cf
--- /dev/null
+++ b/src/android/src/com/google/android/inputmethod/japanese/LauncherActivity.java
@@ -0,0 +1,49 @@
+// Copyright 2010-2014, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package org.mozc.android.inputmethod.japanese;
+
+import org.mozc.android.inputmethod.japanese.preference.MozcProxyActivity;
+import org.mozc.android.inputmethod.japanese.preference.MozcProxyPreferenceActivity;
+
+import android.content.Intent;
+
+/**
+ * Activity to show launcher icon on the home screen.
+ *
+ * <p>MozcProxyPreferenceActivity is always active because it is invoked from system preference.
+ * This class might be deactivated to hide launcher icon.
+ */
+public class LauncherActivity extends MozcProxyActivity {
+
+ @Override
+ protected Intent getForwardIntent() {
+ return new Intent(this, MozcProxyPreferenceActivity.class);
+ }
+}
diff --git a/src/android/src/com/google/android/inputmethod/japanese/LauncherIconVisibilityInitializer.java b/src/android/src/com/google/android/inputmethod/japanese/LauncherIconVisibilityInitializer.java
new file mode 100644
index 0000000..c7b6bca
--- /dev/null
+++ b/src/android/src/com/google/android/inputmethod/japanese/LauncherIconVisibilityInitializer.java
@@ -0,0 +1,56 @@
+// Copyright 2010-2014, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package org.mozc.android.inputmethod.japanese;
+
+import org.mozc.android.inputmethod.japanese.util.LauncherIconManagerFactory;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+
+/**
+ * A broadcast receiver to initialize launcher icon's visibility.
+ */
+public class LauncherIconVisibilityInitializer extends BroadcastReceiver {
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ if (shouldHandle(intent)) {
+ LauncherIconManagerFactory.getDefaultInstance().updateLauncherIconVisibility(context);
+ }
+ }
+
+ private boolean shouldHandle(Intent intent) {
+ String action = intent.getAction();
+ return "android.intent.action.BOOT_COMPLETED".equals(action)
+ || "android.intent.action.MY_PACKAGE_REPLACED".equals(action)
+ || "android.intent.action.USER_INITIALIZE".equals(action);
+ }
+}
\ No newline at end of file
diff --git a/src/android/src/com/google/android/inputmethod/japanese/MozcMenuDialogListenerImpl.java b/src/android/src/com/google/android/inputmethod/japanese/MozcMenuDialogListenerImpl.java
index e5dd770..189f2fe 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/MozcMenuDialogListenerImpl.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/MozcMenuDialogListenerImpl.java
@@ -31,7 +31,6 @@
import org.mozc.android.inputmethod.japanese.mushroom.MushroomUtil;
import org.mozc.android.inputmethod.japanese.ui.MenuDialog.MenuDialogListener;
-import org.mozc.android.inputmethod.japanese.util.ImeSwitcherFactory.ImeSwitcher;
import com.google.common.base.Preconditions;
import android.content.Context;
@@ -45,12 +44,10 @@
*/
class MozcMenuDialogListenerImpl implements MenuDialogListener {
private final InputMethodService inputMethodService;
- private final ImeSwitcher imeSwitcher;
private boolean showInputMethodPicker = false;
- MozcMenuDialogListenerImpl(InputMethodService inputMethodService, ImeSwitcher imeSwitcher) {
+ MozcMenuDialogListenerImpl(InputMethodService inputMethodService) {
this.inputMethodService = Preconditions.checkNotNull(inputMethodService);
- this.imeSwitcher = Preconditions.checkNotNull(imeSwitcher);
}
@Override
@@ -86,13 +83,6 @@
}
@Override
- public void onLaunchVoiceInputActivitySelected(Context context) {
- if (!imeSwitcher.switchToVoiceIme("ja")) {
- MozcLog.e("Voice IME for ja locale is not found.");
- }
- }
-
- @Override
public void onShowMushroomSelectionDialogSelected(Context context) {
// Reset the composing text, otherwise the composing text will be committed automatically
// and as the result the user would see the duplicated committing.
diff --git a/src/android/src/com/google/android/inputmethod/japanese/MozcService.java b/src/android/src/com/google/android/inputmethod/japanese/MozcService.java
index 0cfa18e..17439b0 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/MozcService.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/MozcService.java
@@ -31,22 +31,21 @@
import org.mozc.android.inputmethod.japanese.FeedbackManager.FeedbackEvent;
import org.mozc.android.inputmethod.japanese.FeedbackManager.FeedbackListener;
-import org.mozc.android.inputmethod.japanese.JapaneseKeyboard.KeyboardSpecification;
import org.mozc.android.inputmethod.japanese.KeycodeConverter.KeyEventInterface;
import org.mozc.android.inputmethod.japanese.emoji.EmojiProviderType;
import org.mozc.android.inputmethod.japanese.emoji.EmojiUtil;
-import org.mozc.android.inputmethod.japanese.hardwarekeyboard.HardwareKeyboard;
import org.mozc.android.inputmethod.japanese.hardwarekeyboard.HardwareKeyboard.CompositionSwitchMode;
import org.mozc.android.inputmethod.japanese.hardwarekeyboard.HardwareKeyboardSpecification;
+import org.mozc.android.inputmethod.japanese.keyboard.Keyboard.KeyboardSpecification;
import org.mozc.android.inputmethod.japanese.model.SelectionTracker;
import org.mozc.android.inputmethod.japanese.model.SymbolCandidateStorage.SymbolHistoryStorage;
import org.mozc.android.inputmethod.japanese.model.SymbolMajorCategory;
import org.mozc.android.inputmethod.japanese.mushroom.MushroomResultProxy;
import org.mozc.android.inputmethod.japanese.preference.ClientSidePreference;
+import org.mozc.android.inputmethod.japanese.preference.PreferenceUtil;
import org.mozc.android.inputmethod.japanese.protobuf.ProtoCandidates;
import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands;
import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Command;
-import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.CompositionMode;
import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Context.InputFieldType;
import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.DeletionRange;
import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.GenericStorageEntry.StorageType;
@@ -56,9 +55,6 @@
import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Preedit;
import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Preedit.Segment;
import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Preedit.Segment.Annotation;
-import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Request.CrossingEdgeBehavior;
-import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Request.SpaceOnAlphanumeric;
-import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Request.SpecialRomanjiTable;
import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.SessionCommand;
import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.SessionCommand.UsageStatsEvent;
import org.mozc.android.inputmethod.japanese.protobuf.ProtoConfig.Config;
@@ -69,11 +65,13 @@
import org.mozc.android.inputmethod.japanese.session.SessionHandlerFactory;
import org.mozc.android.inputmethod.japanese.util.ImeSwitcherFactory;
import org.mozc.android.inputmethod.japanese.util.ImeSwitcherFactory.ImeSwitcher;
+import org.mozc.android.inputmethod.japanese.util.LauncherIconManagerFactory;
import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Optional;
import com.google.common.base.Preconditions;
import com.google.protobuf.ByteString;
+import android.annotation.SuppressLint;
import android.annotation.TargetApi;
import android.content.Context;
import android.content.Intent;
@@ -97,6 +95,7 @@
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
+import android.view.inputmethod.CursorAnchorInfo;
import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputBinding;
import android.view.inputmethod.InputConnection;
@@ -209,6 +208,8 @@
@Override
public void addHistory(SymbolMajorCategory majorCategory, String value) {
+ Preconditions.checkNotNull(majorCategory);
+ Preconditions.checkNotNull(value);
sessionExecutor.insertToStorage(
STORAGE_TYPE_MAP.get(majorCategory),
value,
@@ -217,8 +218,7 @@
}
// Called back from ViewManager
- // Package private for testing.
- class MozcEventListener implements ViewEventListener {
+ @VisibleForTesting class MozcEventListener implements ViewEventListener {
@Override
public void onConversionCandidateSelected(int candidateId, Optional<Integer> rowIndex) {
sessionExecutor.submitCandidate(candidateId, rowIndex, renderResultCallback);
@@ -226,8 +226,23 @@
}
@Override
+ public void onPageUp() {
+ sessionExecutor.pageUp(renderResultCallback);
+ feedbackManager.fireFeedback(FeedbackEvent.KEY_DOWN);
+ }
+
+ @Override
+ public void onPageDown() {
+ sessionExecutor.pageDown(renderResultCallback);
+ feedbackManager.fireFeedback(FeedbackEvent.KEY_DOWN);
+ }
+
+ @Override
public void onSymbolCandidateSelected(SymbolMajorCategory majorCategory, String candidate,
boolean updateHistory) {
+ Preconditions.checkNotNull(majorCategory);
+ Preconditions.checkNotNull(candidate);
+
// Directly commit the text.
commitText(candidate);
@@ -252,8 +267,8 @@
@Override
public void onKeyEvent(
- ProtoCommands.KeyEvent mozcKeyEvent, KeyEventInterface keyEvent,
- KeyboardSpecification keyboardSpecification, List<? extends TouchEvent> touchEventList) {
+ @Nullable ProtoCommands.KeyEvent mozcKeyEvent, @Nullable KeyEventInterface keyEvent,
+ @Nullable KeyboardSpecification keyboardSpecification, List<TouchEvent> touchEventList) {
if (mozcKeyEvent == null && keyboardSpecification == null) {
// We don't send a key event to Mozc native layer since {@code mozcKeyEvent} is null, and we
// don't need to update the keyboard specification since {@code keyboardSpecification} is
@@ -275,7 +290,7 @@
}
@Override
- public void onUndo(List<? extends TouchEvent> touchEventList) {
+ public void onUndo(List<TouchEvent> touchEventList) {
sessionExecutor.undoOrRewind(touchEventList, renderResultCallback);
}
@@ -300,57 +315,73 @@
}
@Override
- public void onShowMenuDialog(List<? extends TouchEvent> touchEventList) {
+ public void onShowMenuDialog(List<TouchEvent> touchEventList) {
sessionExecutor.touchEventUsageStatsEvent(touchEventList);
}
@Override
- public void onShowSymbolInputView(List<? extends TouchEvent> touchEventList) {
- // Send request with (only) keyboard name for logging usage stats.
- sessionExecutor.updateRequest(
- MozcUtil.getRequestForKeyboard(
- SymbolInputView.SPEC_NAME,
- Optional.<SpecialRomanjiTable>absent(),
- Optional.<SpaceOnAlphanumeric>absent(),
- Optional.<Boolean>absent(),
- Optional.<CrossingEdgeBehavior>absent(),
- getConfiguration()),
- touchEventList);
+ public void onShowSymbolInputView(List<TouchEvent> touchEventList) {
+ changeKeyboardSpecificationAndSendKey(
+ null, null, KeyboardSpecification.SYMBOL_NUMBER, getConfiguration(),
+ Collections.<TouchEvent>emptyList());
+ viewManager.onShowSymbolInputView();
}
@Override
public void onCloseSymbolInputView() {
- KeyboardSpecification specification = viewManager.getJapaneseKeyboardSpecification();
- sessionExecutor.updateRequest(
- MozcUtil.getRequestForKeyboard(
- specification.getKeyboardSpecificationName(),
- Optional.of(specification.getSpecialRomanjiTable()),
- Optional.of(specification.getSpaceOnAlphanumeric()),
- Optional.of(specification.isKanaModifierInsensitiveConversion()),
- Optional.of(specification.getCrossingEdgeBehavior()),
- getConfiguration()),
- Collections.<TouchEvent>emptyList());
- }
-
- @Override
- public void onHardwareKeyboardCompositionModeChange(CompositionSwitchMode mode) {
- CompositionMode oldMode = hardwareKeyboard.getCompositionMode();
- hardwareKeyboard.setCompositionMode(mode);
- CompositionMode newMode = hardwareKeyboard.getCompositionMode();
- if (oldMode != newMode) {
- viewManager.setHardwareKeyboardCompositionMode(newMode);
- sendKeyWithKeyboardSpecification(
- null, null,
- hardwareKeyboard.getKeyboardSpecification(),
- getConfiguration(),
+ viewManager.onCloseSymbolInputView();
+ // This callback is called in two ways: one is from touch event on symbol input view.
+ // The other is from onKeyDown event by hardware keyboard. ViewManager.isNarrowMode()
+ // is abused to distinguish these two triggers where its true value indicates that
+ // onCloseSymbolInputView() is called on hardware keyboard event. In the case of hardware
+ // keyboard event, keyboard specification has been already updated so we shouldn't update it.
+ if (!viewManager.isNarrowMode()) {
+ changeKeyboardSpecificationAndSendKey(
+ null, null, viewManager.getKeyboardSpecification(), getConfiguration(),
Collections.<TouchEvent>emptyList());
}
}
@Override
+ public void onHardwareKeyboardCompositionModeChange(CompositionSwitchMode mode) {
+ viewManager.switchHardwareKeyboardCompositionMode(mode);
+ }
+
+ @Override
public void onActionKey() {
// false means that the key is for Action and not ENTER.
- sendDefaultEditorAction(false);
+ sendEditorAction(false);
+ }
+
+ @Override
+ public void onNarrowModeChanged(boolean newNarrowMode) {
+ if (!newNarrowMode) {
+ // Hardware keyboard to software keyboard transition: Submit composition.
+ sessionExecutor.submit(renderResultCallback);
+ }
+ updateImposedConfig();
+ }
+
+ @Override
+ public void onUpdateKeyboardLayoutAdjustment(
+ ViewManagerInterface.LayoutAdjustment layoutAdjustment) {
+ Preconditions.checkNotNull(layoutAdjustment);
+ Configuration configuration = getConfiguration();
+ if (sharedPreferences == null || configuration == null) {
+ return;
+ }
+ boolean isLandscapeKeyboardSettingActive =
+ PreferenceUtil.isLandscapeKeyboardSettingActive(
+ sharedPreferences, configuration.orientation);
+ String key;
+ if (isLandscapeKeyboardSettingActive) {
+ key = PreferenceUtil.PREF_LANDSCAPE_LAYOUT_ADJUSTMENT_KEY;
+ } else {
+ key = PreferenceUtil.PREF_PORTRAIT_LAYOUT_ADJUSTMENT_KEY;
+ }
+ sharedPreferences.edit()
+ .putString(key, layoutAdjustment.toString())
+ .apply();
}
}
@@ -360,16 +391,18 @@
private class RenderResultCallback implements SessionExecutor.EvaluationCallback {
@Override
- public void onCompleted(Command command, @Nullable KeyEventInterface triggeringKeyEvent) {
- Preconditions.checkNotNull(command);
- if (command.getInput().getCommand().getType() !=
- SessionCommand.CommandType.EXPAND_SUGGESTION) {
+ public void onCompleted(
+ Optional<Command> command, Optional<KeyEventInterface> triggeringKeyEvent) {
+ Preconditions.checkArgument(Preconditions.checkNotNull(command).isPresent());
+ Preconditions.checkNotNull(triggeringKeyEvent);
+ if (command.get().getInput().getCommand().getType()
+ != SessionCommand.CommandType.EXPAND_SUGGESTION) {
// For expanding suggestions, we don't need to update our rendering result.
- renderInputConnection(command, triggeringKeyEvent);
+ renderInputConnection(command.get(), triggeringKeyEvent.orNull());
}
// Transit to narrow mode if required (e.g., Typed 'a' key from h/w keyboard).
- viewManager.maybeTransitToNarrowMode(command, triggeringKeyEvent);
- viewManager.render(command);
+ viewManager.maybeTransitToNarrowMode(command.get(), triggeringKeyEvent.orNull());
+ viewManager.render(command.get());
}
}
@@ -380,10 +413,10 @@
class SendKeyToApplicationCallback implements SessionExecutor.EvaluationCallback {
@Override
- public void onCompleted(@Nullable Command command,
- @Nullable KeyEventInterface triggeringKeyEvent) {
- Preconditions.checkArgument(command == null);
- sendKeyEvent(triggeringKeyEvent);
+ public void onCompleted(Optional<Command> command,
+ Optional<KeyEventInterface> triggeringKeyEvent) {
+ Preconditions.checkArgument(!Preconditions.checkNotNull(command).isPresent());
+ sendKeyEvent(triggeringKeyEvent.orNull());
}
}
@@ -393,10 +426,11 @@
private class SendKeyToViewCallback implements SessionExecutor.EvaluationCallback {
@Override
- public void onCompleted(@Nullable Command command, KeyEventInterface triggeringKeyEvent) {
- Preconditions.checkArgument(command == null);
- Preconditions.checkNotNull(triggeringKeyEvent);
- viewManager.consumeKeyOnViewSynchronously(triggeringKeyEvent.getNativeEvent());
+ public void onCompleted(
+ Optional<Command> command, Optional<KeyEventInterface> triggeringKeyEvent) {
+ Preconditions.checkArgument(!Preconditions.checkNotNull(command).isPresent());
+ Preconditions.checkArgument(Preconditions.checkNotNull(triggeringKeyEvent).isPresent());
+ viewManager.consumeKeyOnViewSynchronously(triggeringKeyEvent.get().getNativeEvent().orNull());
}
}
@@ -417,6 +451,7 @@
/**
* We need to send SYNC_DATA command periodically. This class handles it.
*/
+ @SuppressLint("HandlerLeak")
private class SendSyncDataCommandHandler extends Handler {
/**
* The current period of sending SYNC_DATA is 15 mins (as same as desktop version).
@@ -439,6 +474,7 @@
* This class handles callback operation.
* Posting and removing messages should be done in appropriate point.
*/
+ @SuppressLint("HandlerLeak")
private class MemoryTrimmingHandler extends Handler {
/**
@@ -468,16 +504,21 @@
// Focused segment's attribute.
@VisibleForTesting static final CharacterStyle SPAN_CONVERT_HIGHLIGHT =
- new BackgroundColorSpan(0x8888FFFF);
+ new BackgroundColorSpan(0x66EF3566);
+
+ // Background color span for non-focused conversion segment.
+ // We don't create a static CharacterStyle instance since there are multiple segments at the same
+ // time. Otherwise, segments except for the last one cannot have style.
+ @VisibleForTesting static final int CONVERT_NORMAL_COLOR = 0x19EF3566;
// Cursor position.
// Note that InputConnection seems not to be able to show cursor. This is a workaround.
@VisibleForTesting static final CharacterStyle SPAN_BEFORE_CURSOR =
- new BackgroundColorSpan(0x88FF88FF);
+ new BackgroundColorSpan(0x664DB6AC);
- // To hide a caret, we use non-transparent background for partial conversion.
- private static final CharacterStyle SPAN_PARTIAL_SUGGESTION_COLOR =
- new BackgroundColorSpan(0xFFFFE0E0);
+ // Background color span for partial conversion.
+ @VisibleForTesting static final CharacterStyle SPAN_PARTIAL_SUGGESTION_COLOR =
+ new BackgroundColorSpan(0x194DB6AC);
// Underline.
@VisibleForTesting static final CharacterStyle SPAN_UNDERLINE = new UnderlineSpan();
@@ -535,10 +576,6 @@
@VisibleForTesting KeyboardSpecification currentKeyboardSpecification =
KeyboardSpecification.TWELVE_KEY_TOGGLE_KANA;
- // Non-final for testing
- // TODO(matsuzakit): Setting this in onCreateInternal might be more consistent.
- @VisibleForTesting HardwareKeyboard hardwareKeyboard = new HardwareKeyboard();
-
// Current HardKeyboardHidden configuration value.
// This is updated only when onConfigurationChanged is called and
// Configuration.HARDKEYBOARDHIDDEN_* differs to this.
@@ -553,6 +590,15 @@
// Held for testing.
private ViewEventListener eventListener;
+ @SuppressWarnings("deprecation")
+ @SuppressLint("NewApi")
+ public MozcService() {
+ super();
+ if (Build.VERSION.SDK_INT >= 17) {
+ enableHardwareAcceleration();
+ }
+ }
+
@Override
public void onBindInput() {
super.onBindInput();
@@ -566,6 +612,13 @@
}
@Override
+ public void onUpdateCursorAnchorInfo(CursorAnchorInfo cursorAnchorInfo) {
+ if (viewManager != null) {
+ viewManager.setCursorAnchorInfo(cursorAnchorInfo);
+ }
+ }
+
+ @Override
public MozcInputMethod onCreateInputMethodInterface() {
return new MozcInputMethod();
}
@@ -579,9 +632,10 @@
// Callback object mainly used by views.
MozcEventListener eventListener = new MozcEventListener();
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
+ Preconditions.checkNotNull(sharedPreferences);
SessionExecutor sessionExecutor =
SessionExecutor.getInstanceInitializedIfNecessary(
- new SessionHandlerFactory(sharedPreferences), this);
+ new SessionHandlerFactory(Optional.of(sharedPreferences)), this);
onCreateInternal(eventListener, null, sharedPreferences, getConfiguration(),
sessionExecutor);
@@ -598,9 +652,9 @@
}
@VisibleForTesting
- void onCreateInternal(ViewEventListener eventListener, ViewManagerInterface viewManager,
- SharedPreferences sharedPreferences, Configuration deviceConfiguration,
- SessionExecutor sessionExecutor) {
+ void onCreateInternal(ViewEventListener eventListener, @Nullable ViewManagerInterface viewManager,
+ @Nullable SharedPreferences sharedPreferences,
+ Configuration deviceConfiguration, SessionExecutor sessionExecutor) {
super.onCreate();
Context context = getApplicationContext();
@@ -614,8 +668,8 @@
prepareOnce(eventListener, symbolHistoryStorage, viewManager, sharedPreferences);
prepareEveryTime(sharedPreferences, deviceConfiguration);
- if (propagatedClientSidePreference == null ||
- propagatedClientSidePreference.getHardwareKeyMap() == null) {
+ if (propagatedClientSidePreference == null
+ || propagatedClientSidePreference.getHardwareKeyMap() == null) {
HardwareKeyboardSpecification.maybeSetDetectedHardwareKeyMap(
sharedPreferences, deviceConfiguration, false);
}
@@ -630,14 +684,15 @@
* Prepares something which should be done every time when the session is newly created.
*/
private void prepareEveryTime(
- SharedPreferences sharedPreferences, Configuration deviceConfiguration) {
- boolean isLogging = sharedPreferences != null &&
- sharedPreferences.getBoolean(PREF_TWEAK_LOGGING_PROTOCOL_BUFFERS, false);
+ @Nullable SharedPreferences sharedPreferences, Configuration deviceConfiguration) {
+ boolean isLogging = sharedPreferences != null
+ && sharedPreferences.getBoolean(PREF_TWEAK_LOGGING_PROTOCOL_BUFFERS, false);
// Force to initialize here.
- sessionExecutor.reset(new SessionHandlerFactory(sharedPreferences), this);
+ sessionExecutor.reset(
+ new SessionHandlerFactory(Optional.fromNullable(sharedPreferences)), this);
sessionExecutor.setLogging(isLogging);
- updateImposedConfig(getConfiguration());
+ updateImposedConfig();
viewManager.onConfigurationChanged(getConfiguration());
// Make sure that the server and the client have the same keyboard specification.
// User preference's keyboard will be set after this step.
@@ -646,11 +701,12 @@
Collections.<TouchEvent>emptyList());
if (sharedPreferences != null) {
propagateClientSidePreference(
- new ClientSidePreference(sharedPreferences, deviceConfiguration.orientation));
+ new ClientSidePreference(
+ sharedPreferences, getResources(), deviceConfiguration.orientation));
// TODO(hidehiko): here we just set the config based on preferences. When we start
// to support sync on Android, we need to revisit the config related design.
sessionExecutor.setConfig(ConfigUtil.toConfig(sharedPreferences));
- sessionExecutor.preferenceUsageStatsEvent(sharedPreferences);
+ sessionExecutor.preferenceUsageStatsEvent(sharedPreferences, getResources());
}
maybeSetNarrowMode(deviceConfiguration);
@@ -661,16 +717,17 @@
*/
private void prepareOnce(ViewEventListener eventListener,
SymbolHistoryStorage symbolHistoryStorage,
- ViewManagerInterface viewManager,
- SharedPreferences sharedPreferences) {
+ @Nullable ViewManagerInterface viewManager,
+ @Nullable SharedPreferences sharedPreferences) {
Context context = getApplicationContext();
- boolean omitWelcomeActivity = false;
Optional<Intent> forwardIntent =
ApplicationInitializerFactory.createInstance(this).initialize(
- omitWelcomeActivity,
+ MozcUtil.isSystemApplication(context),
MozcUtil.isDevChannel(context),
DependencyFactory.getDependency(getApplicationContext()).isWelcomeActivityPreferrable(),
- MozcUtil.getAbiIndependentVersionCode(context));
+ MozcUtil.getAbiIndependentVersionCode(context),
+ LauncherIconManagerFactory.getDefaultInstance(),
+ PreferenceUtil.getDefaultPreferenceManagerStatic());
if (forwardIntent.isPresent()) {
startActivity(forwardIntent.get());
}
@@ -684,7 +741,7 @@
eventListener,
symbolHistoryStorage,
imeSwitcher,
- new MozcMenuDialogListenerImpl(this, imeSwitcher));
+ new MozcMenuDialogListenerImpl(this));
}
// Setup FeedbackManager.
@@ -714,7 +771,7 @@
return inputView;
}
- void resetContext() {
+ private void resetContext() {
if (sessionExecutor != null) {
sessionExecutor.resetContext();
}
@@ -740,16 +797,16 @@
// Update full screen mode, because the application may be changed.
viewManager.setFullscreenMode(
- applicationCompatibility.isFullScreenModeSupported() &&
- propagatedClientSidePreference != null &&
- propagatedClientSidePreference.isFullscreenMode());
+ applicationCompatibility.isFullScreenModeSupported()
+ && propagatedClientSidePreference != null
+ && propagatedClientSidePreference.isFullscreenMode());
// Some applications, e.g. gmail or maps, send onStartInput with restarting = true, when a user
// rotates a device. In such cases, we don't want to update caret positions, nor reset
// the context basically. However, some other applications, such as one with a webview widget
// like a browser, send onStartInput with restarting = true, too. Unfortunately,
// there seems no way to figure out which one causes this invocation.
- // So, as a point of compromise, we reset the context everytime here. Also, we'll send
+ // So, as a point of compromise, we reset the context every time here. Also, we'll send
// finishComposingText as well, in case the new attached field has already had composing text
// (we hit such a situation on webview, too).
// See also onConfigurationChanged for caret position handling on gmail-like applications'
@@ -778,7 +835,7 @@
* field, commit it. Then, (regardless of whether there exists pending result,) clears
* all remaining pending result.
*/
- static void maybeCommitMushroomResult(EditorInfo attribute, InputConnection connection) {
+ private static void maybeCommitMushroomResult(EditorInfo attribute, InputConnection connection) {
if (connection == null) {
return;
}
@@ -796,10 +853,20 @@
}
}
+ @SuppressLint("NewApi")
+ private static boolean enableCursorAnchorInfo(InputConnection connection) {
+ Preconditions.checkNotNull(connection);
+ if (Build.VERSION.SDK_INT < 21) {
+ return false;
+ }
+ return connection.requestCursorUpdates(
+ InputConnection.CURSOR_UPDATE_IMMEDIATE | InputConnection.CURSOR_UPDATE_MONITOR);
+ }
+
/**
* @return true if connected view is WebEditText (or the application pretends it)
*/
- boolean isWebEditText(EditorInfo editorInfo) {
+ private boolean isWebEditText(EditorInfo editorInfo) {
if (editorInfo == null) {
return false;
}
@@ -816,16 +883,26 @@
@Override
public void onStartInputView(EditorInfo attribute, boolean restarting) {
+ InputConnection inputConnection = getCurrentInputConnection();
+ if (inputConnection != null && Build.VERSION.SDK_INT >= 21) {
+ viewManager.setCursorAnchorInfoEnabled(enableCursorAnchorInfo(inputConnection));
+ updateImposedConfig();
+ }
+
viewManager.setTextForActionButton(getTextForImeAction(attribute.imeOptions));
viewManager.setEditorInfo(attribute);
+ // updateXxxxxButtonEnabled cannot be placed in onStartInput because
+ // the view might be created after onStartInput with *reset* status.
+ viewManager.updateGlobeButtonEnabled();
+ viewManager.updateMicrophoneButtonEnabled();
}
static InputFieldType getInputFieldType(EditorInfo attribute) {
int inputType = attribute.inputType;
- int inputClass = inputType & InputType.TYPE_MASK_CLASS;
- if (MozcUtil.isPasswordField(attribute)) {
+ if (MozcUtil.isPasswordField(inputType)) {
return InputFieldType.PASSWORD;
}
+ int inputClass = inputType & InputType.TYPE_MASK_CLASS;
if (inputClass == InputType.TYPE_CLASS_PHONE) {
return InputFieldType.TEL;
}
@@ -867,6 +944,8 @@
return super.onGenericMotionEvent(event);
}
+ @SuppressLint("DefaultLocale")
+ @VisibleForTesting
boolean onKeyDownInternal(int keyCode, KeyEvent event, Configuration configuration) {
if (MozcLog.isLoggable(Log.DEBUG)) {
MozcLog.d(
@@ -893,7 +972,7 @@
return super.onKeyDown(keyCode, event);
}
- // Push the event to the asyncronous execution queue if it should be processed
+ // Push the event to the asynchronous execution queue if it should be processed
// directly in the view.
if (viewManager.isKeyConsumedOnViewAsynchronously(event)) {
sessionExecutor.sendKeyEvent(KeycodeConverter.getKeyEventInterface(event),
@@ -902,28 +981,17 @@
}
// Lazy evaluation.
- // If hardware keybaord is not set in the preference screen,
+ // If hardware keyboard is not set in the preference screen,
// set it based on the configuration.
- if (propagatedClientSidePreference == null ||
- propagatedClientSidePreference.getHardwareKeyMap() == null) {
+ if (propagatedClientSidePreference == null
+ || propagatedClientSidePreference.getHardwareKeyMap() == null) {
HardwareKeyboardSpecification.maybeSetDetectedHardwareKeyMap(
sharedPreferences, configuration, true);
}
// Here we decided to send the event to the server.
- // Maybe update the composition mode based on the event.
- // For example, zen/han key toggles the composition mode (hiragana <--> alphabet).
- CompositionMode compositionMode = hardwareKeyboard.getCompositionMode();
- hardwareKeyboard.setCompositionModeByKey(event);
- CompositionMode currentCompositionMode = hardwareKeyboard.getCompositionMode();
- if (currentCompositionMode != compositionMode) {
- viewManager.setHardwareKeyboardCompositionMode(currentCompositionMode);
- }
- sendKeyWithKeyboardSpecification(
- hardwareKeyboard.getMozcKeyEvent(event), hardwareKeyboard.getKeyEventInterface(event),
- hardwareKeyboard.getKeyboardSpecification(), configuration,
- Collections.<TouchEvent>emptyList());
+ viewManager.onHardwareKeyEvent(event);
return true;
}
@@ -973,10 +1041,15 @@
*/
@VisibleForTesting
void sendKeyWithKeyboardSpecification(
- ProtoCommands.KeyEvent mozcKeyEvent, KeyEventInterface event,
- KeyboardSpecification keyboardSpecification, Configuration configuration,
- List<? extends TouchEvent> touchEventList) {
- if (currentKeyboardSpecification != keyboardSpecification) {
+ @Nullable ProtoCommands.KeyEvent mozcKeyEvent, @Nullable KeyEventInterface event,
+ @Nullable KeyboardSpecification keyboardSpecification, Configuration configuration,
+ List<TouchEvent> touchEventList) {
+ if (keyboardSpecification != null && currentKeyboardSpecification != keyboardSpecification) {
+ // Submit composition on the transition from software KB to hardware KB by key event.
+ if (!currentKeyboardSpecification.isHardwareKeyboard()
+ && keyboardSpecification.isHardwareKeyboard()) {
+ sessionExecutor.submit(renderResultCallback);
+ }
changeKeyboardSpecificationAndSendKey(
mozcKeyEvent, event, keyboardSpecification, configuration, touchEventList);
updateStatusIcon();
@@ -991,31 +1064,26 @@
}
/**
- * Sends Request for changing keybaord setting to mozc server and sends key.
+ * Sends Request for changing keyboard setting to mozc server and sends key.
*/
private void changeKeyboardSpecificationAndSendKey(
- ProtoCommands.KeyEvent mozcKeyEvent, KeyEventInterface event,
+ @Nullable ProtoCommands.KeyEvent mozcKeyEvent, @Nullable KeyEventInterface event,
KeyboardSpecification keyboardSpecification, Configuration configuration,
- List<? extends TouchEvent> touchEventList) {
+ List<TouchEvent> touchEventList) {
// Send Request to change composition table.
sessionExecutor.updateRequest(
- MozcUtil.getRequestForKeyboard(
- keyboardSpecification.getKeyboardSpecificationName(),
- Optional.of(keyboardSpecification.getSpecialRomanjiTable()),
- Optional.of(keyboardSpecification.getSpaceOnAlphanumeric()),
- Optional.of(keyboardSpecification.isKanaModifierInsensitiveConversion()),
- Optional.of(keyboardSpecification.getCrossingEdgeBehavior()),
- configuration),
+ MozcUtil.getRequestBuilder(getResources(), keyboardSpecification, configuration).build(),
touchEventList);
if (mozcKeyEvent == null) {
// Change composition mode.
- sessionExecutor.switchInputMode(event, keyboardSpecification.getCompositionMode(),
- renderResultCallback);
+ sessionExecutor.switchInputMode(
+ Optional.fromNullable(event), keyboardSpecification.getCompositionMode(),
+ renderResultCallback);
} else {
// Send key with composition mode change.
sessionExecutor.sendKey(
ProtoCommands.KeyEvent.newBuilder(mozcKeyEvent)
- .setMode(keyboardSpecification.getCompositionMode()).build(),
+ .setMode(keyboardSpecification.getCompositionMode()).build(),
event, touchEventList, renderResultCallback);
}
currentKeyboardSpecification = keyboardSpecification;
@@ -1035,7 +1103,7 @@
/**
* Shows the status icon basing on the current keyboard spec.
*/
- void showStatusIcon() {
+ private void showStatusIcon() {
switch (currentKeyboardSpecification.getCompositionMode()) {
case HIRAGANA:
showStatusIcon(R.drawable.status_icon_hiragana);
@@ -1052,6 +1120,17 @@
}
@Override
+ public boolean onShowInputRequested(int flags, boolean configChange) {
+ boolean result = super.onShowInputRequested(flags, configChange);
+ boolean isHardwareKeyboardConnected =
+ getResources().getConfiguration().keyboard != Configuration.KEYBOARD_NOKEYS;
+ // Original result becomes false when a hardware keyboard is connected.
+ // This means that the window won't be shown in such situation.
+ // We want to show it even with a hardware keyboard so override the result here.
+ return result || isHardwareKeyboardConnected;
+ }
+
+ @Override
public void onWindowShown() {
showStatusIcon();
// Remove memory trimming message.
@@ -1070,7 +1149,7 @@
public void onWindowHidden() {
// "Hiding IME's window" is very similar to "Turning off IME" for PC.
// Thus
- // - Commiting composing text.
+ // - Committing composing text.
// - Removing all pending messages.
// - Resetting Mozc server
// are needed.
@@ -1096,6 +1175,7 @@
* @param keyEvent Trigger event for this calling. When direct input is
* needed, this event is sent to InputConnection.
*/
+ @VisibleForTesting
void renderInputConnection(Command command, @Nullable KeyEventInterface keyEvent) {
Preconditions.checkNotNull(command);
@@ -1115,8 +1195,8 @@
// case, the command is consumed by Mozc server and the application cannot get the key event.
// To avoid such situation, we should send the key event back to application. b/13238551
// The command itself is consumed by Mozc server, so we should NOT put a return statement here.
- if (keyEvent != null && keyEvent.getNativeEvent() != null &&
- KeycodeConverter.isMetaKey(keyEvent.getNativeEvent())) {
+ if (keyEvent != null && keyEvent.getNativeEvent().isPresent()
+ && KeycodeConverter.isMetaKey(keyEvent.getNativeEvent().get())) {
sendKeyEvent(keyEvent);
}
@@ -1136,7 +1216,8 @@
}
}
- static KeyEvent createKeyEvent(KeyEvent original, long eventTime, int action, int repeatCount) {
+ private static KeyEvent createKeyEvent(
+ KeyEvent original, long eventTime, int action, int repeatCount) {
return new KeyEvent(
original.getDownTime(), eventTime, action, original.getKeyCode(),
repeatCount, original.getMetaState(), original.getDeviceId(), original.getScanCode(),
@@ -1146,7 +1227,7 @@
/**
* Sends the {@code KeyEvent}, which is not consumed by the mozc server.
*/
- void sendKeyEvent(KeyEventInterface keyEvent) {
+ @VisibleForTesting void sendKeyEvent(KeyEventInterface keyEvent) {
if (keyEvent == null) {
return;
}
@@ -1159,24 +1240,24 @@
}
// Following code is to fallback to target activity.
- KeyEvent nativeKeyEvent = keyEvent.getNativeEvent();
+ Optional<KeyEvent> nativeKeyEvent = keyEvent.getNativeEvent();
InputConnection inputConnection = getCurrentInputConnection();
- if (nativeKeyEvent != null && inputConnection != null) {
+ if (nativeKeyEvent.isPresent() && inputConnection != null) {
// Meta keys are from this.onKeyDown/Up so fallback each time.
- if (KeycodeConverter.isMetaKey(nativeKeyEvent)) {
+ if (KeycodeConverter.isMetaKey(nativeKeyEvent.get())) {
inputConnection.sendKeyEvent(createKeyEvent(
- nativeKeyEvent, MozcUtil.getUptimeMillis(),
- nativeKeyEvent.getAction(), nativeKeyEvent.getRepeatCount()));
+ nativeKeyEvent.get(), MozcUtil.getUptimeMillis(),
+ nativeKeyEvent.get().getAction(), nativeKeyEvent.get().getRepeatCount()));
return;
}
// Other keys are from this.onKeyDown so create dummy Down/Up events.
inputConnection.sendKeyEvent(createKeyEvent(
- nativeKeyEvent, MozcUtil.getUptimeMillis(), KeyEvent.ACTION_DOWN, 0));
+ nativeKeyEvent.get(), MozcUtil.getUptimeMillis(), KeyEvent.ACTION_DOWN, 0));
inputConnection.sendKeyEvent(createKeyEvent(
- nativeKeyEvent, MozcUtil.getUptimeMillis(), KeyEvent.ACTION_UP, 0));
+ nativeKeyEvent.get(), MozcUtil.getUptimeMillis(), KeyEvent.ACTION_UP, 0));
return;
}
@@ -1206,13 +1287,33 @@
if (keyCode != KeyEvent.KEYCODE_ENTER || !isInputViewShown()) {
return false;
}
-
- // Fall back to EditorAction. Note that the keyCode is ENTER here, so set the fromEnterKey
- // argument true.
- return sendDefaultEditorAction(true);
+ return sendEditorAction(true);
}
- static void maybeDeleteSurroundingText(Output output, InputConnection inputConnection) {
+ /**
+ * Sends editor action to {@code InputConnection}.
+ * <p>
+ * The difference from {@link InputMethodService#sendDefaultEditorAction(boolean)} is
+ * that if custom action label is specified {@code EditorInfo#actionId} is sent instead.
+ */
+ private boolean sendEditorAction(boolean fromEnterKey) {
+ // If custom action label is specified (=non-null), special action id is also specified.
+ // If there is no IME_FLAG_NO_ENTER_ACTION option, we should send the id to the InputConnection.
+ EditorInfo editorInfo = getCurrentInputEditorInfo();
+ if (editorInfo != null
+ && (editorInfo.imeOptions & EditorInfo.IME_FLAG_NO_ENTER_ACTION) == 0
+ && editorInfo.actionLabel != null) {
+ InputConnection inputConnection = getCurrentInputConnection();
+ if (inputConnection != null) {
+ inputConnection.performEditorAction(editorInfo.actionId);
+ return true;
+ }
+ }
+ // No custom action label is specified. Fall back to default EditorAction.
+ return sendDefaultEditorAction(fromEnterKey);
+ }
+
+ private static void maybeDeleteSurroundingText(Output output, InputConnection inputConnection) {
if (!output.hasDeletionRange()) {
return;
}
@@ -1232,7 +1333,7 @@
}
}
- static void maybeCommitText(Output output, InputConnection inputConnection) {
+ private static void maybeCommitText(Output output, InputConnection inputConnection) {
if (!output.hasResult()) {
return;
}
@@ -1245,8 +1346,8 @@
int position = MozcUtil.CURSOR_POSITION_TAIL;
if (output.getResult().hasCursorOffset()) {
- if (output.getResult().getCursorOffset() ==
- -outputText.codePointCount(0, outputText.length())) {
+ if (output.getResult().getCursorOffset()
+ == -outputText.codePointCount(0, outputText.length())) {
position = MozcUtil.CURSOR_POSITION_HEAD;
} else {
MozcLog.e("Unsupported position: " + output.getResult().toString());
@@ -1258,7 +1359,7 @@
}
}
- void setComposingText(Command command, InputConnection inputConnection) {
+ private void setComposingText(Command command, InputConnection inputConnection) {
Preconditions.checkNotNull(command);
Preconditions.checkNotNull(inputConnection);
@@ -1274,8 +1375,8 @@
// To avoid from this issue, we don't clear the composing text if the input
// is SWITCH_INPUT_MODE.
Input input = command.getInput();
- if (input.getType() != Input.CommandType.SEND_COMMAND ||
- input.getCommand().getType() != SessionCommand.CommandType.SWITCH_INPUT_MODE) {
+ if (input.getType() != Input.CommandType.SEND_COMMAND
+ || input.getCommand().getType() != SessionCommand.CommandType.SWITCH_INPUT_MODE) {
if (!inputConnection.setComposingText("", 0)) {
MozcLog.e("Failed to set composing text.");
}
@@ -1289,14 +1390,6 @@
SpannableStringBuilder builder = new SpannableStringBuilder();
for (Segment segment : preedit.getSegmentList()) {
builder.append(segment.getValue());
- if (segment.hasAnnotation() && segment.getAnnotation() == Annotation.HIGHLIGHT) {
- // Highlight for the focused conversion part.
- builder.setSpan(
- SPAN_CONVERT_HIGHLIGHT,
- builder.length() - segment.getValue().length(),
- builder.length(),
- Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
- }
}
// Set underline for all the preedit text.
@@ -1304,18 +1397,30 @@
// Draw cursor if in composition mode.
int cursor = preedit.getCursor();
- if (!(output.hasAllCandidateWords() &&
- output.getAllCandidateWords().hasCategory() &&
- output.getAllCandidateWords().getCategory() == ProtoCandidates.Category.CONVERSION)) {
+ int spanFlags = Spanned.SPAN_EXCLUSIVE_EXCLUSIVE | Spanned.SPAN_COMPOSING;
+ if (output.hasAllCandidateWords()
+ && output.getAllCandidateWords().hasCategory()
+ && output.getAllCandidateWords().getCategory() == ProtoCandidates.Category.CONVERSION) {
+ int offsetInString = 0;
+ for (Segment segment : preedit.getSegmentList()) {
+ int length = segment.getValue().length();
+ builder.setSpan(
+ segment.hasAnnotation() && segment.getAnnotation() == Annotation.HIGHLIGHT
+ ? SPAN_CONVERT_HIGHLIGHT
+ : CharacterStyle.class.cast(new BackgroundColorSpan(CONVERT_NORMAL_COLOR)),
+ offsetInString, offsetInString + length, spanFlags);
+ offsetInString += length;
+ }
+ } else {
// We cannot show system cursor inside preedit here.
// Instead we change text style before the preedit's cursor.
+ int cursorOffsetInString = builder.toString().offsetByCodePoints(0, cursor);
if (cursor != builder.length()) {
- // This condition is workaround not to show unexpected background color for EditText.
- builder.setSpan(SPAN_PARTIAL_SUGGESTION_COLOR, cursor, builder.length(),
- Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+ builder.setSpan(SPAN_PARTIAL_SUGGESTION_COLOR, cursorOffsetInString, builder.length(),
+ spanFlags);
}
if (cursor > 0) {
- builder.setSpan(SPAN_BEFORE_CURSOR, 0, cursor, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+ builder.setSpan(SPAN_BEFORE_CURSOR, 0, cursorOffsetInString, spanFlags);
}
}
@@ -1327,7 +1432,7 @@
}
}
- void maybeSetSelection(Output output, InputConnection inputConnection) {
+ private void maybeSetSelection(Output output, InputConnection inputConnection) {
if (!output.hasPreedit()) {
return;
}
@@ -1382,68 +1487,71 @@
return;
}
ClientSidePreference oldPreference = propagatedClientSidePreference;
- if (oldPreference == null ||
- oldPreference.isHapticFeedbackEnabled() != newPreference.isHapticFeedbackEnabled()) {
+ if (oldPreference == null
+ || oldPreference.isHapticFeedbackEnabled() != newPreference.isHapticFeedbackEnabled()) {
feedbackManager.setHapticFeedbackEnabled(newPreference.isHapticFeedbackEnabled());
}
- if (oldPreference == null ||
- oldPreference.getHapticFeedbackDuration() != newPreference.getHapticFeedbackDuration()) {
+ if (oldPreference == null
+ || oldPreference.getHapticFeedbackDuration() != newPreference.getHapticFeedbackDuration()) {
feedbackManager.setHapticFeedbackDuration(newPreference.getHapticFeedbackDuration());
}
- if (oldPreference == null ||
- oldPreference.isSoundFeedbackEnabled() != newPreference.isSoundFeedbackEnabled()) {
+ if (oldPreference == null
+ || oldPreference.isSoundFeedbackEnabled() != newPreference.isSoundFeedbackEnabled()) {
feedbackManager.setSoundFeedbackEnabled(newPreference.isSoundFeedbackEnabled());
}
- if (oldPreference == null ||
- oldPreference.getSoundFeedbackVolume() != newPreference.getSoundFeedbackVolume()) {
- // The default value is 0.1f. In order to set the 50 to the default value, divide the
- // preference value by 500f heuristically.
- feedbackManager.setSoundFeedbackVolume(newPreference.getSoundFeedbackVolume() / 500f);
+ if (oldPreference == null
+ || oldPreference.getSoundFeedbackVolume() != newPreference.getSoundFeedbackVolume()) {
+ // The default value is 0.4f. In order to set the 50 to the default value, divide the
+ // preference value by 125f heuristically.
+ feedbackManager.setSoundFeedbackVolume(newPreference.getSoundFeedbackVolume() / 125f);
}
- if (oldPreference == null ||
- oldPreference.isPopupFeedbackEnabled() != newPreference.isPopupFeedbackEnabled()) {
+ if (oldPreference == null
+ || oldPreference.isPopupFeedbackEnabled() != newPreference.isPopupFeedbackEnabled()) {
viewManager.setPopupEnabled(newPreference.isPopupFeedbackEnabled());
}
- if (oldPreference == null ||
- oldPreference.getKeyboardLayout() != newPreference.getKeyboardLayout()) {
+ if (oldPreference == null
+ || oldPreference.getKeyboardLayout() != newPreference.getKeyboardLayout()) {
viewManager.setKeyboardLayout(newPreference.getKeyboardLayout());
}
- if (oldPreference == null ||
- oldPreference.getInputStyle() != newPreference.getInputStyle()) {
+ if (oldPreference == null
+ || oldPreference.getInputStyle() != newPreference.getInputStyle()) {
viewManager.setInputStyle(newPreference.getInputStyle());
}
- if (oldPreference == null ||
- oldPreference.isQwertyLayoutForAlphabet() != newPreference.isQwertyLayoutForAlphabet()) {
+ if (oldPreference == null
+ || oldPreference.isQwertyLayoutForAlphabet() != newPreference.isQwertyLayoutForAlphabet()) {
viewManager.setQwertyLayoutForAlphabet(newPreference.isQwertyLayoutForAlphabet());
}
- if (oldPreference == null ||
- oldPreference.isFullscreenMode() != newPreference.isFullscreenMode()) {
+ if (oldPreference == null
+ || oldPreference.isFullscreenMode() != newPreference.isFullscreenMode()) {
viewManager.setFullscreenMode(
- applicationCompatibility.isFullScreenModeSupported() &&
- newPreference.isFullscreenMode());
+ applicationCompatibility.isFullScreenModeSupported() && newPreference.isFullscreenMode());
}
- if (oldPreference == null ||
- oldPreference.getFlickSensitivity() != newPreference.getFlickSensitivity()) {
+ if (oldPreference == null
+ || oldPreference.getFlickSensitivity() != newPreference.getFlickSensitivity()) {
viewManager.setFlickSensitivity(newPreference.getFlickSensitivity());
}
- if (oldPreference == null ||
- oldPreference.getEmojiProviderType() != newPreference.getEmojiProviderType()) {
+ if (oldPreference == null
+ || oldPreference.getEmojiProviderType() != newPreference.getEmojiProviderType()) {
viewManager.setEmojiProviderType(newPreference.getEmojiProviderType());
}
- if (oldPreference == null ||
- oldPreference.getHardwareKeyMap() != newPreference.getHardwareKeyMap()) {
- hardwareKeyboard.setHardwareKeyMap(newPreference.getHardwareKeyMap());
+ if (oldPreference == null
+ || oldPreference.getHardwareKeyMap() != newPreference.getHardwareKeyMap()) {
+ viewManager.setHardwareKeyMap(newPreference.getHardwareKeyMap());
}
- if (oldPreference == null ||
- oldPreference.getSkinType() != newPreference.getSkinType()) {
- viewManager.setSkinType(newPreference.getSkinType());
+ if (oldPreference == null
+ || oldPreference.getSkinType() != newPreference.getSkinType()) {
+ viewManager.setSkin(newPreference.getSkinType().getSkin(getResources()));
}
- if (oldPreference == null ||
- oldPreference.getLayoutAdjustment() != newPreference.getLayoutAdjustment()) {
- viewManager.setLayoutAdjustment(getResources(), newPreference.getLayoutAdjustment());
+ if (oldPreference == null
+ || oldPreference.isMicrophoneButtonEnabled() != newPreference.isMicrophoneButtonEnabled()) {
+ viewManager.setMicrophoneButtonEnabledByPreference(newPreference.isMicrophoneButtonEnabled());
}
- if (oldPreference == null ||
- oldPreference.getKeyboardHeightRatio() != newPreference.getKeyboardHeightRatio()) {
+ if (oldPreference == null
+ || oldPreference.getLayoutAdjustment() != newPreference.getLayoutAdjustment()) {
+ viewManager.setLayoutAdjustment(newPreference.getLayoutAdjustment());
+ }
+ if (oldPreference == null
+ || oldPreference.getKeyboardHeightRatio() != newPreference.getKeyboardHeightRatio()) {
viewManager.setKeyboardHeightRatio(newPreference.getKeyboardHeightRatio());
}
@@ -1455,18 +1563,17 @@
*
* Some config items should be mobile ones.
* For example, "selection shortcut" should be disabled on software keyboard
- * regardless of stored config.
- * Imposed config should be based on device configuration
- * but currently we ignore device config because we currently do not support
- * hardware keyboard.
- *
- * @param deviceConfig the current device configuration
+ * regardless of stored config if there is no hardware keyboard.
*/
- private void updateImposedConfig(Configuration deviceConfig) {
+ private void updateImposedConfig() {
+ // TODO(hsumita): Respect Config.SelectionShortcut.
+ SelectionShortcut shortcutMode = (viewManager != null && viewManager.isFloatingCandidateMode())
+ ? SelectionShortcut.SHORTCUT_123456789 : SelectionShortcut.NO_SHORTCUT;
+
// TODO(matsuzakit): deviceConfig should be used to set following config items.
sessionExecutor.setImposedConfig(Config.newBuilder()
.setSessionKeymap(SessionKeymap.MOBILE)
- .setSelectionShortcut(SelectionShortcut.NO_SHORTCUT)
+ .setSelectionShortcut(shortcutMode)
.setUseEmojiConversion(true)
.build());
}
@@ -1487,20 +1594,21 @@
return;
}
propagateClientSidePreference(
- new ClientSidePreference(sharedPreferences, getConfiguration().orientation));
+ new ClientSidePreference(
+ sharedPreferences, getResources(), getConfiguration().orientation));
sessionExecutor.setConfig(ConfigUtil.toConfig(sharedPreferences));
- sessionExecutor.preferenceUsageStatsEvent(sharedPreferences);
+ sessionExecutor.preferenceUsageStatsEvent(sharedPreferences, getResources());
}
}
- void maybeSetNarrowMode(Configuration configuration) {
+ @VisibleForTesting void maybeSetNarrowMode(Configuration configuration) {
// If given hardKeyboardHidden is equal to current one, skip updating narrow mode.
// In other words, only hardKeyboardHidden flag changes narrow mode automatically.
// This behavior is beneficial for a user who want to change narrow/full mode manually
- // because this method keeps current narrow mode unless hardwarekeyboard connection is changed.
+ // because this method keeps current narrow mode unless hardware keyboard connection is changed.
if (viewManager != null && configuration.hardKeyboardHidden != currentHardKeyboardHidden) {
currentHardKeyboardHidden = configuration.hardKeyboardHidden;
- switch(currentHardKeyboardHidden) {
+ switch (currentHardKeyboardHidden) {
case Configuration.HARDKEYBOARDHIDDEN_NO:
if (!viewManager.isNarrowMode()) {
viewManager.hideSubInputView();
@@ -1518,7 +1626,7 @@
}
}
- void onConfigurationChangedInternal(Configuration newConfig) {
+ @VisibleForTesting void onConfigurationChangedInternal(Configuration newConfig) {
InputConnection inputConnection = getCurrentInputConnection();
if (inputConnection != null) {
if (inputBound) {
@@ -1544,12 +1652,16 @@
resetContext();
selectionTracker.onConfigurationChanged();
+ sessionExecutor.updateRequest(
+ MozcUtil.getRequestBuilder(getResources(), currentKeyboardSpecification, newConfig).build(),
+ Collections.<TouchEvent>emptyList());
+
// NOTE : This method is not called at the time when the service is started.
- // Based on newConfig, imposed config and client side prefereces should be sent
+ // Based on newConfig, client side preferences should be sent
// because they change based on device config.
- updateImposedConfig(newConfig);
propagateClientSidePreference(new ClientSidePreference(
- PreferenceManager.getDefaultSharedPreferences(this), newConfig.orientation));
+ Preconditions.checkNotNull(PreferenceManager.getDefaultSharedPreferences(this)),
+ getResources(), newConfig.orientation));
maybeSetNarrowMode(newConfig);
viewManager.onConfigurationChanged(newConfig);
}
@@ -1562,6 +1674,7 @@
super.onConfigurationChanged(newConfig);
}
+ @VisibleForTesting
void onUpdateSelectionInternal(int oldSelStart, int oldSelEnd,
int newSelStart, int newSelEnd,
int candidatesStart, int candidatesEnd) {
@@ -1643,11 +1756,6 @@
return eventListener;
}
- /**
- * attachBaseContext is defined with protected visibility in
- * {@link android.content.ContextWrapper} but this is required for testing.
- * Here just makes it public.
- */
@Override
@VisibleForTesting
public void attachBaseContext(Context base) {
diff --git a/src/android/src/com/google/android/inputmethod/japanese/MozcUtil.java b/src/android/src/com/google/android/inputmethod/japanese/MozcUtil.java
index a65ec44..761250a 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/MozcUtil.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/MozcUtil.java
@@ -29,10 +29,8 @@
package org.mozc.android.inputmethod.japanese;
+import org.mozc.android.inputmethod.japanese.keyboard.Keyboard.KeyboardSpecification;
import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Request;
-import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Request.CrossingEdgeBehavior;
-import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Request.SpaceOnAlphanumeric;
-import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Request.SpecialRomanjiTable;
import org.mozc.android.inputmethod.japanese.util.ResourcesWrapper;
import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Optional;
@@ -182,6 +180,9 @@
private static Optional<Boolean> isDevChannel = Optional.<Boolean>absent();
private static Optional<Boolean> isMozcEnabled = Optional.<Boolean>absent();
private static Optional<Boolean> isMozcDefaultIme = Optional.<Boolean>absent();
+ private static Optional<Boolean> isSystemApplication = Optional.<Boolean>absent();
+ private static Optional<Boolean> isTouchUI = Optional.<Boolean>absent();
+ private static Optional<Boolean> isUpdatedSystemApplication = Optional.<Boolean>absent();
private static Optional<Integer> versionCode = Optional.<Integer>absent();
private static Optional<Long> uptimeMillis = Optional.<Long>absent();
@@ -250,6 +251,38 @@
return isDevChannelVersionName(getVersionName(context));
}
+ public static final boolean isSystemApplication(Context context) {
+ Preconditions.checkNotNull(context);
+ if (isSystemApplication.isPresent()) {
+ return isSystemApplication.get();
+ }
+ return checkApplicationFlag(context, ApplicationInfo.FLAG_SYSTEM);
+ }
+
+ /**
+ * For testing purpose.
+ * @param isSystemApplication Optional.absent() if default behavior is preferable
+ */
+ public static final void setSystemApplication(Optional<Boolean> isSystemApplication) {
+ MozcUtil.isSystemApplication = Preconditions.checkNotNull(isSystemApplication);
+ }
+
+ public static final boolean isUpdatedSystemApplication(Context context) {
+ Preconditions.checkNotNull(context);
+ if (isUpdatedSystemApplication.isPresent()) {
+ return isUpdatedSystemApplication.get();
+ }
+ return checkApplicationFlag(context, ApplicationInfo.FLAG_UPDATED_SYSTEM_APP);
+ }
+
+ /**
+ * For testing purpose.
+ * @param isUpdatedSystemApplication Optional.absent() if default behavior is preferable
+ */
+ public static final void setUpdatedSystemApplication(
+ Optional<Boolean> isUpdatedSystemApplication) {
+ MozcUtil.isUpdatedSystemApplication = Preconditions.checkNotNull(isUpdatedSystemApplication);
+ }
/**
* Gets version name.
@@ -437,6 +470,26 @@
return Optional.absent();
}
+ /**
+ * Returns true is touch UI should be shown.
+ */
+ public static boolean isTouchUI(Context context) {
+ Preconditions.checkNotNull(context);
+ if (isTouchUI.isPresent()) {
+ return isTouchUI.get();
+ }
+ return context.getResources().getConfiguration().touchscreen
+ != Configuration.TOUCHSCREEN_NOTOUCH;
+ }
+
+ /**
+ * For testing purpose.
+ *
+ * @param isTouchUI Optional.absent() if default behavior is preferable
+ */
+ public static final void setTouchUI(Optional<Boolean> isTouchUI) {
+ MozcUtil.isTouchUI = Preconditions.checkNotNull(isTouchUI);
+ }
public static long getUptimeMillis() {
if (uptimeMillis.isPresent()) {
@@ -557,69 +610,102 @@
window.setAttributes(layoutParams);
}
- public static Request getRequestForKeyboard(
- KeyboardSpecificationName specName,
- Optional<SpecialRomanjiTable> romanjiTable,
- Optional<SpaceOnAlphanumeric> spaceOnAlphanumeric,
- Optional<Boolean> isKanaModifierInsensitiveConversion,
- Optional<CrossingEdgeBehavior> crossingEdgeBehavior,
- Configuration configuration) {
- Preconditions.checkNotNull(specName);
- Preconditions.checkNotNull(romanjiTable);
- Preconditions.checkNotNull(spaceOnAlphanumeric);
- Preconditions.checkNotNull(isKanaModifierInsensitiveConversion);
- Preconditions.checkNotNull(crossingEdgeBehavior);
+ private static Request.Builder getRequestBuilderInternal(
+ KeyboardSpecification specification, Configuration configuration) {
+ return Request.newBuilder()
+ .setKeyboardName(
+ specification.getKeyboardSpecificationName().formattedKeyboardName(configuration))
+ .setSpecialRomanjiTable(specification.getSpecialRomanjiTable())
+ .setSpaceOnAlphanumeric(specification.getSpaceOnAlphanumeric())
+ .setKanaModifierInsensitiveConversion(
+ specification.isKanaModifierInsensitiveConversion())
+ .setCrossingEdgeBehavior(specification.getCrossingEdgeBehavior());
+ }
+
+ private static void setHardwareKeyboardRequest(Request.Builder builder, Resources resources) {
+ builder.setMixedConversion(false)
+ .setZeroQuerySuggestion(false)
+ .setUpdateInputModeFromSurroundingText(true)
+ .setAutoPartialSuggestion(false)
+ .setCandidatePageSize(resources.getInteger(R.integer.floating_candidate_candidate_num));
+ }
+
+ public static void setSoftwareKeyboardRequest(Request.Builder builder) {
+ builder.setMixedConversion(true)
+ .setZeroQuerySuggestion(true)
+ .setUpdateInputModeFromSurroundingText(false)
+ .setAutoPartialSuggestion(true);
+ }
+
+ public static Request.Builder getRequestBuilder(
+ Resources resources, KeyboardSpecification specification, Configuration configuration) {
+ Preconditions.checkNotNull(resources);
+ Preconditions.checkNotNull(specification);
Preconditions.checkNotNull(configuration);
- Request.Builder builder = Request.newBuilder();
- builder.setKeyboardName(specName.formattedKeyboardName(configuration));
- if (romanjiTable.isPresent()) {
- builder.setSpecialRomanjiTable(romanjiTable.get());
+ Request.Builder builder = getRequestBuilderInternal(specification, configuration);
+ if (specification.isHardwareKeyboard()) {
+ setHardwareKeyboardRequest(builder, resources);
+ } else {
+ setSoftwareKeyboardRequest(builder);
}
- if (spaceOnAlphanumeric.isPresent()) {
- builder.setSpaceOnAlphanumeric(spaceOnAlphanumeric.get());
- }
- if (isKanaModifierInsensitiveConversion.isPresent()) {
- builder.setKanaModifierInsensitiveConversion(
- isKanaModifierInsensitiveConversion.get().booleanValue());
- }
- if (crossingEdgeBehavior.isPresent()) {
- builder.setCrossingEdgeBehavior(crossingEdgeBehavior.get());
- }
- return builder.build();
+ return builder;
}
@SuppressLint("InlinedApi")
- public static boolean isPasswordField(EditorInfo editorInfo) {
- Preconditions.checkNotNull(editorInfo);
- int inputType = editorInfo.inputType;
+ public static boolean isPasswordField(int inputType) {
int inputClass = inputType & InputType.TYPE_MASK_CLASS;
int inputVariation = inputType & InputType.TYPE_MASK_VARIATION;
- return inputClass == InputType.TYPE_CLASS_TEXT &&
- (inputVariation == InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD ||
- inputVariation == InputType.TYPE_TEXT_VARIATION_PASSWORD ||
- inputVariation == InputType.TYPE_TEXT_VARIATION_WEB_PASSWORD);
+ return inputClass == InputType.TYPE_CLASS_TEXT
+ && (inputVariation == InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD
+ || inputVariation == InputType.TYPE_TEXT_VARIATION_PASSWORD
+ || inputVariation == InputType.TYPE_TEXT_VARIATION_WEB_PASSWORD);
}
/**
- * Returns true if the editor accepts microphone input.
+ * Returns true if voice input is preferred by EditorInfo.inputType.
*
- * <p>Some editors sends a special record in privateImeOptions. In such situation transition to
- * Voice IME should be disabled.
+ * <p>Caller should check that voice input is allowed or not by isVoiceInputAllowed().
*/
- public static boolean isVoiceInputAllowed(EditorInfo editorInfo) {
+ public static boolean isVoiceInputPreferred(EditorInfo editorInfo) {
Preconditions.checkNotNull(editorInfo);
- if (editorInfo.privateImeOptions == null) {
- return true;
+
+ // Check privateImeOptions to ensure the text field supports voice input.
+ if (editorInfo.privateImeOptions != null) {
+ for (String option : editorInfo.privateImeOptions.split(",")) {
+ if (option.equals(IME_OPTION_NO_MICROPHONE)
+ || option.equals(IME_OPTION_NO_MICROPHONE_COMPAT)) {
+ return false;
+ }
+ }
}
- for (String option : editorInfo.privateImeOptions.split(",")) {
- if (option.equals(IME_OPTION_NO_MICROPHONE) ||
- option.equals(IME_OPTION_NO_MICROPHONE_COMPAT)) {
- return false;
+
+ int inputType = editorInfo.inputType;
+ if (isNumberKeyboardPreferred(inputType) || isPasswordField(inputType)) {
+ return false;
+ }
+ if ((inputType & EditorInfo.TYPE_MASK_CLASS) == InputType.TYPE_CLASS_TEXT) {
+ switch (inputType & EditorInfo.TYPE_MASK_VARIATION) {
+ case InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS:
+ case InputType.TYPE_TEXT_VARIATION_WEB_EMAIL_ADDRESS:
+ case InputType.TYPE_TEXT_VARIATION_URI:
+ return false;
+ default:
+ break;
}
}
return true;
}
+ /** Returns true if number keyboard is preferred by EditorInfo.inputType. */
+ public static boolean isNumberKeyboardPreferred(int inputType) {
+ int typeClass = inputType & InputType.TYPE_MASK_CLASS;
+ // As of API Level 21, following condition equals to "typeClass != InputType.TYPE_CLASS_TEXT".
+ // However type-class might be added in future so safer expression is employed here.
+ return typeClass == InputType.TYPE_CLASS_DATETIME
+ || typeClass == InputType.TYPE_CLASS_NUMBER
+ || typeClass == InputType.TYPE_CLASS_PHONE;
+ }
+
public static String utf8CStyleByteStringToString(ByteString value) {
Preconditions.checkNotNull(value);
// Find '\0' terminator. (if value doesn't contain '\0', the size should be as same as
diff --git a/src/android/src/com/google/android/inputmethod/japanese/MozcView.java b/src/android/src/com/google/android/inputmethod/japanese/MozcView.java
index 5bce6c6..e59f119 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/MozcView.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/MozcView.java
@@ -29,28 +29,33 @@
package org.mozc.android.inputmethod.japanese;
+import org.mozc.android.inputmethod.japanese.CandidateViewManager.KeyboardCandidateViewHeightListener;
import org.mozc.android.inputmethod.japanese.FeedbackManager.FeedbackEvent;
import org.mozc.android.inputmethod.japanese.LayoutParamsAnimator.InterpolationListener;
import org.mozc.android.inputmethod.japanese.ViewManagerInterface.LayoutAdjustment;
import org.mozc.android.inputmethod.japanese.emoji.EmojiProviderType;
-import org.mozc.android.inputmethod.japanese.hardwarekeyboard.HardwareKeyboard.CompositionSwitchMode;
import org.mozc.android.inputmethod.japanese.keyboard.BackgroundDrawableFactory;
import org.mozc.android.inputmethod.japanese.keyboard.KeyEventHandler;
import org.mozc.android.inputmethod.japanese.keyboard.KeyState.MetaState;
+import org.mozc.android.inputmethod.japanese.keyboard.Keyboard;
+import org.mozc.android.inputmethod.japanese.keyboard.KeyboardView;
import org.mozc.android.inputmethod.japanese.model.SymbolCandidateStorage;
+import org.mozc.android.inputmethod.japanese.model.SymbolMajorCategory;
import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Command;
import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.CompositionMode;
-import org.mozc.android.inputmethod.japanese.resources.R;
+import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Output;
import org.mozc.android.inputmethod.japanese.ui.SideFrameStubProxy;
-import org.mozc.android.inputmethod.japanese.view.MozcDrawableFactory;
-import org.mozc.android.inputmethod.japanese.view.RoundRectKeyDrawable;
-import org.mozc.android.inputmethod.japanese.view.SkinType;
+import org.mozc.android.inputmethod.japanese.view.MozcImageView;
+import org.mozc.android.inputmethod.japanese.view.Skin;
import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Optional;
import com.google.common.base.Preconditions;
+import android.annotation.TargetApi;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Rect;
+import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.inputmethodservice.InputMethodService.Insets;
import android.os.Handler;
@@ -63,48 +68,50 @@
import android.view.animation.AccelerateInterpolator;
import android.view.animation.AlphaAnimation;
import android.view.animation.Animation;
-import android.view.animation.AnimationSet;
import android.view.animation.DecelerateInterpolator;
import android.view.animation.Interpolator;
import android.view.animation.TranslateAnimation;
+import android.view.inputmethod.CursorAnchorInfo;
import android.view.inputmethod.EditorInfo;
import android.widget.CompoundButton;
import android.widget.FrameLayout;
-import android.widget.ImageView;
import android.widget.LinearLayout;
import java.util.Collections;
import java.util.EnumSet;
+import javax.annotation.Nullable;
+
/**
* Root {@code View} of the MechaMozc.
* It is expected that instance methods are used after inflation is done.
*
*/
-public class MozcView extends LinearLayout implements MemoryManageable {
+public class MozcView extends FrameLayout implements MemoryManageable {
+ @VisibleForTesting
static class DimensionPixelSize {
final int imeWindowPartialWidth;
final int imeWindowRegionInsetThreshold;
final int narrowFrameHeight;
final int narrowImeWindowHeight;
final int sideFrameWidth;
- final int translucentBorderHeight;
+ final int buttonFrameHeight;
public DimensionPixelSize(Resources resources) {
imeWindowPartialWidth = resources.getDimensionPixelSize(R.dimen.ime_window_partial_width);
imeWindowRegionInsetThreshold = resources.getDimensionPixelSize(
R.dimen.ime_window_region_inset_threshold);
narrowFrameHeight = resources.getDimensionPixelSize(R.dimen.narrow_frame_height);
narrowImeWindowHeight = resources.getDimensionPixelSize(R.dimen.narrow_ime_window_height);
- translucentBorderHeight = resources.getDimensionPixelSize(
- R.dimen.translucent_border_height);
sideFrameWidth = resources.getDimensionPixelSize(R.dimen.side_frame_width);
+ buttonFrameHeight = resources.getDimensionPixelSize(R.dimen.button_frame_height);
}
}
+ @VisibleForTesting
static class HeightLinearInterpolationListener implements InterpolationListener {
- @VisibleForTesting final int fromHeight;
- @VisibleForTesting final int toHeight;
+ final int fromHeight;
+ final int toHeight;
public HeightLinearInterpolationListener(int fromHeight, int toHeight) {
this.fromHeight = fromHeight;
@@ -121,20 +128,20 @@
// TODO(hidehiko): Refactor CandidateViewListener along with View structure refactoring.
class InputFrameFoldButtonClickListener implements OnClickListener {
- private final ViewEventListener eventListener;
private final View keyboardView;
+ private final int originalHeight;
private final long foldDuration;
private final Interpolator foldKeyboardViewInterpolator;
private final long expandDuration;
private final Interpolator expandKeyboardViewInterpolator;
private final LayoutParamsAnimator layoutParamsAnimator;
InputFrameFoldButtonClickListener(
- ViewEventListener eventListener, View keyboardView,
+ View keyboardView, int originalHeight,
long foldDuration, Interpolator foldKeyboardViewInterpolator,
long expandDuration, Interpolator expandKeyboardViewInterpolator,
LayoutParamsAnimator layoutParamsAnimator) {
- this.eventListener = eventListener;
this.keyboardView = keyboardView;
+ this.originalHeight = originalHeight;
this.foldDuration = foldDuration;
this.foldKeyboardViewInterpolator = foldKeyboardViewInterpolator;
this.expandDuration = expandDuration;
@@ -144,30 +151,45 @@
@Override
public void onClick(View v) {
- if (keyboardView.getHeight() == getInputFrameHeight()) {
- eventListener.onFireFeedbackEvent(FeedbackEvent.INPUTVIEW_FOLD);
+ if (keyboardView.getHeight() == originalHeight) {
+ if (viewEventListener != null) {
+ viewEventListener.onFireFeedbackEvent(FeedbackEvent.INPUTVIEW_FOLD);
+ }
layoutParamsAnimator.startAnimation(
keyboardView,
new HeightLinearInterpolationListener(keyboardView.getHeight(), 0),
foldKeyboardViewInterpolator, foldDuration, 0);
CompoundButton.class.cast(v).setChecked(true);
} else {
- eventListener.onFireFeedbackEvent(FeedbackEvent.INPUTVIEW_EXPAND);
+ if (viewEventListener != null) {
+ viewEventListener.onFireFeedbackEvent(FeedbackEvent.INPUTVIEW_EXPAND);
+ }
layoutParamsAnimator.startAnimation(
keyboardView,
- new HeightLinearInterpolationListener(keyboardView.getHeight(), getInputFrameHeight()),
+ new HeightLinearInterpolationListener(keyboardView.getHeight(), originalHeight),
expandKeyboardViewInterpolator, expandDuration, 0);
CompoundButton.class.cast(v).setChecked(false);
}
}
}
- // TODO(hidehiko): Move hard coded parameters to dimens.xml or skin.
- private static final float NARROW_MODE_BUTTON_CORNOR_RADIUS = 3.5f; // in dip.
- private static final float NARROW_MODE_BUTTON_LEFT_OFFSET = 2.0f;
- private static final float NARROW_MODE_BUTTON_TOP_OFFSET = 1.0f;
- private static final float NARROW_MODE_BUTTON_RIGHT_OFFSET = 2.0f;
- private static final float NARROW_MODE_BUTTON_BOTTOM_OFFSET = 3.0f;
+ /** Manages background view height. */
+ @VisibleForTesting
+ class SoftwareKeyboardHeightListener implements KeyboardCandidateViewHeightListener {
+ @Override
+ public void onExpanded() {
+ if (!isNarrowMode()) {
+ changeBottomBackgroundHeight(imeWindowHeight);
+ }
+ }
+
+ @Override
+ public void onCollapse() {
+ if (!isNarrowMode() && getSymbolInputView().getVisibility() != VISIBLE) {
+ resetBottomBackgroundHeight();
+ }
+ }
+ }
@VisibleForTesting
final InOutAnimatedFrameLayout.VisibilityChangeListener onVisibilityChangeListener =
@@ -181,23 +203,22 @@
private final DimensionPixelSize dimensionPixelSize = new DimensionPixelSize(getResources());
private final SideFrameStubProxy leftFrameStubProxy = new SideFrameStubProxy();
private final SideFrameStubProxy rightFrameStubProxy = new SideFrameStubProxy();
- private final MozcDrawableFactory mozcDrawableFactory = new MozcDrawableFactory(getResources());
+ @VisibleForTesting ViewEventListener viewEventListener;
@VisibleForTesting boolean fullscreenMode = false;
- boolean narrowMode = false;
- private SkinType skinType = SkinType.ORANGE_LIGHTGRAY;
+ @VisibleForTesting boolean narrowMode = false;
+ private boolean buttonFrameVisible = true;
+ private Skin skin = Skin.getFallbackInstance();
@VisibleForTesting LayoutAdjustment layoutAdjustment = LayoutAdjustment.FILL;
private int inputFrameHeight = 0;
@VisibleForTesting int imeWindowHeight = 0;
- @VisibleForTesting Animation candidateViewInAnimation;
- @VisibleForTesting Animation candidateViewOutAnimation;
+ @VisibleForTesting int symbolInputViewHeight = 0;
@VisibleForTesting Animation symbolInputViewInAnimation;
@VisibleForTesting Animation symbolInputViewOutAnimation;
- @VisibleForTesting Animation dropShadowCandidateViewInAnimation;
- @VisibleForTesting Animation dropShadowCandidateViewOutAnimation;
- @VisibleForTesting Animation dropShadowSymbolInputViewInAnimation;
- @VisibleForTesting Animation dropShadowSymbolInputViewOutAnimation;
- @VisibleForTesting boolean isDropShadowExpanded = false;
+ @VisibleForTesting SoftwareKeyboardHeightListener softwareKeyboardHeightListener =
+ new SoftwareKeyboardHeightListener();
+ @VisibleForTesting CandidateViewManager candidateViewManager;
+ @VisibleForTesting boolean allowFloatingCandidateMode;
public MozcView(Context context) {
super(context);
@@ -207,82 +228,29 @@
super(context, attrSet);
}
- private static Drawable createButtonBackgroundDrawable(float density) {
- return BackgroundDrawableFactory.createPressableDrawable(
- new RoundRectKeyDrawable(
- (int) (NARROW_MODE_BUTTON_LEFT_OFFSET * density),
- (int) (NARROW_MODE_BUTTON_TOP_OFFSET * density),
- (int) (NARROW_MODE_BUTTON_RIGHT_OFFSET * density),
- (int) (NARROW_MODE_BUTTON_BOTTOM_OFFSET * density),
- (int) (NARROW_MODE_BUTTON_CORNOR_RADIUS * density),
- 0xFFE9E4E4, 0xFFB2ADAD, 0, 0xFF1E1E1E),
- new RoundRectKeyDrawable(
- (int) (NARROW_MODE_BUTTON_LEFT_OFFSET * density),
- (int) (NARROW_MODE_BUTTON_TOP_OFFSET * density),
- (int) (NARROW_MODE_BUTTON_RIGHT_OFFSET * density),
- (int) (NARROW_MODE_BUTTON_BOTTOM_OFFSET * density),
- (int) (NARROW_MODE_BUTTON_CORNOR_RADIUS * density),
- 0xFF858087, 0xFF67645F, 0, 0xFF1E1E1E));
- }
-
- @SuppressWarnings("deprecation")
- private void setupImageButton(ImageView view, int resourceID) {
- float density = getResources().getDisplayMetrics().density;
- view.setImageDrawable(mozcDrawableFactory.getDrawable(resourceID).orNull());
- view.setBackgroundDrawable(createButtonBackgroundDrawable(density));
- view.setPadding(0, 0, 0, 0);
- }
-
private static Animation createAlphaAnimation(float fromAlpha, float toAlpha, long duration) {
AlphaAnimation animation = new AlphaAnimation(fromAlpha, toAlpha);
animation.setDuration(duration);
return animation;
}
- private static Animation createCandidateViewTransitionAnimation(int fromY, int toY,
- float fromAlpha, float toAlpha,
- long duration) {
- AnimationSet animation = new AnimationSet(false);
- animation.setDuration(duration);
-
- AlphaAnimation alphaAnimation = new AlphaAnimation(fromAlpha, toAlpha);
- alphaAnimation.setDuration(duration);
- animation.addAnimation(alphaAnimation);
-
- TranslateAnimation translateAnimation = new TranslateAnimation(0, 0, fromY, toY);
- translateAnimation.setInterpolator(new DecelerateInterpolator());
- translateAnimation.setDuration(duration);
- animation.addAnimation(translateAnimation);
- return animation;
- }
-
@Override
public void onFinishInflate() {
setKeyboardHeightRatio(100);
- setupImageButton(getWidenButton(), R.raw.hardware__function__close);
- setupImageButton(getHardwareCompositionButton(), R.raw.qwerty__function__kana__icon);
-
leftFrameStubProxy.initialize(this,
- R.id.stub_left_frame, R.id.dropshadow_left_short_top,
- R.id.dropshadow_left_long_top, R.id.left_adjust_button,
- R.raw.adjust_arrow_left, 1.0f, R.id.left_dropshadow_short,
- R.id.left_dropshadow_long);
+ R.id.stub_left_frame, R.id.left_adjust_button,
+ R.raw.adjust_arrow_left);
rightFrameStubProxy.initialize(this,
- R.id.stub_right_frame, R.id.dropshadow_right_short_top,
- R.id.dropshadow_right_long_top, R.id.right_adjust_button,
- R.raw.adjust_arrow_right, 0.0f, R.id.right_dropshadow_short,
- R.id.right_dropshadow_long);
+ R.id.stub_right_frame, R.id.right_adjust_button,
+ R.raw.adjust_arrow_right);
+
+ candidateViewManager = new CandidateViewManager(
+ getKeyboardCandidateView(),
+ FloatingCandidateView.class.cast(findViewById(R.id.floating_candidate_view)));
}
- public void setEventListener(final ViewEventListener viewEventListener,
- OnClickListener widenButtonClickListener,
- OnClickListener leftAdjustButtonClickListener,
- OnClickListener rightAdjustButtonClickListener) {
- checkInflated();
-
- // Propagate the given listener into the child views.
- // Set CandidateViewListener as well here, because it uses viewEventListener.
+ private InputFrameFoldButtonClickListener createFoldButtonListener(View view, int height) {
Resources resources = getResources();
int foldOvershootDurationRate =
resources.getInteger(R.integer.input_frame_fold_overshoot_duration_rate);
@@ -292,50 +260,60 @@
resources.getInteger(R.integer.input_frame_expand_overshoot_duration_rate);
int expandOvershootRate =
resources.getInteger(R.integer.input_frame_expand_overshoot_rate);
- getCandidateView().setViewEventListener(
- viewEventListener,
- new InputFrameFoldButtonClickListener(
- viewEventListener, getKeyboardFrame(),
- resources.getInteger(R.integer.input_frame_fold_duration),
- SequentialInterpolator.newBuilder()
- .add(new DecelerateInterpolator(),
- foldOvershootDurationRate, -foldOvershootRate / 1e6f)
- .add(new AccelerateInterpolator(), 1e6f - foldOvershootDurationRate, 1)
- .build(),
- resources.getInteger(R.integer.input_frame_expand_duration),
- SequentialInterpolator.newBuilder()
- .add(new DecelerateInterpolator(),
- expandOvershootDurationRate, 1 + expandOvershootRate / 1e6f)
- .add(new AccelerateDecelerateInterpolator(), 1e6f - expandOvershootDurationRate, 1)
- .build(),
- new LayoutParamsAnimator(new Handler(Looper.myLooper()))));
- getSymbolInputView().setViewEventListener(
+ return new InputFrameFoldButtonClickListener(
+ view, height, resources.getInteger(R.integer.input_frame_fold_duration),
+ SequentialInterpolator.newBuilder()
+ .add(new DecelerateInterpolator(),
+ foldOvershootDurationRate, -foldOvershootRate / 1e6f)
+ .add(new AccelerateInterpolator(), 1e6f - foldOvershootDurationRate, 1)
+ .build(),
+ resources.getInteger(R.integer.input_frame_expand_duration),
+ SequentialInterpolator.newBuilder()
+ .add(new DecelerateInterpolator(),
+ expandOvershootDurationRate, 1 + expandOvershootRate / 1e6f)
+ .add(new AccelerateDecelerateInterpolator(), 1e6f - expandOvershootDurationRate, 1)
+ .build(),
+ new LayoutParamsAnimator(new Handler(Looper.myLooper())));
+ }
+
+ public void setEventListener(final ViewEventListener viewEventListener,
+ OnClickListener widenButtonClickListener,
+ OnClickListener leftAdjustButtonClickListener,
+ OnClickListener rightAdjustButtonClickListener,
+ OnClickListener microphoneButtonClickListener) {
+ Preconditions.checkNotNull(viewEventListener);
+ Preconditions.checkNotNull(widenButtonClickListener);
+ Preconditions.checkNotNull(leftAdjustButtonClickListener);
+ Preconditions.checkNotNull(rightAdjustButtonClickListener);
+ Preconditions.checkNotNull(microphoneButtonClickListener);
+
+ checkInflated();
+
+ this.viewEventListener = viewEventListener;
+
+ // Propagate the given listener into the child views.
+ // Set CandidateViewListener as well here, because it uses viewEventListener.
+ candidateViewManager.setEventListener(viewEventListener, softwareKeyboardHeightListener);
+
+ getSymbolInputView().setEventListener(
viewEventListener,
- /**
- * Click handler of the close button.
- */
+ /** Click handler of the close button. */
new OnClickListener() {
@Override
public void onClick(View v) {
if (viewEventListener != null) {
- viewEventListener.onFireFeedbackEvent(FeedbackEvent.INPUTVIEW_FOLD);
+ viewEventListener.onFireFeedbackEvent(FeedbackEvent.SYMBOL_INPUTVIEW_CLOSED);
}
- startSymbolInputViewOutAnimation();
+ hideSymbolInputView();
}
- });
+ },
+ microphoneButtonClickListener);
- getHardwareCompositionButton().setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- viewEventListener.onHardwareKeyboardCompositionModeChange(CompositionSwitchMode.TOGGLE);
- }
- });
-
- getWidenButton().setOnClickListener(widenButtonClickListener);
-
+ getNarrowFrame().setEventListener(viewEventListener, widenButtonClickListener);
leftFrameStubProxy.setButtonOnClickListener(leftAdjustButtonClickListener);
rightFrameStubProxy.setButtonOnClickListener(rightAdjustButtonClickListener);
+ getMicrophoneButton().setOnClickListener(microphoneButtonClickListener);
}
public void setKeyEventHandler(KeyEventHandler keyEventHandler) {
@@ -347,14 +325,17 @@
}
// TODO(hidehiko): Probably we'd like to remove this method when we decide to move MVC model.
- public JapaneseKeyboard getJapaneseKeyboard() {
+ @Nullable public Keyboard getKeyboard() {
checkInflated();
- return getKeyboardView().getJapaneseKeyboard();
+ return getKeyboardView().getKeyboard().orNull();
}
- public void setJapaneseKeyboard(JapaneseKeyboard keyboard) {
+ public void setKeyboard(Keyboard keyboard) {
checkInflated();
- getKeyboardView().setJapaneseKeyboard(keyboard);
+ getKeyboardView().setKeyboard(keyboard);
+ CompositionMode compositionMode = keyboard.getSpecification().getCompositionMode();
+ getNarrowFrame().setHardwareCompositionButtonImage(compositionMode);
+ candidateViewManager.setHardwareCompositionMode(compositionMode);
}
public void setEmojiEnabled(boolean unicodeEmojiEnabled, boolean carrierEmojiEnabled) {
@@ -371,6 +352,7 @@
public void setEditorInfo(EditorInfo editorInfo) {
checkInflated();
getKeyboardView().setEditorInfo(editorInfo);
+ candidateViewManager.setEditorInfo(editorInfo);
}
public void setFlickSensitivity(int flickSensitivity) {
@@ -393,6 +375,7 @@
public void setPopupEnabled(boolean popupEnabled) {
checkInflated();
getKeyboardView().setPopupEnabled(popupEnabled);
+ getSymbolInputView().setPopupEnabled(popupEnabled);
}
public boolean isPopupEnabled() {
@@ -400,16 +383,28 @@
return getKeyboardView().isPopupEnabled();
}
- public void setSkinType(SkinType skinType) {
+ @SuppressWarnings("deprecation")
+ public void setSkin(Skin skin) {
+ Preconditions.checkNotNull(skin);
checkInflated();
- this.skinType = skinType;
- getKeyboardView().setSkinType(skinType);
- getSymbolInputView().setSkinType(skinType);
- getCandidateView().setSkinType(skinType);
+ this.skin = skin;
+ getKeyboardView().setSkin(skin);
+ getSymbolInputView().setSkin(skin);
+ candidateViewManager.setSkin(skin);
+ getMicrophoneButton().setBackgroundDrawable(BackgroundDrawableFactory.createPressableDrawable(
+ new ColorDrawable(skin.buttonFrameButtonPressedColor), Optional.<Drawable>absent()));
+ getMicrophoneButton().setSkin(skin);
+ leftFrameStubProxy.setSkin(skin);
+ rightFrameStubProxy.setSkin(skin);
+ getButtonFrame().setBackgroundDrawable(
+ skin.buttonFrameBackgroundDrawable.getConstantState().newDrawable());
+ getNarrowFrame().setSkin(skin);
+ getKeyboardFrameSeparator().setBackgroundDrawable(
+ skin.keyboardFrameSeparatorBackgroundDrawable.getConstantState().newDrawable());
}
- public SkinType getSkinType() {
- return skinType;
+ public Skin getSkin() {
+ return skin;
}
/**
@@ -417,6 +412,7 @@
* or do nothing otherwise.
* Exposed as a package private method for testing purpose.
*/
+ @VisibleForTesting
void checkInflated() {
if (getChildCount() == 0) {
throw new IllegalStateException("It is necessary to inflate mozc_view.xml");
@@ -425,22 +421,36 @@
public void setCommand(Command outCommand) {
checkInflated();
+ candidateViewManager.update(outCommand);
+ updateMetaStatesBasedOnOutput(outCommand.getOutput());
+ }
- CandidateView candidateView = getCandidateView();
- if (outCommand.getOutput().getAllCandidateWords().getCandidatesCount() > 0) {
- // Call CandidateView#update only if there are some candidates in the output.
- // In such case the candidate view will clear its canvas.
- candidateView.update(outCommand);
- startCandidateViewInAnimation();
+ // Update COMPOSING metastate.
+ @VisibleForTesting
+ void updateMetaStatesBasedOnOutput(Output output) {
+ Preconditions.checkNotNull(output);
+ boolean hasPreedit = output.hasPreedit()
+ && output.getPreedit().getSegmentCount() > 0;
+ if (hasPreedit) {
+ getKeyboardView().updateMetaStates(EnumSet.of(MetaState.COMPOSING),
+ Collections.<MetaState>emptySet());
} else {
- // We don't call update method here, because it will clear the view's contents during the
- // animation.
- // TODO(hidehiko): Clear the candidates when the animation is finished.
- startCandidateViewOutAnimation();
+ getKeyboardView().updateMetaStates(Collections.<MetaState>emptySet(),
+ EnumSet.of(MetaState.COMPOSING));
}
}
+ @TargetApi(21)
+ public void setCursorAnchorInfo(CursorAnchorInfo info) {
+ candidateViewManager.setCursorAnchorInfo(info);
+ }
+
+ public void setCursorAnchorInfoEnabled(boolean enabled) {
+ allowFloatingCandidateMode = enabled;
+ candidateViewManager.setAllowFloatingMode(enabled);
+ }
+
public void reset() {
checkInflated();
@@ -449,24 +459,21 @@
resetKeyboardViewState();
// Reset candidate view.
- CandidateView candidateView = getCandidateView();
- candidateView.clearAnimation();
- candidateView.setVisibility(View.GONE);
- candidateView.reset();
+ candidateViewManager.reset();
// Reset symbol input view visibility. Set Visibility directly (without animation).
SymbolInputView symbolInputView = getSymbolInputView();
symbolInputView.clearAnimation();
symbolInputView.setVisibility(View.GONE);
- // Reset *all* metastates.
+ // Reset *all* metastates (and set NO_GLOBE as default value).
// Expecting metastates will be set next initialization.
- getKeyboardView().updateMetaStates(Collections.<MetaState>emptySet(),
+ getKeyboardView().updateMetaStates(EnumSet.of(MetaState.NO_GLOBE),
EnumSet.allOf(MetaState.class));
resetFullscreenMode();
setLayoutAdjustmentAndNarrowMode(layoutAdjustment, narrowMode);
- collapseDropShadowAndBackground();
+ resetBottomBackgroundHeight();
updateBackgroundColor();
}
@@ -477,29 +484,38 @@
return;
}
- View keyboardFrame = getKeyboardFrame();
+ SymbolInputView symbolInputView = getSymbolInputView();
+ View keyboardFrame;
+ int keyboardFrameHeight;
+ if (symbolInputView.isInflated() && symbolInputView.getVisibility() == View.VISIBLE) {
+ keyboardFrame = getNumberKeyboardFrame();
+ keyboardFrameHeight = symbolInputView.getNumberKeyboardHeight();
+ } else {
+ keyboardFrame = getKeyboardFrame();
+ keyboardFrameHeight = getInputFrameHeight();
+ }
+
keyboardFrame.setVisibility(View.VISIBLE);
// The height may be changed so reset it here.
ViewGroup.LayoutParams layoutParams = keyboardFrame.getLayoutParams();
- int keyboardFrameHeight = getInputFrameHeight();
if (layoutParams.height != keyboardFrameHeight) {
layoutParams.height = keyboardFrameHeight;
keyboardFrame.setLayoutParams(layoutParams);
// Also reset the state of the folding button, which is "conceptually" a part of
// the keyboard.
- getCandidateView().setInputFrameFoldButtonChecked(false);
+ candidateViewManager.setInputFrameFoldButtonChecked(false);
}
}
public void resetKeyboardViewState() {
checkInflated();
-
getKeyboardView().resetState();
}
- public boolean showSymbolInputView() {
+ public boolean showSymbolInputView(Optional<SymbolMajorCategory> category) {
+ Preconditions.checkNotNull(category);
checkInflated();
SymbolInputView view = getSymbolInputView();
@@ -509,10 +525,17 @@
if (!view.isInflated()) {
view.inflateSelf();
+ CandidateView numberCandidateView =
+ CandidateView.class.cast(view.findViewById(R.id.candidate_view_in_symbol_view));
+ numberCandidateView.setInputFrameFoldButtonOnClickListener(createFoldButtonListener(
+ getNumberKeyboardFrame(), view.getNumberKeyboardHeight()));
+ candidateViewManager.setNumberCandidateView(numberCandidateView);
}
- view.reset();
+ view.resetToMajorCategory(category);
startSymbolInputViewInAnimation();
+ candidateViewManager.setNumberMode(true);
+
return true;
}
@@ -524,41 +547,51 @@
return false;
}
+ candidateViewManager.setNumberMode(false);
startSymbolInputViewOutAnimation();
return true;
}
+ private int getButtonFrameHeightIfVisible() {
+ return buttonFrameVisible ? dimensionPixelSize.buttonFrameHeight : 0;
+ }
+
/**
* Decides input frame height in not fullscreen mode.
*/
- public int getVisibleViewHeight() {
+ @VisibleForTesting
+ int getVisibleViewHeight() {
checkInflated();
+ boolean isSymbolInputViewVisible = getSymbolInputView().getVisibility() == View.VISIBLE;
// Means only software keyboard or narrow frame
- boolean isDefaultView = getCandidateView().getVisibility() != View.VISIBLE
- && getSymbolInputView().getVisibility() != View.VISIBLE;
+ boolean isDefaultView =
+ !candidateViewManager.isKeyboardCandidateViewVisible() && !isSymbolInputViewVisible;
if (narrowMode) {
if (isDefaultView) {
return dimensionPixelSize.narrowFrameHeight;
} else {
- return dimensionPixelSize.narrowImeWindowHeight
- - dimensionPixelSize.translucentBorderHeight;
+ return dimensionPixelSize.narrowImeWindowHeight;
}
} else {
if (isDefaultView) {
- return getInputFrameHeight();
+ return getInputFrameHeight() + getButtonFrameHeightIfVisible();
} else {
- return imeWindowHeight - dimensionPixelSize.translucentBorderHeight;
+ if (isSymbolInputViewVisible) {
+ return symbolInputViewHeight;
+ } else {
+ return imeWindowHeight;
+ }
}
}
}
+ @VisibleForTesting
void updateInputFrameHeight() {
// input_frame's height depends on fullscreen mode, narrow mode and Candidate/Symbol views.
if (fullscreenMode) {
- setLayoutHeight(getBottomFrame(), getVisibleViewHeight()
- + dimensionPixelSize.translucentBorderHeight);
+ setLayoutHeight(getBottomFrame(), getVisibleViewHeight());
setLayoutHeight(getKeyboardFrame(), getInputFrameHeight());
} else {
if (narrowMode) {
@@ -570,6 +603,7 @@
}
}
+ @VisibleForTesting
int getSideAdjustedWidth() {
return dimensionPixelSize.imeWindowPartialWidth + dimensionPixelSize.sideFrameWidth;
}
@@ -582,27 +616,29 @@
return fullscreenMode;
}
+ @VisibleForTesting
void resetFullscreenMode() {
if (fullscreenMode) {
// In fullscreen mode, InputMethodService shows extract view which height is 0 and
// weight is 0. So our MozcView height should be fixed.
// If CandidateView or SymbolInputView appears, MozcView height is enlarged to fix them.
- setLayoutHeight(getOverlayView(), 0);
+ getOverlayView().setVisibility(View.GONE);
setLayoutHeight(getTextInputFrame(), LayoutParams.WRAP_CONTENT);
- getCandidateView().setOnVisibilityChangeListener(onVisibilityChangeListener);
+ candidateViewManager.setOnVisibilityChangeListener(Optional.of(onVisibilityChangeListener));
getSymbolInputView().setOnVisibilityChangeListener(onVisibilityChangeListener);
} else {
- setLayoutHeight(getOverlayView(), LayoutParams.MATCH_PARENT);
+ getOverlayView().setVisibility(View.VISIBLE);
setLayoutHeight(getTextInputFrame(), LayoutParams.MATCH_PARENT);
- getCandidateView().setOnVisibilityChangeListener(null);
+ candidateViewManager.setOnVisibilityChangeListener(
+ Optional.<InOutAnimatedFrameLayout.VisibilityChangeListener>absent());
getSymbolInputView().setOnVisibilityChangeListener(null);
}
-
+ candidateViewManager.setExtractedMode(fullscreenMode);
updateInputFrameHeight();
updateBackgroundColor();
}
- static void setLayoutHeight(View view, int height) {
+ private static void setLayoutHeight(View view, int height) {
ViewGroup.LayoutParams layoutParams = view.getLayoutParams();
layoutParams.height = height;
view.setLayoutParams(layoutParams);
@@ -612,17 +648,8 @@
return narrowMode;
}
- public void setHardwareCompositionButtonImage(CompositionMode compositionMode) {
- switch (compositionMode) {
- case HIRAGANA:
- getHardwareCompositionButton().setImageDrawable(
- mozcDrawableFactory.getDrawable(R.raw.qwerty__function__kana__icon).orNull());
- break;
- default:
- getHardwareCompositionButton().setImageDrawable(
- mozcDrawableFactory.getDrawable(R.raw.qwerty__function__alphabet__icon).orNull());
- break;
- }
+ public boolean isFloatingCandidateMode() {
+ return candidateViewManager.isFloatingMode();
}
public Rect getKeyboardSize() {
@@ -678,17 +705,18 @@
float descriptionTextSize = layoutAdjustment == LayoutAdjustment.FILL
? resources.getDimension(R.dimen.candidate_description_text_size)
: resources.getDimension(R.dimen.candidate_description_text_size_aligned_layout);
- getCandidateView().setCandidateTextDimension(candidateTextSize, descriptionTextSize);
+ candidateViewManager.setCandidateTextDimension(candidateTextSize, descriptionTextSize);
getSymbolInputView().setCandidateTextDimension(candidateTextSize, descriptionTextSize);
- getConversionCandidateWordContainerView().setCandidateTextDimension(candidateTextSize);
// In narrow mode, hide software keyboard and show narrow status bar.
- getCandidateView().setNarrowMode(narrowMode);
+ candidateViewManager.setNarrowMode(narrowMode);
if (narrowMode) {
getKeyboardFrame().setVisibility(GONE);
+ getButtonFrame().setVisibility(GONE);
getNarrowFrame().setVisibility(VISIBLE);
} else {
getKeyboardFrame().setVisibility(VISIBLE);
+ getButtonFrame().setVisibility(buttonFrameVisible ? VISIBLE : GONE);
getNarrowFrame().setVisibility(GONE);
resetKeyboardFrameVisibility();
}
@@ -709,12 +737,13 @@
getForegroundFrame().startAnimation(translateAnimation);
}
+ @VisibleForTesting
void updateBackgroundColor() {
// If fullscreenMode, background should not show original window.
// If narrowMode, it is always full-width.
// If isFloatingMode, background should be transparent.
- int resourceId = (fullscreenMode || (!narrowMode && !isFloatingMode())) ?
- R.color.input_frame_background : 0;
+ int resourceId = (fullscreenMode || (!narrowMode && !isFloatingMode()))
+ ? R.color.input_frame_background : 0;
getBottomBackground().setBackgroundResource(resourceId);
}
@@ -748,62 +777,29 @@
return;
}
- void expandDropShadowAndBackground() {
- leftFrameStubProxy.flipDropShadowVisibility(INVISIBLE);
- rightFrameStubProxy.flipDropShadowVisibility(INVISIBLE);
- getDropShadowTop().setVisibility(VISIBLE);
- getResources();
- setLayoutHeight(getBottomBackground(), imeWindowHeight
- - (fullscreenMode ? 0 : dimensionPixelSize.translucentBorderHeight));
- isDropShadowExpanded = true;
- }
-
- void collapseDropShadowAndBackground() {
- leftFrameStubProxy.flipDropShadowVisibility(VISIBLE);
- rightFrameStubProxy.flipDropShadowVisibility(VISIBLE);
- getDropShadowTop().setVisibility(fullscreenMode ? VISIBLE : INVISIBLE);
- getResources();
- setLayoutHeight(getBottomBackground(), getInputFrameHeight()
- + (fullscreenMode ? dimensionPixelSize.translucentBorderHeight : 0));
- isDropShadowExpanded = false;
- }
-
- void startDropShadowAnimation(Animation mainAnimation, Animation subAnimation) {
- leftFrameStubProxy.startDropShadowAnimation(subAnimation, mainAnimation);
- rightFrameStubProxy.startDropShadowAnimation(subAnimation, mainAnimation);
- getDropShadowTop().startAnimation(mainAnimation);
- }
-
- void startCandidateViewInAnimation() {
- getCandidateView().startInAnimation();
- if (!isDropShadowExpanded) {
- expandDropShadowAndBackground();
- startDropShadowAnimation(candidateViewInAnimation, dropShadowCandidateViewInAnimation);
+ @VisibleForTesting
+ void changeBottomBackgroundHeight(int targetHeight) {
+ if (getBottomBackground().getHeight() != targetHeight) {
+ setLayoutHeight(getBottomBackground(), targetHeight);
}
}
- void startCandidateViewOutAnimation() {
- getCandidateView().startOutAnimation();
- if (getSymbolInputView().getVisibility() != VISIBLE && isDropShadowExpanded) {
- collapseDropShadowAndBackground();
- startDropShadowAnimation(candidateViewOutAnimation, dropShadowCandidateViewOutAnimation);
- }
+ @VisibleForTesting
+ void resetBottomBackgroundHeight() {
+ setLayoutHeight(getBottomBackground(), getInputFrameHeight() + getButtonFrameHeightIfVisible());
}
+ @VisibleForTesting
void startSymbolInputViewInAnimation() {
getSymbolInputView().startInAnimation();
- if (!isDropShadowExpanded) {
- expandDropShadowAndBackground();
- startDropShadowAnimation(symbolInputViewInAnimation, dropShadowSymbolInputViewInAnimation);
- }
+ changeBottomBackgroundHeight(symbolInputViewHeight);
}
+ @VisibleForTesting
void startSymbolInputViewOutAnimation() {
getSymbolInputView().startOutAnimation();
- if (getCandidateView().getVisibility() != VISIBLE && isDropShadowExpanded) {
- collapseDropShadowAndBackground();
- startDropShadowAnimation(symbolInputViewOutAnimation,
- dropShadowSymbolInputViewOutAnimation);
+ if (!candidateViewManager.isKeyboardCandidateViewVisible()) {
+ resetBottomBackgroundHeight();
}
}
@@ -811,52 +807,34 @@
* Reset components depending inputFrameHeight or imeWindowHeight.
* This should be called when inputFrameHeight and/or imeWindowHeight are updated.
*/
+ @VisibleForTesting
void resetHeightDependingComponents() {
- // Create In/Out animation which dropshadows share between CandidateView and SymbolInputView.
- {
- CandidateView candidateView = getCandidateView();
- int windowHeight = imeWindowHeight;
- int inputFrameHeight = getInputFrameHeight();
- int candidateViewHeight = windowHeight - inputFrameHeight;
- long duration = getResources().getInteger(R.integer.candidate_frame_transition_duration);
- float fromAlpha = 0.0f;
- float toAlpha = 1.0f;
+ getKeyboardCandidateView().setInputFrameFoldButtonOnClickListener(
+ createFoldButtonListener(getKeyboardFrame(), getInputFrameHeight()));
- candidateViewInAnimation = createCandidateViewTransitionAnimation(
- candidateViewHeight, 0, fromAlpha, toAlpha, duration);
- candidateView.setInAnimation(candidateViewInAnimation);
- dropShadowCandidateViewInAnimation = createAlphaAnimation(
- 1.0f - fromAlpha, 1.0f - toAlpha, duration);
-
- candidateViewOutAnimation = createCandidateViewTransitionAnimation(
- 0, candidateViewHeight, toAlpha, fromAlpha, duration);
- candidateView.setOutAnimation(candidateViewOutAnimation);
- dropShadowCandidateViewOutAnimation = createAlphaAnimation(
- 1.0f - toAlpha, 1.0f - fromAlpha, duration);
+ if (candidateViewManager != null) {
+ candidateViewManager.resetHeightDependingComponents(
+ getResources(), imeWindowHeight, inputFrameHeight);
}
SymbolInputView symbolInputView = getSymbolInputView();
{
- long duration = getResources().getInteger(R.integer.symbol_input_transition_duration_in);
+ long duration = getResources().getInteger(R.integer.symbol_input_transition_duration);
float fromAlpha = 0.3f;
float toAlpha = 1.0f;
symbolInputViewInAnimation = createAlphaAnimation(fromAlpha, toAlpha, duration);
symbolInputView.setInAnimation(symbolInputViewInAnimation);
- dropShadowSymbolInputViewInAnimation = createAlphaAnimation(
- 1.0f - fromAlpha, 1.0f - toAlpha, duration);
-
symbolInputViewOutAnimation = createAlphaAnimation(toAlpha, fromAlpha, duration);
symbolInputView.setOutAnimation(symbolInputViewOutAnimation);
- dropShadowSymbolInputViewOutAnimation = createAlphaAnimation(
- 1.0f - toAlpha, 1.0f - fromAlpha, duration);
}
- // Reset drop shadow height.
- int shortHeight = getInputFrameHeight() + dimensionPixelSize.translucentBorderHeight;
- int longHeight = imeWindowHeight;
- leftFrameStubProxy.setDropShadowHeight(shortHeight, longHeight);
- rightFrameStubProxy.setDropShadowHeight(shortHeight, longHeight);
+ if (symbolInputView.isInflated()) {
+ CandidateView numberCandidateView = CandidateView.class.cast(
+ symbolInputView.findViewById(R.id.candidate_view_in_symbol_view));
+ numberCandidateView.setInputFrameFoldButtonOnClickListener(createFoldButtonListener(
+ getNumberKeyboardFrame(), symbolInputView.getNumberKeyboardHeight()));
+ }
// Reset side adjust buttons height.
leftFrameStubProxy.resetAdjustButtonBottomMargin(getInputFrameHeight());
@@ -872,85 +850,112 @@
Resources resources = getResources();
float heightScale = keyboardHeightRatio * 0.01f;
- int originalImeWindowHeight = resources.getDimensionPixelSize(R.dimen.ime_window_height);
- int originalInputFrameHeight = resources.getDimensionPixelSize(R.dimen.input_frame_height);
- imeWindowHeight = Math.round(originalImeWindowHeight * heightScale);
+ float originalImeWindowHeight = resources.getDimension(R.dimen.ime_window_height);
+ float originalInputFrameHeight = resources.getDimension(R.dimen.input_frame_height);
inputFrameHeight = Math.round(originalInputFrameHeight * heightScale);
- // TODO(yoichio): Update SymbolInputView height scale.
- // getSymbolInputView().setHeightScale(heightScale);
+ int minImeWindowHeight = inputFrameHeight + dimensionPixelSize.buttonFrameHeight;
+ imeWindowHeight =
+ Math.max(Math.round(originalImeWindowHeight * heightScale), minImeWindowHeight);
+ symbolInputViewHeight = Math.min(imeWindowHeight, minImeWindowHeight);
updateInputFrameHeight();
+ getSymbolInputView().setVerticalDimension(symbolInputViewHeight, heightScale);
resetHeightDependingComponents();
}
- public int getInputFrameHeight() {
+ @VisibleForTesting
+ int getInputFrameHeight() {
return inputFrameHeight;
}
- // Getters of child views.
- // TODO(hidehiko): Remove (or hide) following methods, in order to split the dependencies to
- // those child views from other components.
- public CandidateView getCandidateView() {
- return CandidateView.class.cast(findViewById(R.id.candidate_view));
- }
-
- public ConversionCandidateWordContainerView getConversionCandidateWordContainerView() {
- return ConversionCandidateWordContainerView.class.cast(
- findViewById(R.id.conversion_candidate_word_container_view));
- }
-
- public View getKeyboardFrame() {
+ @VisibleForTesting
+ View getKeyboardFrame() {
return findViewById(R.id.keyboard_frame);
}
- public JapaneseKeyboardView getKeyboardView() {
- return JapaneseKeyboardView.class.cast(findViewById(R.id.keyboard_view));
+ View getKeyboardFrameSeparator() {
+ return findViewById(R.id.keyboard_frame_separator);
}
- public SymbolInputView getSymbolInputView() {
+ private View getNumberKeyboardFrame() {
+ return findViewById(R.id.number_keyboard_frame);
+ }
+
+ @VisibleForTesting
+ KeyboardView getKeyboardView() {
+ return KeyboardView.class.cast(findViewById(R.id.keyboard_view));
+ }
+
+ private CandidateView getKeyboardCandidateView() {
+ return CandidateView.class.cast(findViewById(R.id.candidate_view));
+ }
+
+ @VisibleForTesting
+ SymbolInputView getSymbolInputView() {
return SymbolInputView.class.cast(findViewById(R.id.symbol_input_view));
}
+ @VisibleForTesting
View getOverlayView() {
return findViewById(R.id.overlay_view);
}
+ @VisibleForTesting
LinearLayout getTextInputFrame() {
return LinearLayout.class.cast(findViewById(R.id.textinput_frame));
}
- FrameLayout getNarrowFrame() {
- return FrameLayout.class.cast(findViewById(R.id.narrow_frame));
+ @VisibleForTesting
+ NarrowFrameView getNarrowFrame() {
+ return NarrowFrameView.class.cast(findViewById(R.id.narrow_frame));
}
- ImageView getHardwareCompositionButton() {
- return ImageView.class.cast(findViewById(R.id.hardware_composition_button));
- }
-
- ImageView getWidenButton() {
- return ImageView.class.cast(findViewById(R.id.widen_button));
- }
-
+ @VisibleForTesting
View getForegroundFrame() {
return findViewById(R.id.foreground_frame);
}
- View getDropShadowTop() {
- return findViewById(R.id.dropshadow_top);
- }
-
+ @VisibleForTesting
View getBottomFrame() {
return findViewById(R.id.bottom_frame);
}
+ @VisibleForTesting
View getBottomBackground() {
return findViewById(R.id.bottom_background);
}
+ @VisibleForTesting
+ View getButtonFrame() {
+ return findViewById(R.id.button_frame);
+ }
+
+ @VisibleForTesting
+ MozcImageView getMicrophoneButton() {
+ return MozcImageView.class.cast(findViewById(R.id.microphone_button));
+ }
+
@Override
public void trimMemory() {
getKeyboardView().trimMemory();
- getCandidateView().trimMemory();
getSymbolInputView().trimMemory();
+ candidateViewManager.trimMemory();
+ }
+
+ void setGlobeButtonEnabled(boolean globeButtonEnabled) {
+ getKeyboardView().setGlobeButtonEnabled(globeButtonEnabled);
+ }
+
+ void setMicrophoneButtonEnabled(boolean microphoneButtonEnabled) {
+ if (narrowMode) {
+ buttonFrameVisible = false;
+ } else {
+ buttonFrameVisible = microphoneButtonEnabled;
+ int visibility = buttonFrameVisible ? View.VISIBLE : View.GONE;
+ getButtonFrame().setVisibility(visibility);
+ getMicrophoneButton().setVisibility(visibility);
+ getSymbolInputView().setMicrophoneButtonEnabled(microphoneButtonEnabled);
+ resetBottomBackgroundHeight();
+ }
}
}
diff --git a/src/android/src/com/google/android/inputmethod/japanese/NarrowFrameView.java b/src/android/src/com/google/android/inputmethod/japanese/NarrowFrameView.java
new file mode 100644
index 0000000..8434aa4
--- /dev/null
+++ b/src/android/src/com/google/android/inputmethod/japanese/NarrowFrameView.java
@@ -0,0 +1,170 @@
+// Copyright 2010-2014, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package org.mozc.android.inputmethod.japanese;
+
+import org.mozc.android.inputmethod.japanese.FeedbackManager.FeedbackEvent;
+import org.mozc.android.inputmethod.japanese.hardwarekeyboard.HardwareKeyboard.CompositionSwitchMode;
+import org.mozc.android.inputmethod.japanese.keyboard.BackgroundDrawableFactory;
+import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.CompositionMode;
+import org.mozc.android.inputmethod.japanese.view.MozcImageView;
+import org.mozc.android.inputmethod.japanese.view.RoundRectKeyDrawable;
+import org.mozc.android.inputmethod.japanese.view.Skin;
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Optional;
+import com.google.common.base.Preconditions;
+
+import android.content.Context;
+import android.graphics.drawable.Drawable;
+import android.util.AttributeSet;
+import android.view.View;
+import android.widget.LinearLayout;
+
+/**
+ * Narrow frame view.
+ */
+public class NarrowFrameView extends LinearLayout {
+
+ // TODO(hsumita): Move hard coded parameters to dimens.xml or skin.
+ private static final float BUTTON_CORNOR_RADIUS = 3.5f; // in dip.
+ private static final float BUTTON_LEFT_OFFSET = 2.0f;
+ private static final float BUTTON_TOP_OFFSET = 2.0f;
+ private static final float BUTTON_RIGHT_OFFSET = 2.0f;
+ private static final float BUTTON_BOTTOM_OFFSET = 2.0f;
+
+ private Skin skin = Skin.getFallbackInstance();
+ private CompositionMode hardwareKeyboardCompositionMode = CompositionMode.HIRAGANA;
+
+ public NarrowFrameView(Context context) {
+ super(context);
+ }
+
+ public NarrowFrameView(Context context, AttributeSet attrSet) {
+ super(context, attrSet);
+ }
+
+ @Override
+ public void onFinishInflate() {
+ // Disable h/w acceleration to use a PictureDrawable.
+ getHardwareCompositionButton().setLayerType(View.LAYER_TYPE_SOFTWARE, null);
+ getWidenButton().setLayerType(View.LAYER_TYPE_SOFTWARE, null);
+
+ setSkin(skin);
+ }
+
+ private static Drawable createButtonBackgroundDrawable(float density, Skin skin) {
+ return BackgroundDrawableFactory.createPressableDrawable(
+ new RoundRectKeyDrawable(
+ (int) (BUTTON_LEFT_OFFSET * density),
+ (int) (BUTTON_TOP_OFFSET * density),
+ (int) (BUTTON_RIGHT_OFFSET * density),
+ (int) (BUTTON_BOTTOM_OFFSET * density),
+ (int) (BUTTON_CORNOR_RADIUS * density),
+ skin.twelvekeysLayoutPressedFunctionKeyTopColor,
+ skin.twelvekeysLayoutPressedFunctionKeyBottomColor,
+ skin.twelvekeysLayoutPressedFunctionKeyHighlightColor,
+ skin.twelvekeysLayoutPressedFunctionKeyShadowColor),
+ Optional.<Drawable>of(new RoundRectKeyDrawable(
+ (int) (BUTTON_LEFT_OFFSET * density),
+ (int) (BUTTON_TOP_OFFSET * density),
+ (int) (BUTTON_RIGHT_OFFSET * density),
+ (int) (BUTTON_BOTTOM_OFFSET * density),
+ (int) (BUTTON_CORNOR_RADIUS * density),
+ skin.twelvekeysLayoutReleasedFunctionKeyTopColor,
+ skin.twelvekeysLayoutReleasedFunctionKeyBottomColor,
+ skin.twelvekeysLayoutReleasedFunctionKeyHighlightColor,
+ skin.twelvekeysLayoutReleasedFunctionKeyShadowColor)));
+ }
+
+ @SuppressWarnings("deprecation")
+ private void setupImageButton(MozcImageView view, int resourceID) {
+ float density = getResources().getDisplayMetrics().density;
+ view.setImageDrawable(skin.getDrawable(getResources(), resourceID));
+ view.setBackgroundDrawable(createButtonBackgroundDrawable(density, skin));
+ }
+
+ private void updateImageButton() {
+ setupImageButton(getWidenButton(), R.raw.hardware__function__close);
+ MozcImageView hardwareCompositionButton = getHardwareCompositionButton();
+ if (hardwareKeyboardCompositionMode == CompositionMode.HIRAGANA) {
+ setupImageButton(hardwareCompositionButton, R.raw.qwerty__function__kana__icon);
+ hardwareCompositionButton.setContentDescription(
+ getResources().getString(R.string.cd_key_chartype_to_abc));
+ } else {
+ setupImageButton(hardwareCompositionButton, R.raw.qwerty__function__alphabet__icon);
+ hardwareCompositionButton.setContentDescription(
+ getResources().getString(R.string.cd_key_chartype_to_kana));
+ }
+ }
+
+ @SuppressWarnings("deprecation")
+ public void setSkin(Skin skin) {
+ this.skin = Preconditions.checkNotNull(skin);
+ setBackgroundDrawable(skin.narrowFrameBackgroundDrawable);
+ getNarrowFrameSeparator().setBackgroundDrawable(
+ skin.keyboardFrameSeparatorBackgroundDrawable.getConstantState().newDrawable());
+ updateImageButton();
+ }
+
+ public void setEventListener(
+ final ViewEventListener viewEventListener, OnClickListener widenButtonClickListener) {
+ Preconditions.checkNotNull(viewEventListener);
+ Preconditions.checkNotNull(widenButtonClickListener);
+
+ getHardwareCompositionButton().setOnClickListener(new OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ viewEventListener.onFireFeedbackEvent(
+ FeedbackEvent.NARROW_FRAME_HARDWARE_COMPOSITION_BUTTON_DOWN);
+ viewEventListener.onHardwareKeyboardCompositionModeChange(CompositionSwitchMode.TOGGLE);
+ }
+ });
+ getWidenButton().setOnClickListener(widenButtonClickListener);
+ }
+
+ public void setHardwareCompositionButtonImage(CompositionMode compositionMode) {
+ this.hardwareKeyboardCompositionMode = Preconditions.checkNotNull(compositionMode);
+ updateImageButton();
+ }
+
+ @VisibleForTesting
+ MozcImageView getHardwareCompositionButton() {
+ return MozcImageView.class.cast(findViewById(R.id.hardware_composition_button));
+ }
+
+ @VisibleForTesting
+ MozcImageView getWidenButton() {
+ return MozcImageView.class.cast(findViewById(R.id.widen_button));
+ }
+
+ @VisibleForTesting
+ View getNarrowFrameSeparator() {
+ return findViewById(R.id.narrow_frame_separator);
+ }
+}
diff --git a/src/android/src/com/google/android/inputmethod/japanese/PrimaryKeyCodeConverter.java b/src/android/src/com/google/android/inputmethod/japanese/PrimaryKeyCodeConverter.java
index aeb8f8f..ed51f35 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/PrimaryKeyCodeConverter.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/PrimaryKeyCodeConverter.java
@@ -30,11 +30,13 @@
package org.mozc.android.inputmethod.japanese;
import org.mozc.android.inputmethod.japanese.KeycodeConverter.KeyEventInterface;
+import org.mozc.android.inputmethod.japanese.keyboard.Keyboard;
import org.mozc.android.inputmethod.japanese.keyboard.ProbableKeyEventGuesser;
import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands;
import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Input.TouchEvent;
import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.KeyEvent.ProbableKeyEvent;
import org.mozc.android.inputmethod.japanese.resources.R;
+import com.google.common.base.Optional;
import com.google.common.base.Preconditions;
import android.content.Context;
@@ -44,8 +46,6 @@
import java.util.List;
-import javax.annotation.Nullable;
-
/**
* Converter from primary key code (≒ code point) to Mozc's key event.
*
@@ -60,10 +60,7 @@
public final int keyCodeBackspace;
public final int keyCodeEnter;
public final int keyCodeChartypeToKana;
- public final int keyCodeChartypeTo123;
public final int keyCodeChartypeToAbc;
- public final int keyCodeChartypeToKana123;
- public final int keyCodeChartypeToAbc123;
public final int keyCodeSymbol;
public final int keyCodeUndo;
public final int keyCodeCapslock;
@@ -90,10 +87,7 @@
keyCodeBackspace = res.getInteger(R.integer.key_backspace);
keyCodeEnter = res.getInteger(R.integer.key_enter);
keyCodeChartypeToKana = res.getInteger(R.integer.key_chartype_to_kana);
- keyCodeChartypeTo123 = res.getInteger(R.integer.key_chartype_to_123);
keyCodeChartypeToAbc = res.getInteger(R.integer.key_chartype_to_abc);
- keyCodeChartypeToKana123 = res.getInteger(R.integer.key_chartype_to_kana_123);
- keyCodeChartypeToAbc123 = res.getInteger(R.integer.key_chartype_to_abc_123);
keyCodeSymbol = res.getInteger(R.integer.key_symbol);
keyCodeUndo = res.getInteger(R.integer.key_undo);
keyCodeCapslock = res.getInteger(R.integer.key_capslock);
@@ -103,63 +97,63 @@
this.guesser = Preconditions.checkNotNull(guesser);
}
- public void setJapaneseKeyboard(@Nullable JapaneseKeyboard japaneseKeyboard) {
- guesser.setJapaneseKeyboard(japaneseKeyboard);
+ public void setKeyboard(Keyboard keyboard) {
+ guesser.setKeyboard(Preconditions.checkNotNull(keyboard));
}
public void setConfiguration(Configuration newConfig) {
- guesser.setConfiguration(Preconditions.checkNotNull(newConfig));
+ guesser.setConfiguration(Optional.of(newConfig));
}
- public ProtoCommands.KeyEvent createMozcKeyEvent(
- int primaryCode, List<? extends TouchEvent> touchEventList) {
+ public Optional<ProtoCommands.KeyEvent> createMozcKeyEvent(
+ int primaryCode, List<TouchEvent> touchEventList) {
+ Preconditions.checkNotNull(touchEventList);
+
// Space
if (primaryCode == ' ') {
- return KeycodeConverter.SPECIALKEY_SPACE;
+ return Optional.of(KeycodeConverter.SPECIALKEY_SPACE);
}
// Enter
if (primaryCode == keyCodeEnter) {
- return KeycodeConverter.SPECIALKEY_VIRTUAL_ENTER;
+ return Optional.of(KeycodeConverter.SPECIALKEY_VIRTUAL_ENTER);
}
// Backspace
if (primaryCode == keyCodeBackspace) {
- return KeycodeConverter.SPECIALKEY_BACKSPACE;
+ return Optional.of(KeycodeConverter.SPECIALKEY_BACKSPACE);
}
// Up arrow.
if (primaryCode == keyCodeUp) {
- return KeycodeConverter.SPECIALKEY_UP;
+ return Optional.of(KeycodeConverter.SPECIALKEY_UP);
}
// Left arrow.
if (primaryCode == keyCodeLeft) {
- return KeycodeConverter.SPECIALKEY_VIRTUAL_LEFT;
+ return Optional.of(KeycodeConverter.SPECIALKEY_VIRTUAL_LEFT);
}
// Right arrow.
if (primaryCode == keyCodeRight) {
- return KeycodeConverter.SPECIALKEY_VIRTUAL_RIGHT;
+ return Optional.of(KeycodeConverter.SPECIALKEY_VIRTUAL_RIGHT);
}
// Down arrow.
if (primaryCode == keyCodeDown) {
- return KeycodeConverter.SPECIALKEY_DOWN;
+ return Optional.of(KeycodeConverter.SPECIALKEY_DOWN);
}
if (primaryCode > 0) {
ProtoCommands.KeyEvent.Builder builder =
ProtoCommands.KeyEvent.newBuilder().setKeyCode(primaryCode);
- if (guesser != null && touchEventList != null) {
+ if (!touchEventList.isEmpty()) {
List<ProbableKeyEvent> probableKeyEvents = guesser.getProbableKeyEvents(touchEventList);
- if (probableKeyEvents != null) {
- builder.addAllProbableKeyEvent(probableKeyEvents);
- }
+ builder.addAllProbableKeyEvent(probableKeyEvents);
}
- return builder.build();
+ return Optional.of(builder.build());
}
- return null;
+ return Optional.<ProtoCommands.KeyEvent>absent();
}
public KeyEventInterface getPrimaryCodeKeyEvent(int primaryCode) {
@@ -268,8 +262,8 @@
}
@Override
- public KeyEvent getNativeEvent() {
- return null;
+ public Optional<KeyEvent> getNativeEvent() {
+ return Optional.<KeyEvent>absent();
}
}
}
diff --git a/src/android/src/com/google/android/inputmethod/japanese/SymbolInputView.java b/src/android/src/com/google/android/inputmethod/japanese/SymbolInputView.java
index 5dbc0bb..5265cdf 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/SymbolInputView.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/SymbolInputView.java
@@ -34,21 +34,27 @@
import org.mozc.android.inputmethod.japanese.keyboard.BackgroundDrawableFactory;
import org.mozc.android.inputmethod.japanese.keyboard.BackgroundDrawableFactory.DrawableType;
import org.mozc.android.inputmethod.japanese.keyboard.KeyEventHandler;
+import org.mozc.android.inputmethod.japanese.keyboard.Keyboard;
+import org.mozc.android.inputmethod.japanese.keyboard.Keyboard.KeyboardSpecification;
+import org.mozc.android.inputmethod.japanese.keyboard.KeyboardActionListener;
+import org.mozc.android.inputmethod.japanese.keyboard.KeyboardFactory;
+import org.mozc.android.inputmethod.japanese.keyboard.KeyboardView;
import org.mozc.android.inputmethod.japanese.model.SymbolCandidateStorage;
import org.mozc.android.inputmethod.japanese.model.SymbolMajorCategory;
import org.mozc.android.inputmethod.japanese.model.SymbolMinorCategory;
import org.mozc.android.inputmethod.japanese.preference.PreferenceUtil;
import org.mozc.android.inputmethod.japanese.protobuf.ProtoCandidates.CandidateList;
import org.mozc.android.inputmethod.japanese.protobuf.ProtoCandidates.CandidateWord;
-import org.mozc.android.inputmethod.japanese.resources.R;
+import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Input.TouchEvent;
import org.mozc.android.inputmethod.japanese.ui.CandidateLayoutRenderer.DescriptionLayoutPolicy;
import org.mozc.android.inputmethod.japanese.ui.CandidateLayoutRenderer.ValueScalingPolicy;
import org.mozc.android.inputmethod.japanese.ui.ScrollGuideView;
import org.mozc.android.inputmethod.japanese.ui.SpanFactory;
import org.mozc.android.inputmethod.japanese.ui.SymbolCandidateLayouter;
-import org.mozc.android.inputmethod.japanese.view.MozcDrawableFactory;
+import org.mozc.android.inputmethod.japanese.view.MozcImageButton;
+import org.mozc.android.inputmethod.japanese.view.MozcImageView;
import org.mozc.android.inputmethod.japanese.view.RoundRectKeyDrawable;
-import org.mozc.android.inputmethod.japanese.view.SkinType;
+import org.mozc.android.inputmethod.japanese.view.Skin;
import org.mozc.android.inputmethod.japanese.view.SymbolMajorCategoryButtonDrawableFactory;
import org.mozc.android.inputmethod.japanese.view.TabSelectedBackgroundDrawable;
import com.google.common.annotations.VisibleForTesting;
@@ -62,36 +68,31 @@
import android.content.res.Resources;
import android.content.res.TypedArray;
import android.graphics.Canvas;
-import android.graphics.Color;
-import android.graphics.Paint;
-import android.graphics.Typeface;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
+import android.graphics.drawable.InsetDrawable;
import android.graphics.drawable.LayerDrawable;
import android.os.IBinder;
+import android.os.Looper;
import android.preference.PreferenceManager;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.util.AttributeSet;
-import android.util.TypedValue;
-import android.view.GestureDetector;
-import android.view.GestureDetector.OnGestureListener;
-import android.view.Gravity;
import android.view.InflateException;
import android.view.LayoutInflater;
-import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.Animation;
-import android.widget.ImageButton;
import android.widget.ImageView;
+import android.widget.LinearLayout;
import android.widget.TabHost;
import android.widget.TabHost.OnTabChangeListener;
import android.widget.TabHost.TabSpec;
import android.widget.TabWidget;
import android.widget.TextView;
+import java.util.Collections;
import java.util.List;
/**
@@ -113,15 +114,18 @@
/**
* Adapter for symbol candidate selection.
- * Exposed as package private for testing.
*/
// TODO(hidehiko): make this class static.
- class SymbolCandidateSelectListener implements CandidateSelectListener {
+ @VisibleForTesting class SymbolCandidateSelectListener implements CandidateSelectListener {
@Override
public void onCandidateSelected(CandidateWord candidateWord, Optional<Integer> row) {
- if (viewEventListener != null) {
+ Preconditions.checkNotNull(candidateWord);
+ // When current major category is NUMBER, CandidateView.ConversionCandidateSelectListener
+ // should handle candidate selection event.
+ Preconditions.checkState(currentMajorCategory != SymbolMajorCategory.NUMBER);
+ if (viewEventListener.isPresent()) {
// If we are on password field, history shouldn't be updated to protect privacy.
- viewEventListener.onSymbolCandidateSelected(
+ viewEventListener.get().onSymbolCandidateSelected(
currentMajorCategory, candidateWord.getValue(), !isPasswordField);
}
}
@@ -130,20 +134,18 @@
/**
* Click handler of major category buttons.
*/
- class MajorCategoryButtonClickListener implements OnClickListener {
+ @VisibleForTesting class MajorCategoryButtonClickListener implements OnClickListener {
private final SymbolMajorCategory majorCategory;
MajorCategoryButtonClickListener(SymbolMajorCategory majorCategory) {
- if (majorCategory == null) {
- throw new NullPointerException("majorCategory should not be null.");
- }
- this.majorCategory = majorCategory;
+ this.majorCategory = Preconditions.checkNotNull(majorCategory);
}
@Override
public void onClick(View majorCategorySelectorButton) {
- if (viewEventListener != null) {
- viewEventListener.onFireFeedbackEvent(FeedbackEvent.INPUTVIEW_EXPAND);
+ if (viewEventListener.isPresent()) {
+ viewEventListener.get().onFireFeedbackEvent(
+ FeedbackEvent.SYMBOL_INPUTVIEW_MAJOR_CATEGORY_SELECTED);
}
if (emojiEnabled
@@ -152,17 +154,17 @@
// Ask the user which emoji provider s/he'd like to use.
// If the user cancels the dialog, do nothing.
maybeInitializeEmojiProviderDialog(getContext());
- if (emojiProviderDialog != null) {
+ if (emojiProviderDialog.isPresent()) {
IBinder token = getWindowToken();
if (token != null) {
- MozcUtil.setWindowToken(token, emojiProviderDialog);
+ MozcUtil.setWindowToken(token, emojiProviderDialog.get());
} else {
MozcLog.w("Unknown window token.");
}
// If a user selects a provider, the dialog handler will set major category
// to EMOJI automatically. If s/he cancels, nothing will be happened.
- emojiProviderDialog.show();
+ emojiProviderDialog.get().show();
return;
}
}
@@ -171,65 +173,77 @@
}
}
- // Manages the relationship between.
- static class SymbolTabWidgetViewPagerAdapter extends PagerAdapter
+ private static class SymbolTabWidgetViewPagerAdapter extends PagerAdapter
implements OnTabChangeListener, OnPageChangeListener {
private static final int HISTORY_INDEX = 0;
private final Context context;
private final SymbolCandidateStorage symbolCandidateStorage;
- private final ViewEventListener viewEventListener;
+ private final Optional<ViewEventListener> viewEventListener;
private final CandidateSelectListener candidateSelectListener;
private final SymbolMajorCategory majorCategory;
- private final SkinType skinType;
+ private Skin skin;
private final EmojiProviderType emojiProviderType;
private final TabHost tabHost;
private final ViewPager viewPager;
private final float candidateTextSize;
private final float descriptionTextSize;
- private View historyViewCache = null;
+ private Optional<View> historyViewCache = Optional.absent();
private int scrollState = ViewPager.SCROLL_STATE_IDLE;
+ private boolean feedbackEnabled = true;
SymbolTabWidgetViewPagerAdapter(
Context context, SymbolCandidateStorage symbolCandidateStorage,
- ViewEventListener viewEventListener, CandidateSelectListener candidateSelectListener,
- SymbolMajorCategory majorCategory,
- SkinType skinType, EmojiProviderType emojiProviderType,
- TabHost tabHost, ViewPager viewPager,
+ Optional<ViewEventListener> viewEventListener,
+ CandidateSelectListener candidateSelectListener, SymbolMajorCategory majorCategory,
+ Skin skin, EmojiProviderType emojiProviderType, TabHost tabHost, ViewPager viewPager,
float candidateTextSize, float descriptionTextSize) {
- Preconditions.checkNotNull(emojiProviderType);
+ this.context = Preconditions.checkNotNull(context);
+ this.symbolCandidateStorage = Preconditions.checkNotNull(symbolCandidateStorage);
+ this.viewEventListener = Preconditions.checkNotNull(viewEventListener);
+ this.candidateSelectListener = Preconditions.checkNotNull(candidateSelectListener);
+ this.majorCategory = Preconditions.checkNotNull(majorCategory);
+ this.skin = Preconditions.checkNotNull(skin);
+ this.emojiProviderType = Preconditions.checkNotNull(emojiProviderType);
+ this.tabHost = Preconditions.checkNotNull(tabHost);
+ this.viewPager = Preconditions.checkNotNull(viewPager);
+ this.candidateTextSize = Preconditions.checkNotNull(candidateTextSize);
+ this.descriptionTextSize = Preconditions.checkNotNull(descriptionTextSize);
+ }
- this.context = context;
- this.symbolCandidateStorage = symbolCandidateStorage;
- this.viewEventListener = viewEventListener;
- this.candidateSelectListener = candidateSelectListener;
- this.majorCategory = majorCategory;
- this.skinType = skinType;
- this.emojiProviderType = emojiProviderType;
- this.tabHost = tabHost;
- this.viewPager = viewPager;
- this.candidateTextSize = candidateTextSize;
- this.descriptionTextSize = descriptionTextSize;
+ public void setSkin(Skin skin) {
+ Preconditions.checkNotNull(skin);
+ this.skin = skin;
+ }
+
+ public void setFeedbackEnabled(boolean enabled) {
+ feedbackEnabled = enabled;
}
private void maybeResetHistoryView() {
- if (viewPager.getCurrentItem() != HISTORY_INDEX && historyViewCache != null) {
+ if (viewPager.getCurrentItem() != HISTORY_INDEX && historyViewCache.isPresent()) {
resetHistoryView();
}
}
private void resetHistoryView() {
+ if (!historyViewCache.isPresent()) {
+ return;
+ }
CandidateList candidateList =
symbolCandidateStorage.getCandidateList(majorCategory.minorCategories.get(0));
+ View noHistoryView = historyViewCache.get().findViewById(R.id.symbol_input_no_history);
if (candidateList.getCandidatesCount() == 0) {
- historyViewCache.findViewById(R.id.symbol_input_no_history).setVisibility(View.VISIBLE);
+ noHistoryView.setVisibility(View.VISIBLE);
+ TextView.class.cast(historyViewCache.get().findViewById(R.id.symbol_input_no_history_text))
+ .setTextColor(skin.candidateValueTextColor);
} else {
- historyViewCache.findViewById(R.id.symbol_input_no_history).setVisibility(View.GONE);
+ noHistoryView.setVisibility(View.GONE);
}
- SymbolCandidateView.class.cast(
- historyViewCache.findViewById(R.id.symbol_input_candidate_view)).update(candidateList);
+ SymbolCandidateView.class.cast(historyViewCache.get().findViewById(
+ R.id.symbol_input_candidate_view)).update(candidateList);
}
@Override
@@ -250,10 +264,6 @@
tabHost.setOnTabChangedListener(null);
tabHost.setCurrentTab(position);
tabHost.setOnTabChangedListener(this);
-
- if (viewEventListener != null) {
- viewEventListener.onFireFeedbackEvent(FeedbackEvent.INPUTVIEW_EXPAND);
- }
}
@Override
@@ -265,8 +275,9 @@
}
viewPager.setCurrentItem(position, false);
- if (viewEventListener != null) {
- viewEventListener.onFireFeedbackEvent(FeedbackEvent.INPUTVIEW_EXPAND);
+ if (feedbackEnabled && viewEventListener.isPresent()) {
+ viewEventListener.get().onFireFeedbackEvent(
+ FeedbackEvent.SYMBOL_INPUTVIEW_MINOR_CATEGORY_SELECTED);
}
}
@@ -293,13 +304,21 @@
symbolCandidateView.setCandidateSelectListener(candidateSelectListener);
symbolCandidateView.setMinColumnWidth(
context.getResources().getDimension(majorCategory.minColumnWidthResourceId));
- symbolCandidateView.setSkinType(skinType);
+ symbolCandidateView.setSkin(skin);
symbolCandidateView.setEmojiProviderType(emojiProviderType);
- symbolCandidateView.setCandidateTextDimension(candidateTextSize, descriptionTextSize);
+ if (majorCategory.layoutPolicy == DescriptionLayoutPolicy.GONE) {
+ // As it's guaranteed for descriptions not to be shown,
+ // show values using additional space where is reserved for descriptions.
+ // This makes Emoji bigger.
+ symbolCandidateView.setCandidateTextDimension(candidateTextSize + descriptionTextSize, 0);
+ } else {
+ symbolCandidateView.setCandidateTextDimension(candidateTextSize, descriptionTextSize);
+ }
+ symbolCandidateView.setDescriptionLayoutPolicy(majorCategory.layoutPolicy);
// Set candidate contents.
if (position == HISTORY_INDEX) {
- historyViewCache = view;
+ historyViewCache = Optional.of(view);
resetHistoryView();
} else {
symbolCandidateView.update(symbolCandidateStorage.getCandidateList(
@@ -309,7 +328,7 @@
ScrollGuideView scrollGuideView =
ScrollGuideView.class.cast(view.findViewById(R.id.symbol_input_scroll_guide_view));
- scrollGuideView.setSkinType(skinType);
+ scrollGuideView.setSkin(skin);
// Connect guide and candidate view.
scrollGuideView.setScroller(symbolCandidateView.scroller);
@@ -322,81 +341,20 @@
@Override
public void destroyItem(ViewGroup collection, int position, Object view) {
if (position == HISTORY_INDEX) {
- historyViewCache = null;
+ historyViewCache = Optional.absent();
}
collection.removeView(View.class.cast(view));
}
}
/**
- * The text view for the minor category tab.
- * The most thing is as same as base TextView, but if the text is too long to fit in
- * the view, this view automatically scales the text horizontally. (If there is enough
- * space, doesn't widen.)
- */
- private static class TabTextView extends TextView {
-
- /** Cached Paint instance to measure the text. */
- private final Paint paint = new Paint();
-
- TabTextView(Context context) {
- super(context);
- }
-
- @Override
- protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
- super.onLayout(changed, left, top, right, bottom);
- resetTextXSize();
- }
-
- private void resetTextXSize() {
- // Reset the paint instance.
- Paint paint = this.paint;
- paint.reset();
- paint.setAntiAlias(true);
- paint.setTextSize(getTextSize());
- paint.setTypeface(getTypeface());
-
- // Measure the width for each line.
- CharSequence text = getText().toString();
- float maxTextWidth = 0;
- int beginIndex = 0;
- for (int i = beginIndex; i < text.length(); ++i) {
- if (text.charAt(i) == '\n') {
- // Split the line.
- float textWidth = paint.measureText(text, beginIndex, i);
- if (textWidth > maxTextWidth) {
- maxTextWidth = textWidth;
- }
- // Exclude '\n'.
- beginIndex = i + 1;
- }
- }
- {
- // Last line.
- float textWidth = paint.measureText(text, beginIndex, text.length());
- if (textWidth > maxTextWidth) {
- maxTextWidth = textWidth;
- }
- }
-
- // Calculate scale factory. Note that 0.98f is the heuristic value,
- // in order to avoid wrapping lines by sub px calculations just in case.
- float scaleX = (getWidth() - getPaddingLeft() - getPaddingRight()) * 0.98f / maxTextWidth;
-
- // Cap the scaleX by 1f not to widen.
- setTextScaleX(Math.min(scaleX, 1f));
- }
- }
-
- /**
* An event listener for the menu dialog window.
*/
private class EmojiProviderDialogListener implements DialogInterface.OnClickListener {
private final Context context;
EmojiProviderDialogListener(Context context) {
- this.context = context;
+ this.context = Preconditions.checkNotNull(context);
}
@Override
@@ -422,11 +380,10 @@
* The differences from CandidateView.CandidateWordViewForConversion are
* 1) this class scrolls horizontally 2) the layout algorithm is simpler.
*/
- static class SymbolCandidateView extends CandidateWordView {
+ private static class SymbolCandidateView extends CandidateWordView {
private static final String DESCRIPTION_DELIMITER = "\n";
- private View scrollGuideView = null;
- private GestureDetector gestureDetector = null;
+ private Optional<View> scrollGuideView = Optional.absent();
public SymbolCandidateView(Context context) {
super(context, Orientation.VERTICAL);
@@ -442,7 +399,7 @@
// Shared instance initializer.
{
- setBackgroundDrawableType(DrawableType.SYMBOL_CANDIDATE_BACKGROUND);
+ setSpanBackgroundDrawableType(DrawableType.SYMBOL_CANDIDATE_BACKGROUND);
Resources resources = getResources();
scroller.setDecayRate(
resources.getInteger(R.integer.symbol_input_scroller_velocity_decay_rate) / 1000000f);
@@ -452,25 +409,27 @@
}
void setCandidateTextDimension(float textSize, float descriptionTextSize) {
- Preconditions.checkArgument(textSize > 0);
- Preconditions.checkArgument(descriptionTextSize > 0);
+ Preconditions.checkArgument(textSize >= 0);
+ Preconditions.checkArgument(descriptionTextSize >= 0);
Resources resources = getResources();
float valueHorizontalPadding =
- resources.getDimension(R.dimen.candidate_horizontal_padding_size);
+ resources.getDimension(R.dimen.symbol_candidate_horizontal_padding_size);
float descriptionHorizontalPadding =
resources.getDimension(R.dimen.symbol_description_right_padding);
float descriptionVerticalPadding =
resources.getDimension(R.dimen.symbol_description_bottom_padding);
+ float separatorWidth = resources.getDimensionPixelSize(R.dimen.candidate_separator_width);
+ carrierEmojiRenderHelper.setCandidateTextSize(textSize);
candidateLayoutRenderer.setValueTextSize(textSize);
candidateLayoutRenderer.setValueHorizontalPadding(valueHorizontalPadding);
candidateLayoutRenderer.setValueScalingPolicy(ValueScalingPolicy.UNIFORM);
candidateLayoutRenderer.setDescriptionTextSize(descriptionTextSize);
candidateLayoutRenderer.setDescriptionHorizontalPadding(descriptionHorizontalPadding);
candidateLayoutRenderer.setDescriptionVerticalPadding(descriptionVerticalPadding);
- candidateLayoutRenderer.setDescriptionLayoutPolicy(DescriptionLayoutPolicy.OVERLAY);
+ candidateLayoutRenderer.setSeparatorWidth(separatorWidth);
SpanFactory spanFactory = new SpanFactory();
spanFactory.setValueTextSize(textSize);
@@ -492,32 +451,31 @@
updateLayouter();
}
- void setOnGestureListener(OnGestureListener gestureListener) {
- if (gestureListener == null) {
- gestureDetector = null;
- } else {
- gestureDetector = new GestureDetector(getContext(), gestureListener);
- }
- }
-
- @Override
- public boolean onTouchEvent(MotionEvent event) {
- if (gestureDetector != null && gestureDetector.onTouchEvent(event)) {
- return true;
- }
- return super.onTouchEvent(event);
- }
-
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
- if (scrollGuideView != null) {
- scrollGuideView.invalidate();
+ if (scrollGuideView.isPresent()) {
+ scrollGuideView.get().invalidate();
}
}
void setScrollIndicator(View scrollGuideView) {
- this.scrollGuideView = scrollGuideView;
+ this.scrollGuideView = Optional.of(scrollGuideView);
+ }
+
+ @Override
+ protected Drawable getViewBackgroundDrawable(Skin skin) {
+ return Preconditions.checkNotNull(skin).symbolCandidateViewBackgroundDrawable;
+ }
+
+ @Override
+ public void setSkin(Skin skin) {
+ super.setSkin(skin);
+ candidateLayoutRenderer.setSeparatorColor(skin.symbolCandidateBackgroundSeparatorColor);
+ }
+
+ public void setDescriptionLayoutPolicy(DescriptionLayoutPolicy policy) {
+ candidateLayoutRenderer.setDescriptionLayoutPolicy(Preconditions.checkNotNull(policy));
}
}
@@ -539,59 +497,46 @@
*/
static final KeyboardSpecificationName SPEC_NAME =
new KeyboardSpecificationName("SYMBOL_INPUT_VIEW", 0, 1, 0);
- // Source ID of the delete button for logging usage stats.
+ // Source ID of the delete/enter button for logging usage stats.
private static final int DELETE_BUTTON_SOURCE_ID = 1;
-
- // TODO(hidehiko): move these parameters to skin instance.
- private static final float BUTTON_CORNOR_RADIUS = 3.5f; // in dip.
- private static final float BUTTON_LEFT_OFFSET = 2.0f;
- private static final float BUTTON_TOP_OFFSET = 2.0f;
- private static final float BUTTON_RIGHT_OFFSET = 2.0f;
- private static final float BUTTON_BOTTOM_OFFSET = 2.0f;
-
- private static final int MAJOR_CATEGORY_TOP_COLOR = 0xFFF5F5F5;
- private static final int MAJOR_CATEGORY_BOTTOM_COLOR = 0xFFD2D2D2;
- private static final int MAJOR_CATEGORY_PRESSED_TOP_COLOR = 0xFFAAAAAA;
- private static final int MAJOR_CATEGORY_PRESSED_BOTTOM_COLOR = 0xFF828282;
- private static final int MAJOR_CATEGORY_SHADOW_COLOR = 0x57000000;
-
- // TODO(hidehiko): This parameter is not fixed yet. Needs to revisit again.
- private static final float SYMBOL_VIEW_MINOR_CATEGORY_TAB_SELECTED_HEIGHT = 6f;
+ private static final int ENTER_BUTTON_SOURCE_ID = 2;
private static final int NUM_TABS = 6;
- private SymbolCandidateStorage symbolCandidateStorage;
+ private Optional<Integer> viewHeight = Optional.absent();
+ private Optional<Integer> numberKeyboardHeight = Optional.absent();
+ private Optional<Float> keyboardHeightScale = Optional.absent();
- @VisibleForTesting SymbolMajorCategory currentMajorCategory;
+ private Optional<SymbolCandidateStorage> symbolCandidateStorage = Optional.absent();
+
+ @VisibleForTesting SymbolMajorCategory currentMajorCategory = SymbolMajorCategory.NUMBER;
@VisibleForTesting boolean emojiEnabled;
private boolean isPasswordField;
@VisibleForTesting EmojiProviderType emojiProviderType = EmojiProviderType.NONE;
@VisibleForTesting SharedPreferences sharedPreferences;
- @VisibleForTesting AlertDialog emojiProviderDialog;
+ @VisibleForTesting Optional<AlertDialog> emojiProviderDialog = Optional.absent();
- private ViewEventListener viewEventListener;
+ private Optional<ViewEventListener> viewEventListener = Optional.absent();
private final KeyEventButtonTouchListener deleteKeyEventButtonTouchListener =
createDeleteKeyEventButtonTouchListener(getResources());
- private OnClickListener closeButtonClickListener = null;
+ private final KeyEventButtonTouchListener enterKeyEventButtonTouchListener =
+ createEnterKeyEventButtonTouchListener(getResources());
+ private Optional<OnClickListener> closeButtonClickListener = Optional.absent();
+ private Optional<OnClickListener> microphoneButtonClickListener = Optional.absent();
private final SymbolCandidateSelectListener symbolCandidateSelectListener =
new SymbolCandidateSelectListener();
- private SkinType skinType = SkinType.ORANGE_LIGHTGRAY;
- private final MozcDrawableFactory mozcDrawableFactory = new MozcDrawableFactory(getResources());
+ private Skin skin = Skin.getFallbackInstance();
private final SymbolMajorCategoryButtonDrawableFactory majorCategoryButtonDrawableFactory =
- new SymbolMajorCategoryButtonDrawableFactory(
- mozcDrawableFactory,
- MAJOR_CATEGORY_TOP_COLOR,
- MAJOR_CATEGORY_BOTTOM_COLOR,
- MAJOR_CATEGORY_PRESSED_TOP_COLOR,
- MAJOR_CATEGORY_PRESSED_BOTTOM_COLOR,
- MAJOR_CATEGORY_SHADOW_COLOR,
- BUTTON_CORNOR_RADIUS * getResources().getDisplayMetrics().density);
+ new SymbolMajorCategoryButtonDrawableFactory(getResources());
// Candidate text size in dip.
private float candidateTextSize;
// Description text size in dip.
private float desciptionTextSize;
+ private Optional<KeyEventHandler> keyEventHandler = Optional.absent();
+ private boolean isMicrophoneButtonEnabled;
+ private boolean popupEnabled;
public SymbolInputView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
@@ -607,27 +552,28 @@
{
setOutAnimationListener(new OutAnimationAdapter());
- sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getContext());
+ sharedPreferences =
+ Preconditions.checkNotNull(PreferenceManager.getDefaultSharedPreferences(getContext()));
}
private static KeyEventButtonTouchListener createDeleteKeyEventButtonTouchListener(
Resources resources) {
- // Use 8 as default value of backspace key code (only for testing).
- // This code is introduced just for testing purpose due to AndroidMock's limitation.
- // When we move to EasyMock, we can remove this method.
- int ucharBackspace = resources == null ? 8 : resources.getInteger(R.integer.uchar_backspace);
- return new KeyEventButtonTouchListener(DELETE_BUTTON_SOURCE_ID, ucharBackspace);
+ return new KeyEventButtonTouchListener(
+ DELETE_BUTTON_SOURCE_ID, resources.getInteger(R.integer.uchar_backspace));
}
+ private static KeyEventButtonTouchListener createEnterKeyEventButtonTouchListener(
+ Resources resources) {
+ return new KeyEventButtonTouchListener(
+ ENTER_BUTTON_SOURCE_ID, resources.getInteger(R.integer.uchar_linefeed));
+ }
boolean isInflated() {
return getChildCount() > 0;
}
void inflateSelf() {
- if (isInflated()) {
- throw new IllegalStateException("The symbol input view is already inflated.");
- }
+ Preconditions.checkState(!isInflated(), "The symbol input view is already inflated.");
// Hack: Because we wrap the real context to inject "retrying" for Drawable loading,
// LayoutInflater.from(getContext()).getContext() may be different from getContext().
@@ -649,17 +595,112 @@
* So, instead, we define another onFinishInflate method and invoke this manually.
*/
protected void onFinishInflateSelf() {
- initializeMajorCategoryButtons();
+ if (viewHeight.isPresent() && keyboardHeightScale.isPresent()) {
+ setVerticalDimension(viewHeight.get(), keyboardHeightScale.get());
+ }
+
initializeMinorCategoryTab();
initializeCloseButton();
initializeDeleteButton();
+ initializeEnterButton();
+ initializeMicrophoneButton();
- resetMajorCategoryBackground();
- resetTabBackground();
+ // Set TouchListener that does nothing. Without this hack, state_pressed event
+ // will be propagated to close / enter key and the drawable will be changed to
+ // state_pressed one unexpectedly. Note that those keys are NOT children of this view.
+ // Setting ClickListener to the key seems to suppress this unexpected highlight, too,
+ // but we want to keep the current TouchListener for the enter key.
+ OnTouchListener doNothingOnTouchListener = new OnTouchListener() {
+ @Override
+ public boolean onTouch(View button, android.view.MotionEvent event) {
+ return true;
+ }
+ };
+ for (int id : new int[] {R.id.button_frame_in_symbol_view,
+ R.id.symbol_view_backspace_separator,
+ R.id.symbol_major_category,
+ R.id.symbol_separator_1,
+ R.id.symbol_separator_2,
+ R.id.symbol_separator_3,
+ R.id.symbol_view_close_button_separator,
+ R.id.symbol_view_enter_button_separator}) {
+ findViewById(id).setOnTouchListener(doNothingOnTouchListener);
+ }
+
+ KeyboardView keyboardView = KeyboardView.class.cast(findViewById(R.id.number_keyboard));
+ keyboardView.setPopupEnabled(popupEnabled);
+ keyboardView.setKeyEventHandler(new KeyEventHandler(
+ Looper.getMainLooper(),
+ new KeyboardActionListener() {
+ @Override
+ public void onRelease(int keycode) {
+ }
+
+ @Override
+ public void onPress(int keycode) {
+ if (viewEventListener.isPresent()) {
+ viewEventListener.get().onFireFeedbackEvent(FeedbackEvent.KEY_DOWN);
+ }
+ }
+
+ @Override
+ public void onKey(int primaryCode, List<TouchEvent> touchEventList) {
+ if (keyEventHandler.isPresent()) {
+ keyEventHandler.get().sendKey(primaryCode, touchEventList);
+ }
+ }
+
+ @Override
+ public void onCancel() {
+ }
+ },
+ getResources().getInteger(R.integer.config_repeat_key_delay),
+ getResources().getInteger(R.integer.config_repeat_key_interval),
+ getResources().getInteger(R.integer.config_long_press_key_delay)));
+
enableEmoji(emojiEnabled);
+
+ // Disable h/w acceleration to use a PictureDrawable.
+ for (SymbolMajorCategory majorCategory : SymbolMajorCategory.values()) {
+ getMajorCategoryButton(majorCategory).setLayerType(View.LAYER_TYPE_SOFTWARE, null);
+ }
+
+ updateSkinAwareDrawable();
reset();
}
+ private static void setLayoutHeight(View view, int height) {
+ ViewGroup.LayoutParams layoutParams = view.getLayoutParams();
+ layoutParams.height = height;
+ view.setLayoutParams(layoutParams);
+ }
+
+ public void setVerticalDimension(int symbolInputViewHeight, float keyboardHeightScale) {
+ this.viewHeight = Optional.of(symbolInputViewHeight);
+ this.keyboardHeightScale = Optional.of(keyboardHeightScale);
+
+ Resources resources = getResources();
+ float originalMajorCategoryHeight =
+ resources.getDimension(R.dimen.symbol_view_major_category_height);
+ int majorCategoryHeight = Math.round(originalMajorCategoryHeight * keyboardHeightScale);
+ this.numberKeyboardHeight = Optional.of(
+ symbolInputViewHeight - majorCategoryHeight
+ - resources.getDimensionPixelSize(R.dimen.button_frame_height));
+
+ if (!isInflated()) {
+ return;
+ }
+
+ setLayoutHeight(this, symbolInputViewHeight);
+ setLayoutHeight(getMajorCategoryFrame(), majorCategoryHeight);
+ setLayoutHeight(findViewById(R.id.number_keyboard), numberKeyboardHeight.get());
+ setLayoutHeight(findViewById(R.id.number_keyboard_frame), LayoutParams.WRAP_CONTENT);
+ }
+
+ public int getNumberKeyboardHeight() {
+ return numberKeyboardHeight.get();
+ }
+
private void resetCandidateViewPager() {
if (!isInflated()) {
return;
@@ -667,52 +708,59 @@
ViewPager candidateViewPager = getCandidateViewPager();
TabHost tabHost = getTabHost();
+ Preconditions.checkState(symbolCandidateStorage.isPresent());
SymbolTabWidgetViewPagerAdapter adapter = new SymbolTabWidgetViewPagerAdapter(
getContext(),
- symbolCandidateStorage, viewEventListener, symbolCandidateSelectListener,
- currentMajorCategory, skinType, emojiProviderType, tabHost, candidateViewPager,
+ symbolCandidateStorage.get(), viewEventListener, symbolCandidateSelectListener,
+ currentMajorCategory, skin, emojiProviderType, tabHost, candidateViewPager,
candidateTextSize, desciptionTextSize);
candidateViewPager.setAdapter(adapter);
candidateViewPager.setOnPageChangeListener(adapter);
tabHost.setOnTabChangedListener(adapter);
}
- private void resetMajorCategoryBackground() {
- View view = findViewById(R.id.symbol_major_category);
+ @SuppressWarnings("deprecation")
+ private void updateMajorCategoryBackgroundSkin() {
+ View view = getMajorCategoryFrame();
if (view != null) {
- if (skinType == null) {
- view.setBackgroundColor(Color.BLACK);
- } else {
- view.setBackgroundResource(skinType.windowBackgroundResourceId);
- }
+ view.setBackgroundDrawable(
+ skin.symbolMajorCategoryBackgroundDrawable.getConstantState().newDrawable());
}
}
- private void setMozcDrawable(ImageView imageView, int resourceId) {
- Optional<Drawable> drawable = mozcDrawableFactory.getDrawable(resourceId);
- if (drawable.isPresent()) {
- imageView.setImageDrawable(drawable.get());
+ @SuppressWarnings("deprecation")
+ private void updateMinorCategoryBackgroundSkin() {
+ View view = getMinorCategoryFrame();
+ if (view != null) {
+ view.setBackgroundDrawable(
+ skin.buttonFrameBackgroundDrawable.getConstantState().newDrawable());
}
}
+ @SuppressWarnings("deprecation")
+ private void updateNumberKeyboardSkin() {
+ getNumberKeyboardView().setSkin(skin);
+ findViewById(R.id.number_frame).setBackgroundDrawable(
+ skin.windowBackgroundDrawable.getConstantState().newDrawable());
+ findViewById(R.id.button_frame_in_symbol_view).setBackgroundDrawable(
+ skin.buttonFrameBackgroundDrawable.getConstantState().newDrawable());
+ }
+
/**
* Sets click event handlers to each major category button.
* It is necessary that the inflation has been done before this method invocation.
*/
@SuppressWarnings("deprecation")
- private void initializeMajorCategoryButtons() {
+ private void updateMajorCategoryButtonsSkin() {
+ Resources resources = getResources();
for (SymbolMajorCategory majorCategory : SymbolMajorCategory.values()) {
- ImageView view = ImageView.class.cast(findViewById(majorCategory.buttonResourceId));
- if (view == null) {
- throw new IllegalStateException(
- "The view corresponding to " + majorCategory.name() + " is not found.");
- }
+ MozcImageButton view = getMajorCategoryButton(majorCategory);
+ Preconditions.checkState(
+ view != null, "The view corresponding to " + majorCategory.name() + " is not found.");
view.setOnClickListener(new MajorCategoryButtonClickListener(majorCategory));
- setMozcDrawable(view, majorCategory.buttonImageResourceId);
-
switch (majorCategory) {
- case SYMBOL:
+ case NUMBER:
view.setBackgroundDrawable(
majorCategoryButtonDrawableFactory.createLeftButtonDrawable());
break;
@@ -725,16 +773,16 @@
majorCategoryButtonDrawableFactory.createCenterButtonDrawable());
break;
}
+ view.setImageDrawable(skin.getDrawable(resources, majorCategory.buttonImageResourceId));
+ // Update the padding since setBackgroundDrawable() overwrites it.
+ view.setMaxImageHeight(
+ resources.getDimensionPixelSize(majorCategory.maxImageHeightResourceId));
}
}
private void initializeMinorCategoryTab() {
- TabHost tabhost = TabHost.class.cast(findViewById(android.R.id.tabhost));
+ TabHost tabhost = getTabHost();
tabhost.setup();
-
- float textSize = getResources().getDimension(R.dimen.symbol_view_minor_category_text_size);
- int textColor = getResources().getColor(android.R.color.black);
-
// Create NUM_TABS (= 6) tabs.
// Note that we may want to change the number of tabs, however due to the limitation of
// the current TabHost implementation, it is difficult. Fortunately, all major categories
@@ -742,12 +790,9 @@
for (int i = 0; i < NUM_TABS; ++i) {
// The tab's id is the index of the tab.
TabSpec tab = tabhost.newTabSpec(String.valueOf(i));
- TextView textView = new TabTextView(getContext());
- textView.setTypeface(Typeface.DEFAULT_BOLD);
- textView.setTextColor(textColor);
- textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize);
- textView.setGravity(Gravity.CENTER);
- tab.setIndicator(textView);
+ MozcImageView view = new MozcImageView(getContext());
+ view.setSoundEffectsEnabled(false);
+ tab.setIndicator(view);
// Set dummy view for the content. The actual content will be managed by ViewPager.
tab.setContent(R.id.symbol_input_dummy);
tabhost.addTab(tab);
@@ -759,79 +804,84 @@
}
@SuppressWarnings("deprecation")
- private void resetTabBackground() {
+ private void updateTabBackgroundSkin() {
if (!isInflated()) {
return;
}
-
- float density = getResources().getDisplayMetrics().density;
-
- TabWidget tabWidget = TabWidget.class.cast(findViewById(android.R.id.tabs));
+ getTabHost().setBackgroundDrawable(
+ skin.windowBackgroundDrawable.getConstantState().newDrawable());
+ TabWidget tabWidget = getTabWidget();
for (int i = 0; i < tabWidget.getTabCount(); ++i) {
View view = tabWidget.getChildTabViewAt(i);
- view.setBackgroundDrawable(createTabBackgroundDrawable(skinType, density));
+ view.setBackgroundDrawable(createTabBackgroundDrawable(skin));
}
}
- private static Drawable createTabBackgroundDrawable(SkinType skinType, float density) {
+ private static Drawable createTabBackgroundDrawable(Skin skin) {
+ Preconditions.checkNotNull(skin);
return new LayerDrawable(new Drawable[] {
BackgroundDrawableFactory.createSelectableDrawable(
new TabSelectedBackgroundDrawable(
- (int) (SYMBOL_VIEW_MINOR_CATEGORY_TAB_SELECTED_HEIGHT * density),
- skinType.symbolMinorCategoryTabSelectedColor),
- null),
- BackgroundDrawableFactory.createPressableDrawable(
- new ColorDrawable(skinType.symbolMinorCategoryTabPressedColor), null),
+ Math.round(skin.symbolMinorIndicatorHeightDimension),
+ skin.symbolMinorCategoryTabSelectedColor),
+ Optional.<Drawable>absent()),
+ createMinorButtonBackgroundDrawable(skin)
});
}
- private void resetTabText() {
+ private void resetTabImageForMinorCategory() {
if (!isInflated()) {
return;
}
-
- TabWidget tabWidget = TabWidget.class.cast(findViewById(android.R.id.tabs));
+ TabWidget tabWidget = getTabWidget();
List<SymbolMinorCategory> minorCategoryList = currentMajorCategory.minorCategories;
- for (int i = 0; i < tabWidget.getChildCount(); ++i) {
- TextView textView = TextView.class.cast(tabWidget.getChildTabViewAt(i));
- textView.setText(minorCategoryList.get(i).textResourceId);
+ int definedTabSize = Math.min(minorCategoryList.size(), tabWidget.getChildCount());
+ for (int i = 0; i < definedTabSize; ++i) {
+ MozcImageView view = MozcImageView.class.cast(tabWidget.getChildTabViewAt(i));
+ SymbolMinorCategory symbolMinorCategory = minorCategoryList.get(i);
+ view.setRawId(symbolMinorCategory.drawableResourceId);
+ if (symbolMinorCategory.maxImageHeightResourceId != SymbolMinorCategory.INVALID_RESOURCE_ID) {
+ view.setMaxImageHeight(
+ getResources().getDimensionPixelSize(symbolMinorCategory.maxImageHeightResourceId));
+ }
+ if (symbolMinorCategory.contentDescriptionResourceId
+ != SymbolMinorCategory.INVALID_RESOURCE_ID) {
+ view.setContentDescription(
+ getResources().getString(symbolMinorCategory.contentDescriptionResourceId));
+ }
}
}
- private static Drawable createButtonBackgroundDrawable(SkinType skinType, float density) {
+ private static Drawable createMajorButtonBackgroundDrawable(Skin skin) {
+ int padding = Math.round(skin.symbolMajorButtonPaddingDimension);
+ int round = Math.round(skin.symbolMajorButtonRoundDimension);
return BackgroundDrawableFactory.createPressableDrawable(
new RoundRectKeyDrawable(
- (int) (BUTTON_LEFT_OFFSET * density),
- (int) (BUTTON_TOP_OFFSET * density),
- (int) (BUTTON_RIGHT_OFFSET * density),
- (int) (BUTTON_BOTTOM_OFFSET * density),
- (int) (BUTTON_CORNOR_RADIUS * density),
- skinType.symbolPressedFunctionKeyTopColor,
- skinType.symbolPressedFunctionKeyBottomColor,
- skinType.symbolPressedFunctionKeyHighlightColor,
- skinType.symbolPressedFunctionKeyShadowColor),
- new RoundRectKeyDrawable(
- (int) (BUTTON_LEFT_OFFSET * density),
- (int) (BUTTON_TOP_OFFSET * density),
- (int) (BUTTON_RIGHT_OFFSET * density),
- (int) (BUTTON_BOTTOM_OFFSET * density),
- (int) (BUTTON_CORNOR_RADIUS * density),
- skinType.symbolReleasedFunctionKeyTopColor,
- skinType.symbolReleasedFunctionKeyBottomColor,
- skinType.symbolReleasedFunctionKeyHighlightColor,
- skinType.symbolReleasedFunctionKeyShadowColor));
+ padding, padding, padding, padding, round,
+ skin.symbolPressedFunctionKeyTopColor,
+ skin.symbolPressedFunctionKeyBottomColor,
+ skin.symbolPressedFunctionKeyHighlightColor,
+ skin.symbolPressedFunctionKeyShadowColor),
+ Optional.<Drawable>of(new RoundRectKeyDrawable(
+ padding, padding, padding, padding, round,
+ skin.symbolReleasedFunctionKeyTopColor,
+ skin.symbolReleasedFunctionKeyBottomColor,
+ skin.symbolReleasedFunctionKeyHighlightColor,
+ skin.symbolReleasedFunctionKeyShadowColor)));
+ }
+
+ private static Drawable createMinorButtonBackgroundDrawable(Skin skin) {
+ return BackgroundDrawableFactory.createPressableDrawable(
+ new ColorDrawable(skin.symbolMinorCategoryTabPressedColor),
+ Optional.<Drawable>absent());
}
@SuppressWarnings("deprecation")
private void initializeCloseButton() {
ImageView closeButton = ImageView.class.cast(findViewById(R.id.symbol_view_close_button));
- if (closeButtonClickListener != null) {
- closeButton.setOnClickListener(closeButtonClickListener);
+ if (closeButtonClickListener.isPresent()) {
+ closeButton.setOnClickListener(closeButtonClickListener.get());
}
- closeButton.setBackgroundDrawable(
- createButtonBackgroundDrawable(skinType, getResources().getDisplayMetrics().density));
- setMozcDrawable(closeButton, R.raw.symbol__function__close);
- closeButton.setPadding(2, 2, 2, 2);
}
/**
@@ -840,37 +890,77 @@
*/
@SuppressWarnings("deprecation")
private void initializeDeleteButton() {
- ImageView deleteButton = ImageView.class.cast(findViewById(R.id.symbol_view_delete_button));
+ MozcImageView deleteButton =
+ MozcImageView.class.cast(findViewById(R.id.symbol_view_delete_button));
deleteButton.setOnTouchListener(deleteKeyEventButtonTouchListener);
- deleteButton.setBackgroundDrawable(
- createButtonBackgroundDrawable(skinType, getResources().getDisplayMetrics().density));
- setMozcDrawable(deleteButton, R.raw.symbol__function__delete);
- deleteButton.setPadding(0, 0, 0, 0);
}
- TabHost getTabHost() {
+ /** c.f., {@code initializeDeleteButton}. */
+ @SuppressWarnings("deprecation")
+ private void initializeEnterButton() {
+ ImageView enterButton = ImageView.class.cast(findViewById(R.id.symbol_view_enter_button));
+ enterButton.setOnTouchListener(enterKeyEventButtonTouchListener);
+ }
+
+ private void initializeMicrophoneButton() {
+ MozcImageView microphoneButton = getMicrophoneButton();
+ if (microphoneButtonClickListener.isPresent()) {
+ microphoneButton.setOnClickListener(microphoneButtonClickListener.get());
+ }
+ microphoneButton.setVisibility(isMicrophoneButtonEnabled ? VISIBLE : GONE);
+ }
+
+ @SuppressWarnings("deprecation")
+ private void updateSeparatorsSkin() {
+ Resources resources = getResources();
+ int minorPaddingSize = (int) resources.getFraction(
+ R.fraction.symbol_separator_padding_fraction,
+ resources.getDimensionPixelSize(R.dimen.button_frame_height), 0);
+ findViewById(R.id.symbol_view_backspace_separator).setBackgroundDrawable(
+ new InsetDrawable(new ColorDrawable(skin.symbolSeparatorColor),
+ 0, minorPaddingSize, 0, minorPaddingSize));
+ int majorPaddingSize = (int) resources.getFraction(
+ R.fraction.symbol_separator_padding_fraction,
+ resources.getDimensionPixelSize(R.dimen.symbol_view_major_category_height), 0);
+ InsetDrawable separator = new InsetDrawable(
+ new ColorDrawable(skin.symbolSeparatorColor), 0, majorPaddingSize, 0, majorPaddingSize);
+ for (int id : new int[] {R.id.symbol_view_close_button_separator,
+ R.id.symbol_view_enter_button_separator}) {
+ findViewById(id).setBackgroundDrawable(separator.getConstantState().newDrawable());
+ }
+
+ for (int id : new int[] {R.id.symbol_separator_1,
+ R.id.symbol_separator_3}) {
+ findViewById(id).setBackgroundDrawable(
+ skin.keyboardFrameSeparatorBackgroundDrawable.getConstantState().newDrawable());
+ }
+ findViewById(R.id.symbol_separator_2).setBackgroundDrawable(
+ skin.symbolSeparatorAboveMajorCategoryBackgroundDrawable
+ .getConstantState().newDrawable());
+ }
+
+ @VisibleForTesting TabHost getTabHost() {
return TabHost.class.cast(findViewById(android.R.id.tabhost));
}
- ViewPager getCandidateViewPager() {
+ private ViewPager getCandidateViewPager() {
return ViewPager.class.cast(findViewById(R.id.symbol_input_candidate_view_pager));
}
- ImageButton getMajorCategoryButton(SymbolMajorCategory majorCategory) {
- if (majorCategory == null) {
- throw new NullPointerException("majorCategory shouldn't be null.");
- }
- return ImageButton.class.cast(findViewById(majorCategory.buttonResourceId));
+ @VisibleForTesting MozcImageButton getMajorCategoryButton(SymbolMajorCategory majorCategory) {
+ Preconditions.checkNotNull(majorCategory);
+ return MozcImageButton.class.cast(findViewById(majorCategory.buttonResourceId));
}
- View getEmojiDisabledMessageView() {
+ @VisibleForTesting View getEmojiDisabledMessageView() {
return findViewById(R.id.symbol_emoji_disabled_message_view);
}
public void setEmojiEnabled(boolean unicodeEmojiEnabled, boolean carrierEmojiEnabled) {
this.emojiEnabled = unicodeEmojiEnabled || carrierEmojiEnabled;
enableEmoji(this.emojiEnabled);
- symbolCandidateStorage.setEmojiEnabled(unicodeEmojiEnabled, carrierEmojiEnabled);
+ Preconditions.checkState(symbolCandidateStorage.isPresent());
+ symbolCandidateStorage.get().setEmojiEnabled(unicodeEmojiEnabled, carrierEmojiEnabled);
}
public void setPasswordField(boolean isPasswordField) {
@@ -883,36 +973,47 @@
return;
}
- ImageButton imageButton = getMajorCategoryButton(SymbolMajorCategory.EMOJI);
+ MozcImageButton imageButton = getMajorCategoryButton(SymbolMajorCategory.EMOJI);
imageButton.setBackgroundDrawable(
majorCategoryButtonDrawableFactory.createRightButtonDrawable(enableEmoji));
+ // Update the padding since setBackgroundDrawable() overwrites it.
+ imageButton.setMaxImageHeight(getResources().getDimensionPixelSize(
+ SymbolMajorCategory.EMOJI.maxImageHeightResourceId));
}
- /**
- * Resets the status.
- */
- void reset() {
- // the current minor category is also updated in setMajorCategory.
- setMajorCategory(SymbolMajorCategory.SYMBOL);
+ void resetToMajorCategory(Optional<SymbolMajorCategory> category) {
+ Preconditions.checkNotNull(category);
+ setMajorCategory(category.or(currentMajorCategory));
deleteKeyEventButtonTouchListener.reset();
+ enterKeyEventButtonTouchListener.reset();
+ }
+
+ @VisibleForTesting void reset() {
+ // the current minor category is also updated in setMajorCategory.
+ resetToMajorCategory(Optional.of(SymbolMajorCategory.NUMBER));
}
@Override
public void setVisibility(int visibility) {
int previousVisibility = getVisibility();
super.setVisibility(visibility);
- if (viewEventListener != null
- && previousVisibility == View.VISIBLE && visibility != View.VISIBLE) {
- viewEventListener.onCloseSymbolInputView();
+ if (viewEventListener.isPresent()) {
+ if (previousVisibility == View.VISIBLE && visibility != View.VISIBLE) {
+ viewEventListener.get().onCloseSymbolInputView();
+ } else if (previousVisibility != View.VISIBLE && visibility == View.VISIBLE) {
+ viewEventListener.get().onShowSymbolInputView(Collections.<TouchEvent>emptyList());
+ }
}
}
void setSymbolCandidateStorage(SymbolCandidateStorage symbolCandidateStorage) {
- this.symbolCandidateStorage = symbolCandidateStorage;
+ this.symbolCandidateStorage = Optional.of(symbolCandidateStorage);
}
void setKeyEventHandler(KeyEventHandler keyEventHandler) {
+ this.keyEventHandler = Optional.of(keyEventHandler);
deleteKeyEventButtonTouchListener.setKeyEventHandler(keyEventHandler);
+ enterKeyEventButtonTouchListener.setKeyEventHandler(keyEventHandler);
}
void setCandidateTextDimension(float candidateTextSize, float descriptionTextSize) {
@@ -923,12 +1024,19 @@
this.desciptionTextSize = descriptionTextSize;
}
+ void setPopupEnabled(boolean popupEnabled) {
+ this.popupEnabled = popupEnabled;
+ if (!isInflated()) {
+ return;
+ }
+ getNumberKeyboardView().setPopupEnabled(popupEnabled);
+ }
+
/**
* Initializes EmojiProvider selection dialog, if necessary.
- * Exposed as protected for testing purpose.
*/
- protected void maybeInitializeEmojiProviderDialog(Context context) {
- if (emojiProviderDialog != null) {
+ @VisibleForTesting void maybeInitializeEmojiProviderDialog(Context context) {
+ if (emojiProviderDialog.isPresent()) {
return;
}
@@ -938,7 +1046,7 @@
.setTitle(R.string.pref_emoji_provider_type_title)
.setItems(R.array.pref_emoji_provider_type_entries, listener)
.create();
- this.emojiProviderDialog = dialog;
+ this.emojiProviderDialog = Optional.of(dialog);
} catch (InflateException e) {
// Ignore the exception.
}
@@ -950,32 +1058,66 @@
* The view is updated.
* The active minor category is also updated.
*
+ * This method submit a preedit text except for a {@link SymbolMajorCategory#NUMBER} major
+ * category since this class commit a candidate directly.
+ *
* @param newCategory the major category to show.
*/
- protected void setMajorCategory(SymbolMajorCategory newCategory) {
- if (newCategory == null) {
- throw new NullPointerException("newCategory must be non-null.");
+ @VisibleForTesting void setMajorCategory(SymbolMajorCategory newCategory) {
+ Preconditions.checkNotNull(newCategory);
+
+ {
+ SymbolCandidateView symbolCandidateView =
+ SymbolCandidateView.class.cast(findViewById(R.id.symbol_input_candidate_view));
+ if (symbolCandidateView != null) {
+ symbolCandidateView.reset();
+ }
}
+
+ if (newCategory != SymbolMajorCategory.NUMBER && viewEventListener.isPresent()) {
+ viewEventListener.get().onSubmitPreedit();
+ }
+
+ if (newCategory == SymbolMajorCategory.NUMBER) {
+ CandidateView candidateView =
+ CandidateView.class.cast(findViewById(R.id.candidate_view_in_symbol_view));
+ candidateView.clearAnimation();
+ candidateView.setVisibility(View.GONE);
+ candidateView.reset();
+ }
+
currentMajorCategory = newCategory;
- // Reset the minor category to the default value.
- resetTabText();
- resetCandidateViewPager();
- SymbolMinorCategory minorCategory = currentMajorCategory.getDefaultMinorCategory();
- if (symbolCandidateStorage.getCandidateList(minorCategory).getCandidatesCount() == 0) {
- minorCategory = currentMajorCategory.getMinorCategoryByRelativeIndex(minorCategory, 1);
+ if (currentMajorCategory == SymbolMajorCategory.NUMBER) {
+ findViewById(android.R.id.tabhost).setVisibility(View.GONE);
+ findViewById(R.id.number_frame).setVisibility(View.VISIBLE);
+ setNumberKeyboard();
+ } else {
+ findViewById(android.R.id.tabhost).setVisibility(View.VISIBLE);
+ findViewById(R.id.number_frame).setVisibility(View.GONE);
+ updateMinorCategory();
}
- int index = newCategory.minorCategories.indexOf(minorCategory);
- getCandidateViewPager().setCurrentItem(index);
- getTabHost().setCurrentTab(index);
+
+ // Hide overlapping separator
+ if (currentMajorCategory == SymbolMajorCategory.NUMBER) {
+ findViewById(R.id.symbol_view_close_button_separator).setVisibility(View.INVISIBLE);
+ } else {
+ findViewById(R.id.symbol_view_close_button_separator).setVisibility(View.VISIBLE);
+ }
+
+ if (currentMajorCategory == SymbolMajorCategory.EMOJI) {
+ findViewById(R.id.symbol_view_enter_button_separator).setVisibility(View.INVISIBLE);
+ } else {
+ findViewById(R.id.symbol_view_enter_button_separator).setVisibility(View.VISIBLE);
+ }
// Update visibility relating attributes.
for (SymbolMajorCategory majorCategory : SymbolMajorCategory.values()) {
// Update major category selector button's look and feel.
- ImageButton button = getMajorCategoryButton(majorCategory);
+ MozcImageButton button = getMajorCategoryButton(majorCategory);
if (button != null) {
- button.setSelected(majorCategory == newCategory);
- button.setEnabled(majorCategory != newCategory);
+ button.setSelected(majorCategory == currentMajorCategory);
+ button.setEnabled(majorCategory != currentMajorCategory);
}
}
@@ -983,15 +1125,62 @@
if (emojiDisabledMessageView != null) {
// Show messages about emoji-disabling, if necessary.
emojiDisabledMessageView.setVisibility(
- newCategory == SymbolMajorCategory.EMOJI && !emojiEnabled ? View.VISIBLE : View.GONE);
+ currentMajorCategory == SymbolMajorCategory.EMOJI
+ && !emojiEnabled ? View.VISIBLE : View.GONE);
}
}
+ private void setNumberKeyboard() {
+ final KeyboardSpecification spec = KeyboardSpecification.SYMBOL_NUMBER;
+ final KeyboardFactory factory = new KeyboardFactory();
+
+ getNumberKeyboardView().addOnLayoutChangeListener(new OnLayoutChangeListener() {
+ @Override
+ public void onLayoutChange(
+ View view, int left, int top, int right, int bottom,
+ int oldLeft, int oldTop, int oldRight, int oldBottom) {
+ if (right - left == 0 || bottom - top == 0) {
+ return;
+ }
+ KeyboardView keyboardView = KeyboardView.class.cast(view);
+ Keyboard keyboard = factory.get(getResources(), spec, right - left, bottom - top);
+ keyboardView.setKeyboard(keyboard);
+ keyboardView.invalidate();
+ }
+ });
+ }
+
+ private void updateMinorCategory() {
+ // Reset the minor category to the default value.
+ resetTabImageForMinorCategory();
+ resetCandidateViewPager();
+ SymbolMinorCategory minorCategory = currentMajorCategory.getDefaultMinorCategory();
+ Preconditions.checkState(symbolCandidateStorage.isPresent());
+ if (symbolCandidateStorage.get().getCandidateList(minorCategory).getCandidatesCount() == 0) {
+ minorCategory = currentMajorCategory.getMinorCategoryByRelativeIndex(minorCategory, 1);
+ }
+ int index = currentMajorCategory.minorCategories.indexOf(minorCategory);
+ getCandidateViewPager().setCurrentItem(index);
+
+ // Disable feedback before setting the current tab programatically.
+ // Background: TabHost.setCurrentTab calls back onTabChanged, in which feedback event is fired.
+ // However, we don't have ways to distinguish if onTabChanged is called through user click
+ // event or by the call of setCurrentTab. If we don't disable feedback here, the click sound
+ // effect is fired twice; one is from the onClick event on major category tab and the other is
+ // by the call of setCurrentTab here. See b/17119766.
+ SymbolTabWidgetViewPagerAdapter adapter =
+ SymbolTabWidgetViewPagerAdapter.class.cast(getCandidateViewPager().getAdapter());
+ adapter.setFeedbackEnabled(false);
+ getTabHost().setCurrentTab(index);
+ adapter.setFeedbackEnabled(true);
+ }
+
void setEmojiProviderType(EmojiProviderType emojiProviderType) {
Preconditions.checkNotNull(emojiProviderType);
+ Preconditions.checkState(symbolCandidateStorage.isPresent());
this.emojiProviderType = emojiProviderType;
- this.symbolCandidateStorage.setEmojiProviderType(emojiProviderType);
+ this.symbolCandidateStorage.get().setEmojiProviderType(emojiProviderType);
if (!isInflated()) {
return;
}
@@ -999,29 +1188,99 @@
resetCandidateViewPager();
}
- void setViewEventListener(ViewEventListener listener, OnClickListener closeButtonClickListener) {
- if (listener == null) {
- throw new NullPointerException("lister must be non-null.");
- }
- viewEventListener = listener;
- this.closeButtonClickListener = closeButtonClickListener;
+ void setEventListener(
+ ViewEventListener viewEventListener, OnClickListener closeButtonClickListener,
+ OnClickListener microphoneButtonClickListener) {
+ this.viewEventListener = Optional.of(viewEventListener);
+ this.closeButtonClickListener = Optional.of(closeButtonClickListener);
+ this.microphoneButtonClickListener = Optional.of(microphoneButtonClickListener);
}
- void setSkinType(SkinType skinType) {
- if (this.skinType == skinType) {
+ void setMicrophoneButtonEnabled(boolean enabled) {
+ isMicrophoneButtonEnabled = enabled;
+ if (isInflated()) {
+ getMicrophoneButton().setVisibility(enabled ? VISIBLE : GONE);
+ }
+ }
+
+ void setSkin(Skin skin) {
+ Preconditions.checkNotNull(skin);
+ if (this.skin.equals(skin)) {
return;
}
-
- this.skinType = skinType;
- mozcDrawableFactory.setSkinType(skinType);
+ this.skin = skin;
+ majorCategoryButtonDrawableFactory.setSkin(skin);
if (!isInflated()) {
return;
}
+ updateSkinAwareDrawable();
+ }
- // Reset the minor category tab, candidate view and major category buttons.
- resetTabBackground();
- resetCandidateViewPager();
- resetMajorCategoryBackground();
+ @SuppressWarnings("deprecation")
+ private void updateSkinAwareDrawable() {
+ updateTabBackgroundSkin();
+ resetTabImageForMinorCategory();
+
+ SymbolTabWidgetViewPagerAdapter adapter =
+ SymbolTabWidgetViewPagerAdapter.class.cast(getCandidateViewPager().getAdapter());
+ if (adapter != null) {
+ adapter.setSkin(skin);
+ }
+ updateMajorCategoryBackgroundSkin();
+ updateMajorCategoryButtonsSkin();
+ updateMinorCategoryBackgroundSkin();
+ updateNumberKeyboardSkin();
+ updateSeparatorsSkin();
+ getMicrophoneButton().setSkin(skin);
+
+ TabWidget tabWidget = TabWidget.class.cast(findViewById(android.R.id.tabs));
+ for (int i = 0; i < tabWidget.getChildCount(); ++i) {
+ MozcImageView.class.cast(tabWidget.getChildTabViewAt(i)).setSkin(skin);
+ }
+
+ // Note delete button shouldn't be applied createMajorButtonBackgroundDrawable as background
+ // as it should show different background (same as minor categories).
+ for (int id : new int[] {R.id.symbol_view_close_button,
+ R.id.symbol_view_enter_button}) {
+ MozcImageView view = MozcImageView.class.cast(findViewById(id));
+ view.setSkin(skin);
+ view.setBackgroundDrawable(createMajorButtonBackgroundDrawable(skin));
+ }
+ MozcImageView deleteKeyView =
+ MozcImageView.class.cast(findViewById(R.id.symbol_view_delete_button));
+ deleteKeyView.setSkin(skin);
+ deleteKeyView.setBackgroundDrawable(createMinorButtonBackgroundDrawable(skin));
+ }
+
+ private KeyboardView getNumberKeyboardView() {
+ return KeyboardView.class.cast(findViewById(R.id.number_keyboard));
+ }
+
+ private LinearLayout getMajorCategoryFrame() {
+ return LinearLayout.class.cast(findViewById(R.id.symbol_major_category));
+ }
+
+ private LinearLayout getMinorCategoryFrame() {
+ return LinearLayout.class.cast(findViewById(R.id.symbol_minor_category));
+ }
+
+ private TabWidget getTabWidget() {
+ return TabWidget.class.cast(findViewById(android.R.id.tabs));
+ }
+
+ private MozcImageView getMicrophoneButton() {
+ return MozcImageView.class.cast(findViewById(R.id.microphone_button));
+ }
+
+ @Override
+ protected void onSizeChanged(int w, int h, int oldw, int oldh) {
+ super.onSizeChanged(w, h, oldw, oldh);
+ // The boundary of Drawable instance which has been set as background
+ // is not updated automatically.
+ // Update the boundary below.
+ if (isInflated()) {
+ updateSkinAwareDrawable();
+ }
}
@Override
diff --git a/src/android/src/com/google/android/inputmethod/japanese/ViewEventDelegator.java b/src/android/src/com/google/android/inputmethod/japanese/ViewEventDelegator.java
index c98b2f0..36cfcd1 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/ViewEventDelegator.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/ViewEventDelegator.java
@@ -30,9 +30,9 @@
package org.mozc.android.inputmethod.japanese;
import org.mozc.android.inputmethod.japanese.FeedbackManager.FeedbackEvent;
-import org.mozc.android.inputmethod.japanese.JapaneseKeyboard.KeyboardSpecification;
import org.mozc.android.inputmethod.japanese.KeycodeConverter.KeyEventInterface;
import org.mozc.android.inputmethod.japanese.hardwarekeyboard.HardwareKeyboard.CompositionSwitchMode;
+import org.mozc.android.inputmethod.japanese.keyboard.Keyboard.KeyboardSpecification;
import org.mozc.android.inputmethod.japanese.model.SymbolMajorCategory;
import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands;
import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Input.TouchEvent;
@@ -41,6 +41,8 @@
import java.util.List;
+import javax.annotation.Nullable;
+
/**
* This class delegates all method calls to a ViewEventListener, passed to the constructor.
* Typical usage is to hook/override some of listener's methods to change their behavior.
@@ -61,6 +63,7 @@
*/
@SuppressWarnings("javadoc")
public abstract class ViewEventDelegator implements ViewEventListener {
+
private final ViewEventListener delegated;
public ViewEventDelegator(ViewEventListener delegated) {
@@ -68,14 +71,15 @@
}
@Override
- public void onKeyEvent(ProtoCommands.KeyEvent mozcKeyEvent, KeyEventInterface keyEvent,
- KeyboardSpecification keyboardSpecification,
- List<? extends TouchEvent> touchEventList) {
+ public void onKeyEvent(@Nullable ProtoCommands.KeyEvent mozcKeyEvent,
+ @Nullable KeyEventInterface keyEvent,
+ @Nullable KeyboardSpecification keyboardSpecification,
+ List<TouchEvent> touchEventList) {
delegated.onKeyEvent(mozcKeyEvent, keyEvent, keyboardSpecification, touchEventList);
}
@Override
- public void onUndo(List<? extends TouchEvent> touchEventList) {
+ public void onUndo(List<TouchEvent> touchEventList) {
delegated.onUndo(touchEventList);
}
@@ -85,6 +89,16 @@
}
@Override
+ public void onPageUp() {
+ delegated.onPageUp();
+ }
+
+ @Override
+ public void onPageDown() {
+ delegated.onPageDown();
+ }
+
+ @Override
public void onSymbolCandidateSelected(SymbolMajorCategory majorCategory, String candidate,
boolean updateHistory) {
delegated.onSymbolCandidateSelected(majorCategory, candidate, updateHistory);
@@ -106,12 +120,12 @@
}
@Override
- public void onShowMenuDialog(List<? extends TouchEvent> touchEventList) {
+ public void onShowMenuDialog(List<TouchEvent> touchEventList) {
delegated.onShowMenuDialog(touchEventList);
}
@Override
- public void onShowSymbolInputView(List<? extends TouchEvent> touchEventList) {
+ public void onShowSymbolInputView(List<TouchEvent> touchEventList) {
delegated.onShowSymbolInputView(touchEventList);
}
@@ -129,4 +143,15 @@
public void onActionKey() {
delegated.onActionKey();
}
+
+ @Override
+ public void onNarrowModeChanged(boolean newNarrowMode) {
+ delegated.onNarrowModeChanged(newNarrowMode);
+ }
+
+ @Override
+ public void onUpdateKeyboardLayoutAdjustment(
+ ViewManagerInterface.LayoutAdjustment layoutAdjustment) {
+ delegated.onUpdateKeyboardLayoutAdjustment(layoutAdjustment);
+ }
}
diff --git a/src/android/src/com/google/android/inputmethod/japanese/ViewEventListener.java b/src/android/src/com/google/android/inputmethod/japanese/ViewEventListener.java
index e43e4a6..c7cf441 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/ViewEventListener.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/ViewEventListener.java
@@ -30,9 +30,9 @@
package org.mozc.android.inputmethod.japanese;
import org.mozc.android.inputmethod.japanese.FeedbackManager.FeedbackEvent;
-import org.mozc.android.inputmethod.japanese.JapaneseKeyboard.KeyboardSpecification;
import org.mozc.android.inputmethod.japanese.KeycodeConverter.KeyEventInterface;
import org.mozc.android.inputmethod.japanese.hardwarekeyboard.HardwareKeyboard.CompositionSwitchMode;
+import org.mozc.android.inputmethod.japanese.keyboard.Keyboard.KeyboardSpecification;
import org.mozc.android.inputmethod.japanese.model.SymbolMajorCategory;
import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands;
import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Input.TouchEvent;
@@ -40,6 +40,8 @@
import java.util.List;
+import javax.annotation.Nullable;
+
/**
* Callback object for view evnets.
*
@@ -54,16 +56,17 @@
* @param touchEventList {@code TouchEvent} instances related to this key event for logging
* usage stats.
*/
- public void onKeyEvent(ProtoCommands.KeyEvent mozcKeyEvent, KeyEventInterface keyEvent,
- KeyboardSpecification keyboardSpecification,
- List<? extends TouchEvent> touchEventList);
+ public void onKeyEvent(@Nullable ProtoCommands.KeyEvent mozcKeyEvent,
+ @Nullable KeyEventInterface keyEvent,
+ @Nullable KeyboardSpecification keyboardSpecification,
+ List<TouchEvent> touchEventList);
/**
* Called when Undo is fired (by soft keyboard).
* @param touchEventList {@code TouchEvent} instances related to this undo for logging
* usage stats.
*/
- public void onUndo(List<? extends TouchEvent> touchEventList);
+ public void onUndo(List<TouchEvent> touchEventList);
/**
* Called when a conversion candidate is selected.
@@ -73,6 +76,12 @@
*/
public void onConversionCandidateSelected(int candidateId, Optional<Integer> rowIndex);
+ /** Called when page down button is tapped. */
+ public void onPageUp();
+
+ /** Called when page down button is tapped. */
+ public void onPageDown();
+
/**
* Called when a candidate on symbol input view is selected.
*/
@@ -102,7 +111,7 @@
* for logging usage stats.
*/
// TODO(matsuzakit): Rename. onFlushTouchEventStats ?
- public void onShowMenuDialog(List<? extends TouchEvent> touchEventList);
+ public void onShowMenuDialog(List<TouchEvent> touchEventList);
/**
* Called when the symbol input view is shown.
@@ -110,7 +119,7 @@
* @param touchEventList {@code TouchEvent} instances which is related to this event
* for logging usage stats.
*/
- public void onShowSymbolInputView(List<? extends TouchEvent> touchEventList);
+ public void onShowSymbolInputView(List<TouchEvent> touchEventList);
/**
* Called when the symbol input view is closed.
@@ -127,4 +136,15 @@
* Called when the key for editor action is pressed.
*/
public void onActionKey();
+
+ /** Called when the narrow mode of the view is changed. */
+ public void onNarrowModeChanged(boolean newNarrowMode);
+
+ /**
+ * Called when the keyboard layout preference should be updated.
+ * <p>
+ * The visible keyboard will also be updated as the result through a callback object.
+ */
+ public void onUpdateKeyboardLayoutAdjustment(
+ ViewManagerInterface.LayoutAdjustment layoutAdjustment);
}
diff --git a/src/android/src/com/google/android/inputmethod/japanese/ViewManager.java b/src/android/src/com/google/android/inputmethod/japanese/ViewManager.java
index ea0f2b8..a3927cc 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/ViewManager.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/ViewManager.java
@@ -30,18 +30,24 @@
package org.mozc.android.inputmethod.japanese;
import org.mozc.android.inputmethod.japanese.FeedbackManager.FeedbackEvent;
-import org.mozc.android.inputmethod.japanese.JapaneseKeyboard.KeyboardSpecification;
import org.mozc.android.inputmethod.japanese.KeycodeConverter.KeyEventInterface;
import org.mozc.android.inputmethod.japanese.emoji.EmojiProviderType;
import org.mozc.android.inputmethod.japanese.emoji.EmojiUtil;
+import org.mozc.android.inputmethod.japanese.hardwarekeyboard.HardwareKeyboard;
+import org.mozc.android.inputmethod.japanese.hardwarekeyboard.HardwareKeyboard.CompositionSwitchMode;
import org.mozc.android.inputmethod.japanese.keyboard.KeyEntity;
import org.mozc.android.inputmethod.japanese.keyboard.KeyEventHandler;
+import org.mozc.android.inputmethod.japanese.keyboard.Keyboard;
+import org.mozc.android.inputmethod.japanese.keyboard.Keyboard.KeyboardSpecification;
import org.mozc.android.inputmethod.japanese.keyboard.KeyboardActionListener;
+import org.mozc.android.inputmethod.japanese.keyboard.KeyboardFactory;
import org.mozc.android.inputmethod.japanese.keyboard.ProbableKeyEventGuesser;
import org.mozc.android.inputmethod.japanese.model.JapaneseSoftwareKeyboardModel;
import org.mozc.android.inputmethod.japanese.model.JapaneseSoftwareKeyboardModel.KeyboardMode;
import org.mozc.android.inputmethod.japanese.model.SymbolCandidateStorage;
import org.mozc.android.inputmethod.japanese.model.SymbolCandidateStorage.SymbolHistoryStorage;
+import org.mozc.android.inputmethod.japanese.model.SymbolMajorCategory;
+import org.mozc.android.inputmethod.japanese.preference.ClientSidePreference.HardwareKeyMap;
import org.mozc.android.inputmethod.japanese.preference.ClientSidePreference.InputStyle;
import org.mozc.android.inputmethod.japanese.preference.ClientSidePreference.KeyboardLayout;
import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands;
@@ -52,11 +58,12 @@
import org.mozc.android.inputmethod.japanese.ui.MenuDialog;
import org.mozc.android.inputmethod.japanese.ui.MenuDialog.MenuDialogListener;
import org.mozc.android.inputmethod.japanese.util.ImeSwitcherFactory.ImeSwitcher;
-import org.mozc.android.inputmethod.japanese.view.SkinType;
+import org.mozc.android.inputmethod.japanese.view.Skin;
import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Optional;
import com.google.common.base.Preconditions;
+import android.annotation.SuppressLint;
import android.content.Context;
import android.content.res.Configuration;
import android.content.res.Resources;
@@ -65,6 +72,7 @@
import android.os.Build;
import android.os.IBinder;
import android.os.Looper;
+import android.view.InputDevice;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.MotionEvent;
@@ -72,6 +80,7 @@
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.Window;
+import android.view.inputmethod.CursorAnchorInfo;
import android.view.inputmethod.EditorInfo;
import java.util.Collections;
@@ -89,6 +98,7 @@
* An small wrapper to inject keyboard view resizing when a user selects a candidate.
*/
class ViewManagerEventListener extends ViewEventDelegator {
+
ViewManagerEventListener(ViewEventListener delegated) {
super(delegated);
}
@@ -105,37 +115,32 @@
/**
* Converts S/W Keyboard's keycode to KeyEvent instance.
- * Exposed as protected for testing purpose.
*/
- protected void onKey(int primaryCode, List<? extends TouchEvent> touchEventList) {
- if (primaryCode == keycodeCapslock ||
- primaryCode == keycodeAlt) {
+ void onKey(int primaryCode, List<TouchEvent> touchEventList) {
+ if (primaryCode == keycodeCapslock || primaryCode == keycodeAlt) {
// Ignore those key events because they are handled by KeyboardView,
// but send touchEventList for logging usage stats.
- if (eventListener != null) {
- eventListener.onKeyEvent(null, null, null, touchEventList);
- }
+ eventListener.onKeyEvent(null, null, null, touchEventList);
return;
}
// Keyboard switch event.
- if (primaryCode == keycodeChartypeToKana ||
- primaryCode == keycodeChartypeTo123 ||
- primaryCode == keycodeChartypeToAbc ||
- primaryCode == keycodeChartypeToKana123 ||
- primaryCode == keycodeChartypeToAbc123) {
+ if (primaryCode == keycodeChartypeToKana
+ || primaryCode == keycodeChartypeToAbc
+ || primaryCode == keycodeChartypeToAbc123) {
if (primaryCode == keycodeChartypeToKana) {
japaneseSoftwareKeyboardModel.setKeyboardMode(KeyboardMode.KANA);
} else if (primaryCode == keycodeChartypeToAbc) {
japaneseSoftwareKeyboardModel.setKeyboardMode(KeyboardMode.ALPHABET);
- } else if (primaryCode == keycodeChartypeTo123 ||
- primaryCode == keycodeChartypeToKana123) {
- japaneseSoftwareKeyboardModel.setKeyboardMode(KeyboardMode.KANA_NUMBER);
} else if (primaryCode == keycodeChartypeToAbc123) {
japaneseSoftwareKeyboardModel.setKeyboardMode(KeyboardMode.ALPHABET_NUMBER);
}
- setJapaneseKeyboard(
- japaneseSoftwareKeyboardModel.getKeyboardSpecification(), touchEventList);
+ propagateSoftwareKeyboardChange(touchEventList);
+ return;
+ }
+
+ if (primaryCode == keycodeGlobe) {
+ imeSwitcher.switchToNextInputMethod(false);
return;
}
@@ -144,9 +149,7 @@
if (mozcView != null) {
mozcView.resetKeyboardViewState();
}
- if (eventListener != null) {
- eventListener.onShowMenuDialog(touchEventList);
- }
+ eventListener.onShowMenuDialog(touchEventList);
if (primaryCode == keycodeMenuDialog) {
showMenuDialog();
} else if (primaryCode == keycodeImePickerDialog) {
@@ -156,34 +159,30 @@
}
if (primaryCode == keycodeSymbol) {
- if (eventListener != null) {
- eventListener.onSubmitPreedit();
- }
if (mozcView != null) {
- mozcView.resetKeyboardViewState();
- mozcView.showSymbolInputView();
- if (eventListener != null) {
- eventListener.onShowSymbolInputView(touchEventList);
- }
+ mozcView.showSymbolInputView(Optional.<SymbolMajorCategory>absent());
+ }
+ return;
+ }
+
+ if (primaryCode == keycodeSymbolEmoji) {
+ if (mozcView != null) {
+ mozcView.showSymbolInputView(Optional.of(SymbolMajorCategory.EMOJI));
}
return;
}
if (primaryCode == keycodeUndo) {
- if (eventListener != null) {
- eventListener.onUndo(touchEventList);
- }
+ eventListener.onUndo(touchEventList);
return;
}
- ProtoCommands.KeyEvent mozcKeyEvent =
+ Optional<ProtoCommands.KeyEvent> mozcKeyEvent =
primaryKeyCodeConverter.createMozcKeyEvent(primaryCode, touchEventList);
- if (eventListener != null) {
- eventListener.onKeyEvent(mozcKeyEvent,
- primaryKeyCodeConverter.getPrimaryCodeKeyEvent(primaryCode),
- japaneseSoftwareKeyboardModel.getKeyboardSpecification(),
- touchEventList);
- }
+ eventListener.onKeyEvent(mozcKeyEvent.orNull(),
+ primaryKeyCodeConverter.getPrimaryCodeKeyEvent(primaryCode),
+ getActiveSoftwareKeyboardModel().getKeyboardSpecification(),
+ touchEventList);
}
/**
@@ -196,13 +195,13 @@
}
@Override
- public void onKey(int primaryCode, List<? extends TouchEvent> touchEventList) {
+ public void onKey(int primaryCode, List<TouchEvent> touchEventList) {
ViewManager.this.onKey(primaryCode, touchEventList);
}
@Override
public void onPress(int primaryCode) {
- if (eventListener != null && primaryCode != KeyEntity.INVALID_KEY_CODE) {
+ if (primaryCode != KeyEntity.INVALID_KEY_CODE) {
eventListener.onFireFeedbackEvent(FeedbackEvent.KEY_DOWN);
}
}
@@ -212,6 +211,92 @@
}
}
+ @VisibleForTesting class ViewLayerEventHandler {
+ private static final int NEXUS_KEYBOARD_VENDOR_ID = 0x0D62;
+ private static final int NEXUS_KEYBOARD_PRODUCT_ID = 0x160B;
+ private boolean isEmojiKeyDownAvailable = false;
+ private boolean isEmojiInvoking = false;
+ private int pressedKeyNum = 0;
+ @VisibleForTesting boolean disableDeviceCheck = false;
+
+ @SuppressLint("NewApi")
+ private boolean hasPhysicalEmojiKey(KeyEvent event) {
+ InputDevice device = InputDevice.getDevice(event.getDeviceId());
+ return disableDeviceCheck
+ || (Build.VERSION.SDK_INT >= 19
+ && device != null
+ && device.getVendorId() == NEXUS_KEYBOARD_VENDOR_ID
+ && device.getProductId() == NEXUS_KEYBOARD_PRODUCT_ID);
+ }
+
+ private boolean isEmojiKey(KeyEvent event) {
+ if (!hasPhysicalEmojiKey(event)) {
+ return false;
+ }
+ if (event.getKeyCode() != KeyEvent.KEYCODE_ALT_LEFT
+ && event.getKeyCode() != KeyEvent.KEYCODE_ALT_RIGHT) {
+ return false;
+ }
+ if (event.getAction() == KeyEvent.ACTION_UP) {
+ return event.hasNoModifiers();
+ } else {
+ return event.hasModifiers(KeyEvent.META_ALT_ON);
+ }
+ }
+
+ public boolean evaluateKeyEvent(KeyEvent event) {
+ Preconditions.checkNotNull(event);
+ if (event.getAction() == KeyEvent.ACTION_DOWN) {
+ ++pressedKeyNum;
+ } else if (event.getAction() == KeyEvent.ACTION_UP) {
+ pressedKeyNum = Math.max(0, pressedKeyNum - 1);
+ } else {
+ return false;
+ }
+
+ if (isEmojiKey(event)) {
+ if (event.getAction() == KeyEvent.ACTION_DOWN) {
+ isEmojiKeyDownAvailable = true;
+ isEmojiInvoking = false;
+ } else if (isEmojiKeyDownAvailable && pressedKeyNum == 0) {
+ isEmojiKeyDownAvailable = false;
+ isEmojiInvoking = true;
+ }
+ } else {
+ isEmojiKeyDownAvailable = false;
+ isEmojiInvoking = false;
+ }
+ return isEmojiInvoking;
+ }
+
+ public void invoke() {
+ if (!isEmojiInvoking) {
+ return;
+ }
+ isEmojiInvoking = false;
+ if (mozcView != null) {
+ if (isSymbolInputViewVisible) {
+ mozcView.hideSymbolInputView();
+ if (!isNarrowMode()) {
+ setNarrowMode(true);
+ }
+ } else {
+ isSymbolInputViewShownByEmojiKey = true;
+ if (isNarrowMode()) {
+ setNarrowMode(false);
+ }
+ mozcView.showSymbolInputView(Optional.of(SymbolMajorCategory.EMOJI));
+ }
+ }
+ }
+
+ public void reset() {
+ isEmojiKeyDownAvailable = false;
+ isEmojiInvoking = false;
+ pressedKeyNum = 0;
+ }
+ }
+
// Registered by the user (typically MozcService)
@VisibleForTesting final ViewEventListener eventListener;
@@ -225,38 +310,83 @@
// IME switcher instance to detect that voice input is available or not.
private final ImeSwitcher imeSwitcher;
- // Called back by keyboards.
+ /** Key event handler to handle events on Mozc server. */
private final KeyEventHandler keyEventHandler;
- // Model to represent the current software keyboard state.
- @VisibleForTesting final JapaneseSoftwareKeyboardModel japaneseSoftwareKeyboardModel =
+ /** Key event handler to handle events on view layer. */
+ @VisibleForTesting final ViewLayerEventHandler viewLayerKeyEventHandler =
+ new ViewLayerEventHandler();
+
+ /**
+ * Model to represent the current software keyboard state.
+ * All the setter methods don't affect symbolNumberSoftwareKeyboardModel but
+ * japaneseSoftwareKeyboardModel.
+ */
+ private final JapaneseSoftwareKeyboardModel japaneseSoftwareKeyboardModel =
+ new JapaneseSoftwareKeyboardModel();
+ /**
+ * Model to represent the number software keyboard state.
+ * Its keyboard mode is set in the constructor to KeyboardMode.SYMBOL_NUMBER and will never be
+ * changed.
+ */
+ private final JapaneseSoftwareKeyboardModel symbolNumberSoftwareKeyboardModel =
new JapaneseSoftwareKeyboardModel();
- // The factory of parsed keyboard data.
- private final JapaneseKeyboardFactory japaneseKeyboardFactory = new JapaneseKeyboardFactory();
+ @VisibleForTesting final HardwareKeyboard hardwareKeyboard;
+
+ /** True if symbol input view is visible. */
+ private boolean isSymbolInputViewVisible;
+
+ /** True if symbol input view is shown by the Emoji key on physical keyboard. */
+ private boolean isSymbolInputViewShownByEmojiKey;
+
+ /** The factory of parsed keyboard data. */
+ private final KeyboardFactory keyboardFactory = new KeyboardFactory();
private final SymbolCandidateStorage symbolCandidateStorage;
- // Current fullscreen mode
+ /** Current fullscreen mode */
private boolean fullscreenMode = false;
- // Current narrow mode
+ /** Current narrow mode */
private boolean narrowMode = false;
- // Current popup enabled state.
+ /** Current popup enabled state. */
private boolean popupEnabled = true;
- // Current voice input allowed state.
- private boolean voiceInputAllowed = false;
+ /** Current Globe button enabled state. */
+ private boolean globeButtonEnabled = false;
+
+ /** True if CursorAnchorInfo is enabled. */
+ private boolean cursorAnchroInfoEnabled = false;
+
+ /** True if hardware keyboard exists. */
+ private boolean hardwareKeyboardExist = false;
+
+ /**
+ * True if voice input is eligible.
+ * <p>
+ * This conditions is calculated based on following conditions.
+ * <ul>
+ * <li>VoiceIME's status: If VoiceIME is not available, this flag becomes false.
+ * <li>EditorInfo: If current editor does not want to use voice input, this flag becomes false.
+ * <ul>
+ * <li>Voice input might be explicitly forbidden by the editor.
+ * <li>Voice input should be useless for the number input editors.
+ * <li>Voice input should be useless for password field.
+ * <ul>
+ * </ul>
+ */
+ private boolean isVoiceInputEligible = false;
+
+ private boolean isVoiceInputEnabledByPreference = true;
private int flickSensitivity = 0;
- private CompositionMode hardwareCompositionMode = CompositionMode.HIRAGANA;
-
@VisibleForTesting EmojiProviderType emojiProviderType = EmojiProviderType.NONE;
/** Current skin type. */
- private SkinType skinType = SkinType.ORANGE_LIGHTGRAY;
+ private Skin skin = Skin.getFallbackInstance();
private LayoutAdjustment layoutAdjustment = LayoutAdjustment.FILL;
@@ -269,47 +399,51 @@
// but such name like "KEYCODE_LEFT" makes Lint unhappy
// because they are not "static final".
private final int keycodeChartypeToKana;
- private final int keycodeChartypeTo123;
private final int keycodeChartypeToAbc;
- private final int keycodeChartypeToKana123;
private final int keycodeChartypeToAbc123;
+ private final int keycodeGlobe;
private final int keycodeSymbol;
+ private final int keycodeSymbolEmoji;
private final int keycodeUndo;
private final int keycodeCapslock;
private final int keycodeAlt;
private final int keycodeMenuDialog;
private final int keycodeImePickerDialog;
- // Handles software keyboard event and sends it to the service.
+ /** Handles software keyboard event and sends it to the service. */
private final KeyboardActionAdapter keyboardActionListener;
private final PrimaryKeyCodeConverter primaryKeyCodeConverter;
- public ViewManager(Context context, final ViewEventListener listener,
+ public ViewManager(Context context, ViewEventListener listener,
SymbolHistoryStorage symbolHistoryStorage, ImeSwitcher imeSwitcher,
MenuDialogListener menuDialogListener) {
this(context, listener, symbolHistoryStorage, imeSwitcher, menuDialogListener,
- new ProbableKeyEventGuesser(context.getAssets()));
+ new ProbableKeyEventGuesser(context.getAssets()), new HardwareKeyboard());
}
@VisibleForTesting
ViewManager(Context context, ViewEventListener listener,
SymbolHistoryStorage symbolHistoryStorage, ImeSwitcher imeSwitcher,
- @Nullable MenuDialogListener menuDialogListener, ProbableKeyEventGuesser guesser) {
+ @Nullable MenuDialogListener menuDialogListener, ProbableKeyEventGuesser guesser,
+ HardwareKeyboard hardwareKeyboard) {
Preconditions.checkNotNull(context);
Preconditions.checkNotNull(listener);
Preconditions.checkNotNull(imeSwitcher);
+ Preconditions.checkNotNull(hardwareKeyboard);
primaryKeyCodeConverter = new PrimaryKeyCodeConverter(context, guesser);
+ symbolNumberSoftwareKeyboardModel.setKeyboardMode(KeyboardMode.SYMBOL_NUMBER);
+
// Prefetch keycodes from resource
Resources res = context.getResources();
keycodeChartypeToKana = res.getInteger(R.integer.key_chartype_to_kana);
- keycodeChartypeTo123 = res.getInteger(R.integer.key_chartype_to_123);
keycodeChartypeToAbc = res.getInteger(R.integer.key_chartype_to_abc);
- keycodeChartypeToKana123 = res.getInteger(R.integer.key_chartype_to_kana_123);
keycodeChartypeToAbc123 = res.getInteger(R.integer.key_chartype_to_abc_123);
+ keycodeGlobe = res.getInteger(R.integer.key_globe);
keycodeSymbol = res.getInteger(R.integer.key_symbol);
+ keycodeSymbolEmoji = res.getInteger(R.integer.key_symbol_emoji);
keycodeUndo = res.getInteger(R.integer.key_undo);
keycodeCapslock = res.getInteger(R.integer.key_capslock);
keycodeAlt = res.getInteger(R.integer.key_alt);
@@ -330,6 +464,7 @@
this.imeSwitcher = imeSwitcher;
this.menuDialogListener = menuDialogListener;
this.symbolCandidateStorage = new SymbolCandidateStorage(symbolHistoryStorage);
+ this.hardwareKeyboard = hardwareKeyboard;
}
/**
@@ -356,35 +491,46 @@
// until all the updates done in this method are finished. Just in case.
mozcView.setVisibility(View.GONE);
mozcView.setKeyboardHeightRatio(keyboardHeightRatio);
+ mozcView.setCursorAnchorInfoEnabled(cursorAnchroInfoEnabled);
+ OnClickListener widenButtonClickListener = new OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ eventListener.onFireFeedbackEvent(FeedbackEvent.NARROW_FRAME_WIDEN_BUTTON_DOWN);
+ setNarrowMode(!narrowMode);
+ }
+ };
+ OnClickListener leftAdjustButtonClickListener = new OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ eventListener.onUpdateKeyboardLayoutAdjustment(LayoutAdjustment.LEFT);
+ }
+ };
+ OnClickListener rightAdjustButtonClickListener = new OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ eventListener.onUpdateKeyboardLayoutAdjustment(LayoutAdjustment.RIGHT);
+ }
+ };
+
+ OnClickListener microphoneButtonClickListener = new OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ eventListener.onFireFeedbackEvent(FeedbackEvent.MICROPHONE_BUTTON_DOWN);
+ imeSwitcher.switchToVoiceIme("ja-jp");
+ }
+ };
mozcView.setEventListener(
eventListener,
- new OnClickListener() {
- @Override
- public void onClick(View v) {
- setNarrowMode(!narrowMode);
- }
- },
+ widenButtonClickListener,
// User pushes these buttons to move position in order to see hidden text in editing rather
// than to change his/her favorite position. So we should not apply it to preferences.
- new OnClickListener() {
- @Override
- public void onClick(View v) {
- setLayoutAdjustment(v.getContext().getResources(), LayoutAdjustment.LEFT);
- mozcView.startLayoutAdjustmentAnimation();
- }
- },
- new OnClickListener() {
- @Override
- public void onClick(View v) {
- setLayoutAdjustment(v.getContext().getResources(), LayoutAdjustment.RIGHT);
- mozcView.startLayoutAdjustmentAnimation();
- }
- });
+ leftAdjustButtonClickListener,
+ rightAdjustButtonClickListener,
+ microphoneButtonClickListener);
mozcView.setKeyEventHandler(keyEventHandler);
- setJapaneseKeyboard(japaneseSoftwareKeyboardModel.getKeyboardSpecification(),
- Collections.<TouchEvent>emptyList());
+ propagateSoftwareKeyboardChange(Collections.<TouchEvent>emptyList());
mozcView.setFullscreenMode(fullscreenMode);
mozcView.setLayoutAdjustmentAndNarrowMode(layoutAdjustment, narrowMode);
// At the moment, it is necessary to set the storage to the view, *before* setting emoji
@@ -392,10 +538,9 @@
// TODO(hidehiko): Remove the restriction.
mozcView.setSymbolCandidateStorage(symbolCandidateStorage);
mozcView.setEmojiProviderType(emojiProviderType);
- mozcView.setHardwareCompositionButtonImage(hardwareCompositionMode);
mozcView.setPopupEnabled(popupEnabled);
mozcView.setFlickSensitivity(flickSensitivity);
- mozcView.setSkinType(skinType);
+ mozcView.setSkin(skin);
// Clear the menu dialog.
menuDialog = null;
@@ -412,9 +557,7 @@
return;
}
- boolean voiceInputEnabled = voiceInputAllowed && imeSwitcher.isVoiceImeAvailable();
- menuDialog = new MenuDialog(
- mozcView.getContext(), Optional.fromNullable(menuDialogListener), voiceInputEnabled);
+ menuDialog = new MenuDialog(mozcView.getContext(), Optional.fromNullable(menuDialogListener));
IBinder windowToken = mozcView.getWindowToken();
if (windowToken == null) {
MozcLog.w("Unknown window token");
@@ -454,8 +597,8 @@
if (mozcView == null) {
return;
}
- if (outCommand.getOutput().getAllCandidateWords().getCandidatesCount() == 0 &&
- !outCommand.getInput().getRequestSuggestion()) {
+ if (outCommand.getOutput().getAllCandidateWords().getCandidatesCount() == 0
+ && !outCommand.getInput().getRequestSuggestion()) {
// The server doesn't return the suggestion result, because there is following
// key sequence, which will trigger the suggest and the new suggestion will overwrite
// the current suggest. In order to avoid chattering the candidate window,
@@ -475,26 +618,32 @@
* @return the current keyboard specification.
*/
@Override
- public KeyboardSpecification getJapaneseKeyboardSpecification() {
- return japaneseSoftwareKeyboardModel.getKeyboardSpecification();
+ public KeyboardSpecification getKeyboardSpecification() {
+ return getActiveSoftwareKeyboardModel().getKeyboardSpecification();
}
- /**
- * Set {@code EditorInfo} instance to the current view.
- */
+ /** Set {@code EditorInfo} instance to the current view. */
@Override
public void setEditorInfo(EditorInfo attribute) {
- mozcView.setEmojiEnabled(
- EmojiUtil.isUnicodeEmojiAvailable(Build.VERSION.SDK_INT),
- EmojiUtil.isCarrierEmojiAllowed(attribute));
- mozcView.setPasswordField(MozcUtil.isPasswordField(attribute));
- mozcView.setEditorInfo(attribute);
- voiceInputAllowed = MozcUtil.isVoiceInputAllowed(attribute);
+ if (mozcView != null) {
+ mozcView.setEmojiEnabled(
+ EmojiUtil.isUnicodeEmojiAvailable(Build.VERSION.SDK_INT),
+ EmojiUtil.isCarrierEmojiAllowed(attribute));
+ mozcView.setPasswordField(MozcUtil.isPasswordField(attribute.inputType));
+ mozcView.setEditorInfo(attribute);
+ }
+ isVoiceInputEligible = MozcUtil.isVoiceInputPreferred(attribute);
japaneseSoftwareKeyboardModel.setInputType(attribute.inputType);
- setJapaneseKeyboard(
- japaneseSoftwareKeyboardModel.getKeyboardSpecification(),
- Collections.<TouchEvent>emptyList());
+ // TODO(hsumita): Set input type on Hardware keyboard, too. Otherwise, Hiragana input can be
+ // enabled unexpectedly. (e.g. Number text field.)
+ propagateSoftwareKeyboardChange(Collections.<TouchEvent>emptyList());
+ }
+
+ private boolean shouldVoiceImeBeEnabled() {
+ // Disable voice IME if hardware keyboard exists to avoid a framework bug.
+ return isVoiceInputEligible && isVoiceInputEnabledByPreference && !hardwareKeyboardExist
+ && imeSwitcher.isVoiceImeAvailable();
}
@Override
@@ -509,6 +658,12 @@
}
MozcView mozcView = this.mozcView;
+ if (isSymbolInputViewShownByEmojiKey) {
+ setNarrowMode(true);
+ mozcView.hideSymbolInputView();
+ return true;
+ }
+
// Try to hide a sub view from front to back.
if (mozcView.hideSymbolInputView()) {
return true;
@@ -519,22 +674,66 @@
/**
* Creates and sets a keyboard represented by the resource id to the input frame.
- *
+ * <p>
* Note that this method requires inputFrameView is not null, and its first child is
* the JapaneseKeyboardView.
- * @param specification Keyboard specification for the next
*/
- private void setJapaneseKeyboard(
- KeyboardSpecification specification, List<? extends TouchEvent> touchEventList) {
- eventListener.onKeyEvent(null, null, specification, touchEventList);
- if (mozcView != null) {
- Rect size = mozcView.getKeyboardSize();
- JapaneseKeyboard japaneseKeyboard =
- japaneseKeyboardFactory.get(mozcView.getResources(), specification,
- size.width(), size.height());
- mozcView.setJapaneseKeyboard(japaneseKeyboard);
- primaryKeyCodeConverter.setJapaneseKeyboard(japaneseKeyboard);
+ private void updateKeyboardView() {
+ if (mozcView == null) {
+ return;
}
+ Rect size = mozcView.getKeyboardSize();
+ Keyboard keyboard = keyboardFactory.get(
+ mozcView.getResources(), japaneseSoftwareKeyboardModel.getKeyboardSpecification(),
+ size.width(), size.height());
+ mozcView.setKeyboard(keyboard);
+ primaryKeyCodeConverter.setKeyboard(keyboard);
+ }
+
+ /**
+ * Propagates the change of S/W keyboard to the view layer and the H/W keyboard configuration.
+ */
+ private void propagateSoftwareKeyboardChange(List<TouchEvent> touchEventList) {
+ KeyboardSpecification specification = japaneseSoftwareKeyboardModel.getKeyboardSpecification();
+
+ // TODO(team): The purpose of the following call of onKeyEvent() is to tell the change of
+ // software keyboard specification to Mozc server through the event listener registered by
+ // MozcService. Obviously, calling onKeyEvent() for this purpose is abuse and should be fixed.
+ eventListener.onKeyEvent(null, null, specification, touchEventList);
+
+ // Update H/W keyboard specification to keep a consistency with S/W keyboard.
+ hardwareKeyboard.setCompositionMode(
+ specification.getCompositionMode() == CompositionMode.HIRAGANA
+ ? CompositionSwitchMode.KANA : CompositionSwitchMode.ALPHABET);
+
+ updateKeyboardView();
+ }
+
+ private void propagateHardwareKeyboardChange() {
+ propagateHardwareKeyboardChangeAndSendKey(null);
+ }
+
+ /**
+ * Propagates the change of S/W keyboard to the view layer and the H/W keyboard configuration, and
+ * the send key event to Mozc server.
+ */
+ private void propagateHardwareKeyboardChangeAndSendKey(@Nullable KeyEvent event) {
+ KeyboardSpecification specification = hardwareKeyboard.getKeyboardSpecification();
+
+ if (event == null) {
+ eventListener.onKeyEvent(null, null, specification, Collections.<TouchEvent>emptyList());
+ } else {
+ eventListener.onKeyEvent(
+ hardwareKeyboard.getMozcKeyEvent(event), hardwareKeyboard.getKeyEventInterface(event),
+ specification, Collections.<TouchEvent>emptyList());
+ }
+
+ // Update S/W keyboard specification to keep a consistency with H/W keyboard.
+ japaneseSoftwareKeyboardModel.setKeyboardMode(
+ specification.getCompositionMode() == CompositionMode.HIRAGANA
+ ? KeyboardMode.KANA : KeyboardMode.ALPHABET);
+
+ updateKeyboardView();
}
/**
@@ -548,13 +747,11 @@
if (japaneseSoftwareKeyboardModel.getKeyboardLayout() != keyboardLayout) {
// If changed, clear the keyboard cache.
- japaneseKeyboardFactory.clear();
+ keyboardFactory.clear();
}
japaneseSoftwareKeyboardModel.setKeyboardLayout(keyboardLayout);
- setJapaneseKeyboard(
- japaneseSoftwareKeyboardModel.getKeyboardSpecification(),
- Collections.<TouchEvent>emptyList());
+ propagateSoftwareKeyboardChange(Collections.<TouchEvent>emptyList());
}
/**
@@ -569,26 +766,22 @@
if (japaneseSoftwareKeyboardModel.getInputStyle() != inputStyle) {
// If changed, clear the keyboard cache.
- japaneseKeyboardFactory.clear();
+ keyboardFactory.clear();
}
japaneseSoftwareKeyboardModel.setInputStyle(inputStyle);
- setJapaneseKeyboard(
- japaneseSoftwareKeyboardModel.getKeyboardSpecification(),
- Collections.<TouchEvent>emptyList());
+ propagateSoftwareKeyboardChange(Collections.<TouchEvent>emptyList());
}
@Override
public void setQwertyLayoutForAlphabet(boolean qwertyLayoutForAlphabet) {
if (japaneseSoftwareKeyboardModel.isQwertyLayoutForAlphabet() != qwertyLayoutForAlphabet) {
// If changed, clear the keyboard cache.
- japaneseKeyboardFactory.clear();
+ keyboardFactory.clear();
}
japaneseSoftwareKeyboardModel.setQwertyLayoutForAlphabet(qwertyLayoutForAlphabet);
- setJapaneseKeyboard(
- japaneseSoftwareKeyboardModel.getKeyboardSpecification(),
- Collections.<TouchEvent>emptyList());
+ propagateSoftwareKeyboardChange(Collections.<TouchEvent>emptyList());
}
@Override
@@ -623,13 +816,41 @@
}
/**
- * @param isNarrowMode Whether mozc view shows in narrow mode or normal.
+ * Updates whether Globe button should be enabled or not based on
+ * {@code InputMethodManager#shouldOfferSwitchingToNextInputMethod(IBinder)}
*/
@Override
- public void setNarrowMode(boolean isNarrowMode) {
- this.narrowMode = isNarrowMode;
+ public void updateGlobeButtonEnabled() {
+ this.globeButtonEnabled = imeSwitcher.shouldOfferSwitchingToNextInputMethod();
if (mozcView != null) {
- mozcView.setLayoutAdjustmentAndNarrowMode(layoutAdjustment, isNarrowMode);
+ mozcView.setGlobeButtonEnabled(globeButtonEnabled);
+ }
+ }
+
+ /**
+ * Updates whether Microphone button should be enabled or not based on
+ * availability of voice input method.
+ */
+ @Override
+ public void updateMicrophoneButtonEnabled() {
+ if (mozcView != null) {
+ mozcView.setMicrophoneButtonEnabled(shouldVoiceImeBeEnabled());
+ }
+ }
+
+ /**
+ * @param newNarrowMode Whether mozc view shows in narrow mode or normal.
+ */
+ @Override
+ public void setNarrowMode(boolean newNarrowMode) {
+ boolean previousNarrowMode = this.narrowMode;
+ this.narrowMode = newNarrowMode;
+ if (mozcView != null) {
+ mozcView.setLayoutAdjustmentAndNarrowMode(layoutAdjustment, newNarrowMode);
+ }
+ updateMicrophoneButtonEnabled();
+ if (previousNarrowMode != newNarrowMode) {
+ eventListener.onNarrowModeChanged(newNarrowMode);
}
}
@@ -646,20 +867,19 @@
@Override
public void maybeTransitToNarrowMode(Command command, KeyEventInterface keyEventInterface) {
Preconditions.checkNotNull(command);
- // Surely we don't anthing when on narrow mode already.
+ // Surely we don't anything when on narrow mode already.
if (isNarrowMode()) {
return;
}
// Do nothing for the input from software keyboard.
- if (keyEventInterface == null || keyEventInterface.getNativeEvent() == null) {
+ if (keyEventInterface == null || !keyEventInterface.getNativeEvent().isPresent()) {
return;
}
- // Do nothing if the key event doesn't have printable character without modifier.
- if (!command.getInput().hasKey()
- || !command.getInput().getKey().hasKeyCode()
- || command.getInput().getKey().hasModifiers()) {
+ // Do nothing if input doesn't have a key. (e.g. pure modifier key)
+ if (!command.getInput().hasKey()) {
return;
}
+
// Passed all the check. Transit to narrow mode.
hideSubInputView();
setNarrowMode(true);
@@ -671,6 +891,11 @@
}
@Override
+ public boolean isFloatingCandidateMode() {
+ return mozcView != null && mozcView.isFloatingCandidateMode();
+ }
+
+ @Override
public void setPopupEnabled(boolean popupEnabled) {
this.popupEnabled = popupEnabled;
if (mozcView != null) {
@@ -679,28 +904,53 @@
}
@Override
- public void setHardwareKeyboardCompositionMode(CompositionMode compositionMode) {
- hardwareCompositionMode = compositionMode;
- if (mozcView != null) {
- mozcView.setHardwareCompositionButtonImage(compositionMode);
+ public void switchHardwareKeyboardCompositionMode(CompositionSwitchMode mode) {
+ Preconditions.checkNotNull(mode);
+
+ CompositionMode oldMode = hardwareKeyboard.getCompositionMode();
+ hardwareKeyboard.setCompositionMode(mode);
+ CompositionMode newMode = hardwareKeyboard.getCompositionMode();
+ if (oldMode != newMode) {
+ propagateHardwareKeyboardChange();
}
}
@Override
- public void setSkinType(SkinType skinType) {
- this.skinType = skinType;
+ public void setHardwareKeyMap(HardwareKeyMap hardwareKeyMap) {
+ hardwareKeyboard.setHardwareKeyMap(Preconditions.checkNotNull(hardwareKeyMap));
+ }
+
+ @Override
+ public void setSkin(Skin skin) {
+ this.skin = Preconditions.checkNotNull(skin);
if (mozcView != null) {
- mozcView.setSkinType(skinType);
+ mozcView.setSkin(skin);
}
}
@Override
- public void setLayoutAdjustment(Resources resources, LayoutAdjustment layoutAdjustment) {
- this.layoutAdjustment = layoutAdjustment;
+ public void setMicrophoneButtonEnabledByPreference(boolean microphoneButtonEnabled) {
+ this.isVoiceInputEnabledByPreference = microphoneButtonEnabled;
+ updateMicrophoneButtonEnabled();
+ }
+ /**
+ * Set layout adjustment and show animation if required.
+ * <p>
+ * Note that this method does *NOT* update SharedPreference.
+ * If you want to update it, use ViewEventListener#onUpdateKeyboardLayoutAdjustment(),
+ * which updates SharedPreference and indirectly calls this method.
+ */
+ @Override
+ public void setLayoutAdjustment(LayoutAdjustment layoutAdjustment) {
+ Preconditions.checkNotNull(layoutAdjustment);
if (mozcView != null) {
mozcView.setLayoutAdjustmentAndNarrowMode(layoutAdjustment, narrowMode);
+ if (this.layoutAdjustment != layoutAdjustment) {
+ mozcView.startLayoutAdjustmentAnimation();
+ }
}
+ this.layoutAdjustment = layoutAdjustment;
}
@Override
@@ -724,6 +974,8 @@
mozcView.reset();
}
+ viewLayerKeyEventHandler.reset();
+
// Reset menu dialog.
maybeDismissMenuDialog();
}
@@ -771,16 +1023,33 @@
@Override
public void onConfigurationChanged(Configuration newConfig) {
primaryKeyCodeConverter.setConfiguration(newConfig);
+ hardwareKeyboardExist = newConfig.keyboard != Configuration.KEYBOARD_NOKEYS;
}
@Override
public boolean isKeyConsumedOnViewAsynchronously(KeyEvent event) {
- return false;
+ return viewLayerKeyEventHandler.evaluateKeyEvent(Preconditions.checkNotNull(event));
}
@Override
public void consumeKeyOnViewSynchronously(KeyEvent event) {
- throw new IllegalArgumentException("ViewManager doesn't consume any key event.");
+ viewLayerKeyEventHandler.invoke();
+ }
+
+ @Override
+ public void onHardwareKeyEvent(KeyEvent event) {
+ // Maybe update the composition mode based on the event.
+ // For example, zen/han key toggles the composition mode (hiragana <--> alphabet).
+ CompositionMode compositionMode = hardwareKeyboard.getCompositionMode();
+ hardwareKeyboard.setCompositionModeByKey(event);
+ CompositionMode currentCompositionMode = hardwareKeyboard.getCompositionMode();
+ if (compositionMode != currentCompositionMode) {
+ propagateHardwareKeyboardChangeAndSendKey(event);
+ } else {
+ eventListener.onKeyEvent(
+ hardwareKeyboard.getMozcKeyEvent(event), hardwareKeyboard.getKeyEventInterface(event),
+ hardwareKeyboard.getKeyboardSpecification(), Collections.<TouchEvent>emptyList());
+ }
}
@Override
@@ -799,10 +1068,18 @@
return eventListener;
}
+ /**
+ * Returns active (shown) JapaneseSoftwareKeyboardModel.
+ * If symbol picker is shown, symbol-number keyboard's is returned.
+ */
@VisibleForTesting
@Override
- public JapaneseSoftwareKeyboardModel getJapaneseSoftwareKeyboardModel() {
- return japaneseSoftwareKeyboardModel;
+ public JapaneseSoftwareKeyboardModel getActiveSoftwareKeyboardModel() {
+ if (isSymbolInputViewVisible) {
+ return symbolNumberSoftwareKeyboardModel;
+ } else {
+ return japaneseSoftwareKeyboardModel;
+ }
}
@VisibleForTesting
@@ -825,8 +1102,14 @@
@VisibleForTesting
@Override
- public SkinType getSkinType() {
- return skinType;
+ public Skin getSkin() {
+ return skin;
+ }
+
+ @VisibleForTesting
+ @Override
+ public boolean isMicrophoneButtonEnabledByPreference() {
+ return isVoiceInputEnabledByPreference;
}
@VisibleForTesting
@@ -841,6 +1124,12 @@
return keyboardHeightRatio;
}
+ @VisibleForTesting
+ @Override
+ public HardwareKeyMap getHardwareKeyMap() {
+ return hardwareKeyboard.getHardwareKeyMap();
+ }
+
@Override
public void trimMemory() {
if (mozcView != null) {
@@ -852,4 +1141,31 @@
public KeyboardActionListener getKeyboardActionListener() {
return keyboardActionListener;
}
+
+ @Override
+ public void setCursorAnchorInfo(CursorAnchorInfo cursorAnchorInfo) {
+ if (mozcView != null) {
+ mozcView.setCursorAnchorInfo(cursorAnchorInfo);
+ }
+ }
+
+ @Override
+ public void setCursorAnchorInfoEnabled(boolean enabled) {
+ this.cursorAnchroInfoEnabled = enabled;
+ if (mozcView != null) {
+ mozcView.setCursorAnchorInfoEnabled(enabled);
+ }
+ }
+
+ @Override
+ public void onShowSymbolInputView() {
+ isSymbolInputViewVisible = true;
+ mozcView.resetKeyboardViewState();
+ }
+
+ @Override
+ public void onCloseSymbolInputView() {
+ isSymbolInputViewVisible = false;
+ isSymbolInputViewShownByEmojiKey = false;
+ }
}
diff --git a/src/android/src/com/google/android/inputmethod/japanese/ViewManagerInterface.java b/src/android/src/com/google/android/inputmethod/japanese/ViewManagerInterface.java
index bac7918..efc12b4 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/ViewManagerInterface.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/ViewManagerInterface.java
@@ -29,26 +29,27 @@
package org.mozc.android.inputmethod.japanese;
-import org.mozc.android.inputmethod.japanese.JapaneseKeyboard.KeyboardSpecification;
import org.mozc.android.inputmethod.japanese.KeycodeConverter.KeyEventInterface;
import org.mozc.android.inputmethod.japanese.emoji.EmojiProviderType;
+import org.mozc.android.inputmethod.japanese.hardwarekeyboard.HardwareKeyboard.CompositionSwitchMode;
+import org.mozc.android.inputmethod.japanese.keyboard.Keyboard.KeyboardSpecification;
import org.mozc.android.inputmethod.japanese.keyboard.KeyboardActionListener;
import org.mozc.android.inputmethod.japanese.model.JapaneseSoftwareKeyboardModel;
+import org.mozc.android.inputmethod.japanese.preference.ClientSidePreference.HardwareKeyMap;
import org.mozc.android.inputmethod.japanese.preference.ClientSidePreference.InputStyle;
import org.mozc.android.inputmethod.japanese.preference.ClientSidePreference.KeyboardLayout;
import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Command;
-import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.CompositionMode;
-import org.mozc.android.inputmethod.japanese.view.SkinType;
+import org.mozc.android.inputmethod.japanese.view.Skin;
import com.google.common.annotations.VisibleForTesting;
import android.content.Context;
import android.content.res.Configuration;
-import android.content.res.Resources;
import android.inputmethodservice.InputMethodService;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
import android.view.Window;
+import android.view.inputmethod.CursorAnchorInfo;
import android.view.inputmethod.EditorInfo;
/**
@@ -98,6 +99,8 @@
*/
public void consumeKeyOnViewSynchronously(KeyEvent event);
+ public void onHardwareKeyEvent(KeyEvent keyEvent);
+
/**
* @return whether the view should consume the generic motion event or not.
*/
@@ -113,7 +116,7 @@
/**
* @return the current keyboard specification.
*/
- public KeyboardSpecification getJapaneseKeyboardSpecification();
+ public KeyboardSpecification getKeyboardSpecification();
/**
* Set {@code EditorInfo} instance to the current view.
@@ -163,18 +166,28 @@
public boolean isNarrowMode();
+ public boolean isFloatingCandidateMode();
+
public void setPopupEnabled(boolean popupEnabled);
- public void setHardwareKeyboardCompositionMode(CompositionMode compositionMode);
+ public void switchHardwareKeyboardCompositionMode(CompositionSwitchMode mode);
- public void setSkinType(SkinType skinType);
+ public void setHardwareKeyMap(HardwareKeyMap hardwareKeyMap);
- public void setLayoutAdjustment(Resources resources, LayoutAdjustment layoutAdjustment);
+ public void setSkin(Skin skin);
+
+ public void setMicrophoneButtonEnabledByPreference(boolean microphoneButtonEnabled);
+
+ public void setLayoutAdjustment(LayoutAdjustment layoutAdjustment);
public void setKeyboardHeightRatio(int keyboardHeightRatio);
public void onConfigurationChanged(Configuration newConfig);
+ public void setCursorAnchorInfo(CursorAnchorInfo info);
+
+ public void setCursorAnchorInfoEnabled(boolean enabled);
+
/**
* Reset the status of the current input view.
*/
@@ -183,11 +196,14 @@
public void computeInsets(
Context context, InputMethodService.Insets outInsets, Window window);
+ public void onShowSymbolInputView();
+ public void onCloseSymbolInputView();
+
@VisibleForTesting
public ViewEventListener getEventListener();
@VisibleForTesting
- public JapaneseSoftwareKeyboardModel getJapaneseSoftwareKeyboardModel();
+ public JapaneseSoftwareKeyboardModel getActiveSoftwareKeyboardModel();
@VisibleForTesting
public boolean isPopupEnabled();
@@ -199,7 +215,10 @@
public EmojiProviderType getEmojiProviderType();
@VisibleForTesting
- public SkinType getSkinType();
+ public Skin getSkin();
+
+ @VisibleForTesting
+ public boolean isMicrophoneButtonEnabledByPreference();
@VisibleForTesting
public LayoutAdjustment getLayoutAdjustment();
@@ -207,9 +226,16 @@
@VisibleForTesting
public int getKeyboardHeightRatio();
+ @VisibleForTesting
+ public HardwareKeyMap getHardwareKeyMap();
+
/**
* Used for testing to inject key events.
*/
@VisibleForTesting
public KeyboardActionListener getKeyboardActionListener();
+
+ void updateGlobeButtonEnabled();
+
+ void updateMicrophoneButtonEnabled();
}
diff --git a/src/android/src/com/google/android/inputmethod/japanese/accessibility/CandidateWindowAccessibilityNodeProvider.java b/src/android/src/com/google/android/inputmethod/japanese/accessibility/CandidateWindowAccessibilityNodeProvider.java
index cad8979..c4463fc 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/accessibility/CandidateWindowAccessibilityNodeProvider.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/accessibility/CandidateWindowAccessibilityNodeProvider.java
@@ -38,6 +38,7 @@
import com.google.common.base.Preconditions;
import com.google.common.base.Strings;
+import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Rect;
import android.os.Bundle;
@@ -113,6 +114,7 @@
return Optional.fromNullable(virtualViewIdToRow.get().get(virtualViewId));
}
+ @SuppressLint("InlinedApi")
private Optional<AccessibilityNodeInfoCompat> createNodeInfoForId(int virtualViewId) {
Optional<Row> optionalRow = getRow(virtualViewId);
if (!optionalRow.isPresent()) {
@@ -209,6 +211,9 @@
* @param y vertical location in screen coordinate (pixel)
*/
Optional<CandidateWord> getCandidateWord(int x, int y) {
+ if (!layout.isPresent()) {
+ return Optional.absent();
+ }
for (Row row : layout.get().getRowList()) {
if (y < row.getTop() || y >= row.getTop() + row.getHeight()) {
continue;
diff --git a/src/android/src/com/google/android/inputmethod/japanese/accessibility/KeyboardAccessibilityDelegate.java b/src/android/src/com/google/android/inputmethod/japanese/accessibility/KeyboardAccessibilityDelegate.java
index 5d174d3..e4949a2 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/accessibility/KeyboardAccessibilityDelegate.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/accessibility/KeyboardAccessibilityDelegate.java
@@ -32,11 +32,9 @@
import org.mozc.android.inputmethod.japanese.keyboard.Flick.Direction;
import org.mozc.android.inputmethod.japanese.keyboard.Key;
import org.mozc.android.inputmethod.japanese.keyboard.KeyEntity;
-import org.mozc.android.inputmethod.japanese.keyboard.KeyEventHandler;
import org.mozc.android.inputmethod.japanese.keyboard.KeyState;
import org.mozc.android.inputmethod.japanese.keyboard.KeyState.MetaState;
import org.mozc.android.inputmethod.japanese.keyboard.Keyboard;
-import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Input.TouchEvent;
import org.mozc.android.inputmethod.japanese.resources.R;
import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Optional;
@@ -71,8 +69,6 @@
private final View view;
private final KeyboardAccessibilityNodeProvider nodeProvider;
private Optional<Key> lastHoverKey = Optional.absent();
- // Handler which is called back when key-input should be simulated.
- private Optional<KeyEventHandler> keyEventHandler = Optional.absent();
// Handler for long-press callback.
// Contains 0 or 1 delayed message.
private final Handler handler;
@@ -84,6 +80,15 @@
// In such case touch-up shouldn't send any key events.
// Reset to false when new touch sequence is started.
private boolean consumedByLongpress = false;
+ private final TouchEventEmulator emulator;
+
+ /**
+ * Emulator interface for touch events (Key input and long press).
+ */
+ public interface TouchEventEmulator {
+ public void emulateKeyInput(Key key);
+ public void emulateLongPress(Key key);
+ }
private class LongTapHandler implements Handler.Callback {
@Override
@@ -96,20 +101,23 @@
}
- public KeyboardAccessibilityDelegate(View view) {
+ public KeyboardAccessibilityDelegate(View view, TouchEventEmulator emulator) {
this(view, new KeyboardAccessibilityNodeProvider(view),
view.getContext().getResources().getInteger(
- R.integer.config_long_press_key_delay_accessibility));
+ R.integer.config_long_press_key_delay_accessibility),
+ emulator);
}
@VisibleForTesting
KeyboardAccessibilityDelegate(View view,
KeyboardAccessibilityNodeProvider nodeProvider,
- int longpressDelay) {
+ int longpressDelay,
+ TouchEventEmulator emulator) {
this.view = Preconditions.checkNotNull(view);
this.nodeProvider = Preconditions.checkNotNull(nodeProvider);
this.handler = new Handler(new LongTapHandler());
this.longpressDelay = longpressDelay;
+ this.emulator = Preconditions.checkNotNull(emulator);
}
private Context getContext() {
@@ -210,13 +218,11 @@
if (!keyState.isPresent()) {
return;
}
- int keyCode = keyState.get().getFlick(Direction.CENTER).getKeyEntity().getKeyCode();
- if (keyCode == KeyEntity.INVALID_KEY_CODE
- || !keyEventHandler.isPresent()
- || consumedByLongpress) {
+ int keyCode = keyState.get().getFlick(Direction.CENTER).get().getKeyEntity().getKeyCode();
+ if (keyCode == KeyEntity.INVALID_KEY_CODE || consumedByLongpress) {
return;
}
- keyEventHandler.get().sendKey(keyCode, Collections.<TouchEvent>emptyList());
+ emulator.emulateKeyInput(key);
}
private void simulateLongPress(Key key) {
@@ -225,14 +231,12 @@
if (!keyState.isPresent()) {
return;
}
- int longPressKeyCode = keyState.get().getFlick(Direction.CENTER)
- .getKeyEntity().getLongPressKeyCode();
- if (longPressKeyCode == KeyEntity.INVALID_KEY_CODE
- || !keyEventHandler.isPresent()
- || consumedByLongpress) {
+ int longPressKeyCode =
+ keyState.get().getFlick(Direction.CENTER).get().getKeyEntity().getLongPressKeyCode();
+ if (longPressKeyCode == KeyEntity.INVALID_KEY_CODE || consumedByLongpress) {
return;
}
- keyEventHandler.get().sendKey(longPressKeyCode, Collections.<TouchEvent>emptyList());
+ emulator.emulateLongPress(key);
consumedByLongpress = true;
}
@@ -355,8 +359,4 @@
// Don't speak if the IME is connected to a password field.
return isPasswordField;
}
-
- public void setKeyEventHandler(Optional<KeyEventHandler> keyEventHandler) {
- this.keyEventHandler = Preconditions.checkNotNull(keyEventHandler);
- }
}
diff --git a/src/android/src/com/google/android/inputmethod/japanese/accessibility/KeyboardAccessibilityNodeProvider.java b/src/android/src/com/google/android/inputmethod/japanese/accessibility/KeyboardAccessibilityNodeProvider.java
index 570e598..ab698dd 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/accessibility/KeyboardAccessibilityNodeProvider.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/accessibility/KeyboardAccessibilityNodeProvider.java
@@ -223,7 +223,8 @@
if (key.isSpacer()) {
return UNDEFINED;
}
- return getKeyState(key, metaState).getFlick(Direction.CENTER).getKeyEntity().getSourceId();
+ return getKeyState(key, metaState).getFlick(
+ Direction.CENTER).get().getKeyEntity().getSourceId();
}
private Optional<Integer> getKeyCode(Key key) {
@@ -232,7 +233,7 @@
return Optional.absent();
}
return Optional.of(getKeyState(key, metaState).getFlick(
- Direction.CENTER).getKeyEntity().getKeyCode());
+ Direction.CENTER).get().getKeyEntity().getKeyCode());
}
/**
diff --git a/src/android/src/com/google/android/inputmethod/japanese/hardwarekeyboard/HardwareKeyboard.java b/src/android/src/com/google/android/inputmethod/japanese/hardwarekeyboard/HardwareKeyboard.java
index 4fb8e5a..f0146f2 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/hardwarekeyboard/HardwareKeyboard.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/hardwarekeyboard/HardwareKeyboard.java
@@ -29,9 +29,9 @@
package org.mozc.android.inputmethod.japanese.hardwarekeyboard;
-import org.mozc.android.inputmethod.japanese.JapaneseKeyboard.KeyboardSpecification;
import org.mozc.android.inputmethod.japanese.KeycodeConverter.KeyEventInterface;
import org.mozc.android.inputmethod.japanese.MozcLog;
+import org.mozc.android.inputmethod.japanese.keyboard.Keyboard.KeyboardSpecification;
import org.mozc.android.inputmethod.japanese.preference.ClientSidePreference.HardwareKeyMap;
import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands;
import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.CompositionMode;
diff --git a/src/android/src/com/google/android/inputmethod/japanese/hardwarekeyboard/HardwareKeyboardSpecification.java b/src/android/src/com/google/android/inputmethod/japanese/hardwarekeyboard/HardwareKeyboardSpecification.java
index 11e400c..7b4b23a 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/hardwarekeyboard/HardwareKeyboardSpecification.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/hardwarekeyboard/HardwareKeyboardSpecification.java
@@ -29,11 +29,11 @@
package org.mozc.android.inputmethod.japanese.hardwarekeyboard;
-import org.mozc.android.inputmethod.japanese.JapaneseKeyboard.KeyboardSpecification;
import org.mozc.android.inputmethod.japanese.KeycodeConverter.KeyEventInterface;
import org.mozc.android.inputmethod.japanese.MozcLog;
import org.mozc.android.inputmethod.japanese.hardwarekeyboard.HardwareKeyboard.CompositionSwitchMode;
import org.mozc.android.inputmethod.japanese.hardwarekeyboard.KeyEventMapperFactory.KeyEventMapper;
+import org.mozc.android.inputmethod.japanese.keyboard.Keyboard.KeyboardSpecification;
import org.mozc.android.inputmethod.japanese.preference.ClientSidePreference.HardwareKeyMap;
import org.mozc.android.inputmethod.japanese.preference.PreferenceUtil;
import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands;
@@ -98,15 +98,7 @@
JAPANESE109A(HardwareKeyMap.JAPANESE109A,
KeyEventMapperFactory.JAPANESE_KEYBOARD_MAPPER,
KeyboardSpecification.HARDWARE_QWERTY_KANA,
- KeyboardSpecification.HARDWARE_QWERTY_ALPHABET),
-
- /**
- * Represents Japanese Mobile "12" Keyboard
- */
- TWELVEKEY(HardwareKeyMap.TWELVEKEY,
- KeyEventMapperFactory.TWELVEKEY_KEYBOARD_MAPPER,
- KeyboardSpecification.TWELVE_KEY_TOGGLE_KANA,
- KeyboardSpecification.TWELVE_KEY_TOGGLE_ALPHABET);
+ KeyboardSpecification.HARDWARE_QWERTY_ALPHABET);
/**
* Returns true if the given {@code codepoint} is printable.
@@ -214,10 +206,8 @@
HardwareKeyMap detectedKeyMap = null;
switch(configuration.keyboard) {
case Configuration.KEYBOARD_12KEY:
- detectedKeyMap = HardwareKeyMap.TWELVEKEY;
- break;
case Configuration.KEYBOARD_QWERTY:
- detectedKeyMap = HardwareKeyMap.JAPANESE109A;
+ detectedKeyMap = HardwareKeyMap.DEFAULT;
break;
case Configuration.KEYBOARD_NOKEYS:
case Configuration.KEYBOARD_UNDEFINED:
@@ -477,8 +467,8 @@
}
@Override
- public android.view.KeyEvent getNativeEvent() {
- return keyEvent;
+ public Optional<android.view.KeyEvent> getNativeEvent() {
+ return Optional.of(keyEvent);
}
};
}
diff --git a/src/android/src/com/google/android/inputmethod/japanese/hardwarekeyboard/KeyEventMapperFactory.java b/src/android/src/com/google/android/inputmethod/japanese/hardwarekeyboard/KeyEventMapperFactory.java
index 57bd6f5..71768d8 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/hardwarekeyboard/KeyEventMapperFactory.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/hardwarekeyboard/KeyEventMapperFactory.java
@@ -53,7 +53,6 @@
}
public static final KeyEventMapper DEFAULT_KEYBOARD_MAPPER = new DefaultKeyboardMapper();
- public static final KeyEventMapper TWELVEKEY_KEYBOARD_MAPPER = new TwelvekeyKeyboardMapper();
public static final KeyEventMapper JAPANESE_KEYBOARD_MAPPER = new JapaneseKeyboardMapper();
/**
@@ -69,25 +68,6 @@
}
/**
- * Similar to DefaultKeyboardMapper but additional conversion for POUND and CENTER keys.
- */
- private static class TwelvekeyKeyboardMapper implements KeyEventMapper {
- static void doKeyCharacterMapping(CompactKeyEvent keyEvent) {
- int originalKeyCode = keyEvent.getKeyCode();
- if (originalKeyCode == KeyEvent.KEYCODE_POUND
- || originalKeyCode == KeyEvent.KEYCODE_DPAD_CENTER) {
- keyEvent.setKeyCode(KeyEvent.KEYCODE_ENTER);
- }
- }
- @Override
- public void applyMapping(CompactKeyEvent keyEvent) {
- keyEvent.setKeyCode(doKeyLayoutMappingForOldAndroids(keyEvent.getKeyCode(),
- keyEvent.getScanCode()));
- doKeyCharacterMapping(keyEvent);
- }
- }
-
- /**
* Key-layout and key-character mapping for Japanese keyboard.
*/
@SuppressLint("InlinedApi")
diff --git a/src/android/src/com/google/android/inputmethod/japanese/keyboard/BackgroundDrawableFactory.java b/src/android/src/com/google/android/inputmethod/japanese/keyboard/BackgroundDrawableFactory.java
index 9414ce6..9074138 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/keyboard/BackgroundDrawableFactory.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/keyboard/BackgroundDrawableFactory.java
@@ -29,19 +29,25 @@
package org.mozc.android.inputmethod.japanese.keyboard;
+import org.mozc.android.inputmethod.japanese.resources.R;
import org.mozc.android.inputmethod.japanese.view.CandidateBackgroundDrawable;
import org.mozc.android.inputmethod.japanese.view.CandidateBackgroundFocusedDrawable;
import org.mozc.android.inputmethod.japanese.view.CenterCircularHighlightDrawable;
-import org.mozc.android.inputmethod.japanese.view.LightIconDrawable;
-import org.mozc.android.inputmethod.japanese.view.PopUpFrameWindowDrawable;
+import org.mozc.android.inputmethod.japanese.view.DummyDrawable;
+import org.mozc.android.inputmethod.japanese.view.QwertySpaceKeyDrawable;
import org.mozc.android.inputmethod.japanese.view.RectKeyDrawable;
import org.mozc.android.inputmethod.japanese.view.RoundRectKeyDrawable;
-import org.mozc.android.inputmethod.japanese.view.SkinType;
+import org.mozc.android.inputmethod.japanese.view.Skin;
import org.mozc.android.inputmethod.japanese.view.ThreeDotsIconDrawable;
import org.mozc.android.inputmethod.japanese.view.TriangularHighlightDrawable;
import org.mozc.android.inputmethod.japanese.view.TriangularHighlightDrawable.HighlightDirection;
+import com.google.common.base.Optional;
+import com.google.common.base.Preconditions;
+import android.content.res.Resources;
+import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
+import android.graphics.drawable.InsetDrawable;
import android.graphics.drawable.LayerDrawable;
import android.graphics.drawable.StateListDrawable;
@@ -83,8 +89,14 @@
QWERTY_REGULAR_KEY_BACKGROUND,
QWERTY_FUNCTION_KEY_BACKGROUND,
QWERTY_FUNCTION_KEY_BACKGROUND_WITH_THREEDOTS,
- QWERTY_FUNCTION_KEY_LIGHT_ON_BACKGROUND,
- QWERTY_FUNCTION_KEY_LIGHT_OFF_BACKGROUND,
+ QWERTY_FUNCTION_KEY_SPACE_WITH_THREEDOTS,
+
+ // Separator on keyboard.
+ KEYBOARD_SEPARATOR_TOP,
+ KEYBOARD_SEPARATOR_CENTER,
+ KEYBOARD_SEPARATOR_BOTTOM,
+
+ TRNASPARENT,
// Highlight for flicking.
TWELVEKEYS_CENTER_FLICK,
@@ -104,366 +116,327 @@
// According to the original design mock, the pressed key background contains some padding.
// Here are hardcoded parameters.
- private static final float TWELVEKEYS_LEFT_OFFSET = 0.5f;
- private static final float TWELVEKEYS_TOP_OFFSET = 0;
- private static final float TWELVEKEYS_RIGHT_OFFSET = 1.0f;
- private static final float TWELVEKEYS_BOTTOM_OFFSET = 1.0f;
+ public static final float POPUP_WINDOW_PADDING = 7.0f;
+
private static final float TWELVEKEYS_THREEDOTS_BOTTOM_OFFSET = 3.0f;
private static final float TWELVEKEYS_THREEDOTS_RIGHT_OFFSET = 5.0f;
private static final float TWELVEKEYS_THREEDOTS_WIDTH = 2.0f;
private static final float TWELVEKEYS_THREEDOTS_SPAN = 2.0f;
- private static final float QWERTY_LEFT_OFFSET = 2.0f;
- private static final float QWERTY_TOP_OFFSET = 1.0f;
- private static final float QWERTY_RIGHT_OFFSET = 2.0f;
- private static final float QWERTY_BOTTOM_OFFSET = 3.0f;
private static final float QWERTY_THREEDOTS_BOTTOM_OFFSET = 3.0f;
private static final float QWERTY_THREEDOTS_RIGHT_OFFSET = 5.0f;
private static final float QWERTY_THREEDOTS_WIDTH = 2.0f;
private static final float QWERTY_THREEDOTS_SPAN = 2.0f;
- private static final float QWERTY_LIGHT_TOP_OFFSET = 2.0f;
- private static final float QWERTY_LIGHT_RIGHT_OFFSET = 2.0f;
- private static final float QWERTY_LIGHT_RADIUS = 2.25f;
-
- private static final float POPUP_WINDOW_PADDING = 7.0f;
- private static final float POPUP_FRAME_BORDER_WIDTH = 5.0f;
- private static final float POPUP_SHADOW_SIZE = 1.5f;
private static final float CANDIDATE_BACKGROUND_PADDING = 0.0f;
private static final float SYMBOL_CANDIDATE_BACKGROUND_PADDING = 0.0f;
+ private final Resources resources;
private final float density;
private final Map<DrawableType, Drawable> drawableMap =
new EnumMap<DrawableType, Drawable>(DrawableType.class);
- private SkinType skinType = SkinType.ORANGE_LIGHTGRAY;
+ private Skin skin = Skin.getFallbackInstance();
- public BackgroundDrawableFactory(float density) {
- this.density = density;
+ public BackgroundDrawableFactory(Resources resources) {
+ this.resources = Preconditions.checkNotNull(resources);
+ density = resources.getDisplayMetrics().density;
}
public Drawable getDrawable(DrawableType drawableType) {
- if (drawableType == null) {
- return null;
- }
-
- Drawable result = drawableMap.get(drawableType);
+ Drawable result = drawableMap.get(Preconditions.checkNotNull(drawableType));
if (result == null) {
result = createBackgroundDrawable(drawableType);
drawableMap.put(drawableType, result);
}
-
return result;
}
- public void setSkinType(SkinType skinType) {
- if (this.skinType == skinType) {
+ public void setSkin(Skin skin) {
+ Preconditions.checkNotNull(skin);
+ if (this.skin.equals(skin)) {
return;
}
- this.skinType = skinType;
+ this.skin = skin;
drawableMap.clear();
}
private Drawable createBackgroundDrawable(DrawableType drawableType) {
- switch (drawableType) {
+ switch (Preconditions.checkNotNull(drawableType)) {
case TWELVEKEYS_REGULAR_KEY_BACKGROUND:
return createPressableDrawable(
new RectKeyDrawable(
- (int) (TWELVEKEYS_LEFT_OFFSET * density),
- (int) (TWELVEKEYS_TOP_OFFSET * density),
- (int) (TWELVEKEYS_RIGHT_OFFSET * density),
- (int) (TWELVEKEYS_BOTTOM_OFFSET * density),
- skinType.twelvekeysLayoutPressedKeyTopColor,
- skinType.twelvekeysLayoutPressedKeyBottomColor,
- skinType.twelvekeysLayoutPressedKeyHighlightColor,
- skinType.twelvekeysLayoutPressedKeyLightShadeColor,
- skinType.twelvekeysLayoutPressedKeyDarkShadeColor,
- skinType.twelvekeysLayoutPressedKeyShadowColor),
- new RectKeyDrawable(
- (int) (TWELVEKEYS_LEFT_OFFSET * density),
- (int) (TWELVEKEYS_TOP_OFFSET * density),
- (int) (TWELVEKEYS_RIGHT_OFFSET * density),
- (int) (TWELVEKEYS_BOTTOM_OFFSET * density),
- skinType.twelvekeysLayoutReleasedKeyTopColor,
- skinType.twelvekeysLayoutReleasedKeyBottomColor,
- skinType.twelvekeysLayoutReleasedKeyHighlightColor,
- skinType.twelvekeysLayoutReleasedKeyLightShadeColor,
- skinType.twelvekeysLayoutReleasedKeyDarkShadeColor,
- skinType.twelvekeysLayoutReleasedKeyShadowColor));
+ (int) (skin.twelvekeysLeftOffsetDimension),
+ (int) (skin.twelvekeysTopOffsetDimension),
+ (int) (skin.twelvekeysRightOffsetDimension),
+ (int) (skin.twelvekeysBottomOffsetDimension),
+ skin.twelvekeysLayoutPressedKeyTopColor,
+ skin.twelvekeysLayoutPressedKeyBottomColor,
+ skin.twelvekeysLayoutPressedKeyHighlightColor,
+ skin.twelvekeysLayoutPressedKeyLightShadeColor,
+ skin.twelvekeysLayoutPressedKeyDarkShadeColor,
+ skin.twelvekeysLayoutPressedKeyShadowColor),
+ Optional.<Drawable>of(new RectKeyDrawable(
+ (int) (skin.twelvekeysLeftOffsetDimension),
+ (int) (skin.twelvekeysTopOffsetDimension),
+ (int) (skin.twelvekeysRightOffsetDimension),
+ (int) (skin.twelvekeysBottomOffsetDimension),
+ skin.twelvekeysLayoutReleasedKeyTopColor,
+ skin.twelvekeysLayoutReleasedKeyBottomColor,
+ skin.twelvekeysLayoutReleasedKeyHighlightColor,
+ skin.twelvekeysLayoutReleasedKeyLightShadeColor,
+ skin.twelvekeysLayoutReleasedKeyDarkShadeColor,
+ skin.twelvekeysLayoutReleasedKeyShadowColor)));
case TWELVEKEYS_FUNCTION_KEY_BACKGROUND:
return createPressableDrawable(
new RectKeyDrawable(
- (int) (TWELVEKEYS_LEFT_OFFSET * density),
- (int) (TWELVEKEYS_TOP_OFFSET * density),
- (int) (TWELVEKEYS_RIGHT_OFFSET * density),
- (int) (TWELVEKEYS_BOTTOM_OFFSET * density),
- skinType.twelvekeysLayoutPressedFunctionKeyTopColor,
- skinType.twelvekeysLayoutPressedFunctionKeyBottomColor,
- skinType.twelvekeysLayoutPressedFunctionKeyHighlightColor,
- skinType.twelvekeysLayoutPressedFunctionKeyLightShadeColor,
- skinType.twelvekeysLayoutPressedFunctionKeyDarkShadeColor,
- skinType.twelvekeysLayoutPressedFunctionKeyShadowColor),
- new RectKeyDrawable(
- (int) (TWELVEKEYS_LEFT_OFFSET * density),
- (int) (TWELVEKEYS_TOP_OFFSET * density),
- (int) (TWELVEKEYS_RIGHT_OFFSET * density),
- (int) (TWELVEKEYS_BOTTOM_OFFSET * density),
- skinType.twelvekeysLayoutReleasedFunctionKeyTopColor,
- skinType.twelvekeysLayoutReleasedFunctionKeyBottomColor,
- skinType.twelvekeysLayoutReleasedFunctionKeyHighlightColor,
- skinType.twelvekeysLayoutReleasedFunctionKeyLightShadeColor,
- skinType.twelvekeysLayoutReleasedFunctionKeyDarkShadeColor,
- skinType.twelvekeysLayoutReleasedFunctionKeyShadowColor));
+ (int) (skin.twelvekeysLeftOffsetDimension),
+ (int) (skin.twelvekeysTopOffsetDimension),
+ (int) (skin.twelvekeysRightOffsetDimension),
+ (int) (skin.twelvekeysBottomOffsetDimension),
+ skin.twelvekeysLayoutPressedFunctionKeyTopColor,
+ skin.twelvekeysLayoutPressedFunctionKeyBottomColor,
+ skin.twelvekeysLayoutPressedFunctionKeyHighlightColor,
+ skin.twelvekeysLayoutPressedFunctionKeyLightShadeColor,
+ skin.twelvekeysLayoutPressedFunctionKeyDarkShadeColor,
+ skin.twelvekeysLayoutPressedFunctionKeyShadowColor),
+ Optional.<Drawable>of(new RectKeyDrawable(
+ (int) (skin.twelvekeysLeftOffsetDimension),
+ (int) (skin.twelvekeysTopOffsetDimension),
+ (int) (skin.twelvekeysRightOffsetDimension),
+ (int) (skin.twelvekeysBottomOffsetDimension),
+ skin.twelvekeysLayoutReleasedFunctionKeyTopColor,
+ skin.twelvekeysLayoutReleasedFunctionKeyBottomColor,
+ skin.twelvekeysLayoutReleasedFunctionKeyHighlightColor,
+ skin.twelvekeysLayoutReleasedFunctionKeyLightShadeColor,
+ skin.twelvekeysLayoutReleasedFunctionKeyDarkShadeColor,
+ skin.twelvekeysLayoutReleasedFunctionKeyShadowColor)));
case TWELVEKEYS_FUNCTION_KEY_BACKGROUND_WITH_THREEDOTS:
return new LayerDrawable(new Drawable[] {
createPressableDrawable(
new RectKeyDrawable(
- (int) (TWELVEKEYS_LEFT_OFFSET * density),
- (int) (TWELVEKEYS_TOP_OFFSET * density),
- (int) (TWELVEKEYS_RIGHT_OFFSET * density),
- (int) (TWELVEKEYS_BOTTOM_OFFSET * density),
- skinType.twelvekeysLayoutPressedFunctionKeyTopColor,
- skinType.twelvekeysLayoutPressedFunctionKeyBottomColor,
- skinType.twelvekeysLayoutPressedFunctionKeyHighlightColor,
- skinType.twelvekeysLayoutPressedFunctionKeyLightShadeColor,
- skinType.twelvekeysLayoutPressedFunctionKeyDarkShadeColor,
- skinType.twelvekeysLayoutPressedFunctionKeyShadowColor),
- new RectKeyDrawable(
- (int) (TWELVEKEYS_LEFT_OFFSET * density),
- (int) (TWELVEKEYS_TOP_OFFSET * density),
- (int) (TWELVEKEYS_RIGHT_OFFSET * density),
- (int) (TWELVEKEYS_BOTTOM_OFFSET * density),
- skinType.twelvekeysLayoutReleasedFunctionKeyTopColor,
- skinType.twelvekeysLayoutReleasedFunctionKeyBottomColor,
- skinType.twelvekeysLayoutReleasedFunctionKeyHighlightColor,
- skinType.twelvekeysLayoutReleasedFunctionKeyLightShadeColor,
- skinType.twelvekeysLayoutReleasedFunctionKeyDarkShadeColor,
- skinType.twelvekeysLayoutReleasedFunctionKeyShadowColor)),
+ (int) (skin.twelvekeysLeftOffsetDimension),
+ (int) (skin.twelvekeysTopOffsetDimension),
+ (int) (skin.twelvekeysRightOffsetDimension),
+ (int) (skin.twelvekeysBottomOffsetDimension),
+ skin.twelvekeysLayoutPressedFunctionKeyTopColor,
+ skin.twelvekeysLayoutPressedFunctionKeyBottomColor,
+ skin.twelvekeysLayoutPressedFunctionKeyHighlightColor,
+ skin.twelvekeysLayoutPressedFunctionKeyLightShadeColor,
+ skin.twelvekeysLayoutPressedFunctionKeyDarkShadeColor,
+ skin.twelvekeysLayoutPressedFunctionKeyShadowColor),
+ Optional.<Drawable>of(new RectKeyDrawable(
+ (int) (skin.twelvekeysLeftOffsetDimension),
+ (int) (skin.twelvekeysTopOffsetDimension),
+ (int) (skin.twelvekeysRightOffsetDimension),
+ (int) (skin.twelvekeysBottomOffsetDimension),
+ skin.twelvekeysLayoutReleasedFunctionKeyTopColor,
+ skin.twelvekeysLayoutReleasedFunctionKeyBottomColor,
+ skin.twelvekeysLayoutReleasedFunctionKeyHighlightColor,
+ skin.twelvekeysLayoutReleasedFunctionKeyLightShadeColor,
+ skin.twelvekeysLayoutReleasedFunctionKeyDarkShadeColor,
+ skin.twelvekeysLayoutReleasedFunctionKeyShadowColor))),
new ThreeDotsIconDrawable(
- (int) ((TWELVEKEYS_BOTTOM_OFFSET + TWELVEKEYS_THREEDOTS_BOTTOM_OFFSET) * density),
- (int) ((TWELVEKEYS_RIGHT_OFFSET + TWELVEKEYS_THREEDOTS_RIGHT_OFFSET) * density),
- skinType.threeDotsColor,
+ (int) (skin.twelvekeysBottomOffsetDimension
+ + TWELVEKEYS_THREEDOTS_BOTTOM_OFFSET * density),
+ (int) (skin.twelvekeysRightOffsetDimension
+ + TWELVEKEYS_THREEDOTS_RIGHT_OFFSET * density),
+ skin.threeDotsColor,
(int) (TWELVEKEYS_THREEDOTS_WIDTH * density),
(int) (TWELVEKEYS_THREEDOTS_SPAN * density))});
case QWERTY_REGULAR_KEY_BACKGROUND:
return createPressableDrawable(
new RoundRectKeyDrawable(
- (int) (QWERTY_LEFT_OFFSET * density),
- (int) (QWERTY_TOP_OFFSET * density),
- (int) (QWERTY_RIGHT_OFFSET * density),
- (int) (QWERTY_BOTTOM_OFFSET * density),
- (int) (skinType.qwertyKeyRoundRadius * density),
- skinType.qwertyLayoutPressedKeyTopColor,
- skinType.qwertyLayoutPressedKeyBottomColor,
- skinType.qwertyLayoutPressedKeyHighlightColor,
- skinType.qwertyLayoutPressedKeyShadowColor),
- new RoundRectKeyDrawable(
- (int) (QWERTY_LEFT_OFFSET * density),
- (int) (QWERTY_TOP_OFFSET * density),
- (int) (QWERTY_RIGHT_OFFSET * density),
- (int) (QWERTY_BOTTOM_OFFSET * density),
- (int) (skinType.qwertyKeyRoundRadius * density),
- skinType.qwertyLayoutReleasedKeyTopColor,
- skinType.qwertyLayoutReleasedKeyBottomColor,
- skinType.qwertyLayoutReleasedKeyHighlightColor,
- skinType.qwertyLayoutReleasedKeyShadowColor));
+ (int) (skin.qwertyLeftOffsetDimension),
+ (int) (skin.qwertyTopOffsetDimension),
+ (int) (skin.qwertyRightOffsetDimension),
+ (int) (skin.qwertyBottomOffsetDimension),
+ (int) (skin.qwertyRoundRadiusDimension),
+ skin.qwertyLayoutPressedKeyTopColor,
+ skin.qwertyLayoutPressedKeyBottomColor,
+ skin.qwertyLayoutPressedKeyHighlightColor,
+ skin.qwertyLayoutPressedKeyShadowColor),
+ Optional.<Drawable>of(new RoundRectKeyDrawable(
+ (int) (skin.qwertyLeftOffsetDimension),
+ (int) (skin.qwertyTopOffsetDimension),
+ (int) (skin.qwertyRightOffsetDimension),
+ (int) (skin.qwertyBottomOffsetDimension),
+ (int) (skin.qwertyRoundRadiusDimension),
+ skin.qwertyLayoutReleasedKeyTopColor,
+ skin.qwertyLayoutReleasedKeyBottomColor,
+ skin.qwertyLayoutReleasedKeyHighlightColor,
+ skin.qwertyLayoutReleasedKeyShadowColor)));
case QWERTY_FUNCTION_KEY_BACKGROUND:
return createPressableDrawable(
new RoundRectKeyDrawable(
- (int) (QWERTY_LEFT_OFFSET * density),
- (int) (QWERTY_TOP_OFFSET * density),
- (int) (QWERTY_RIGHT_OFFSET * density),
- (int) (QWERTY_BOTTOM_OFFSET * density),
- (int) (skinType.qwertyKeyRoundRadius * density),
- skinType.qwertyLayoutPressedFunctionKeyTopColor,
- skinType.qwertyLayoutPressedFunctionKeyBottomColor,
- skinType.qwertyLayoutPressedFunctionKeyHighlightColor,
- skinType.qwertyLayoutPressedFunctionKeyShadowColor),
- new RoundRectKeyDrawable(
- (int) (QWERTY_LEFT_OFFSET * density),
- (int) (QWERTY_TOP_OFFSET * density),
- (int) (QWERTY_RIGHT_OFFSET * density),
- (int) (QWERTY_BOTTOM_OFFSET * density),
- (int) (skinType.qwertyKeyRoundRadius * density),
- skinType.qwertyLayoutReleasedFunctionKeyTopColor,
- skinType.qwertyLayoutReleasedFunctionKeyBottomColor,
- skinType.qwertyLayoutReleasedFunctionKeyHighlightColor,
- skinType.qwertyLayoutReleasedFunctionKeyShadowColor));
+ (int) (skin.qwertyLeftOffsetDimension),
+ (int) (skin.qwertyTopOffsetDimension),
+ (int) (skin.qwertyRightOffsetDimension),
+ (int) (skin.qwertyBottomOffsetDimension),
+ (int) (skin.qwertyRoundRadiusDimension),
+ skin.qwertyLayoutPressedFunctionKeyTopColor,
+ skin.qwertyLayoutPressedFunctionKeyBottomColor,
+ skin.qwertyLayoutPressedFunctionKeyHighlightColor,
+ skin.qwertyLayoutPressedFunctionKeyShadowColor),
+ Optional.<Drawable>of(new RoundRectKeyDrawable(
+ (int) (skin.qwertyLeftOffsetDimension),
+ (int) (skin.qwertyTopOffsetDimension),
+ (int) (skin.qwertyRightOffsetDimension),
+ (int) (skin.qwertyBottomOffsetDimension),
+ (int) (skin.qwertyRoundRadiusDimension),
+ skin.qwertyLayoutReleasedFunctionKeyTopColor,
+ skin.qwertyLayoutReleasedFunctionKeyBottomColor,
+ skin.qwertyLayoutReleasedFunctionKeyHighlightColor,
+ skin.qwertyLayoutReleasedFunctionKeyShadowColor)));
case QWERTY_FUNCTION_KEY_BACKGROUND_WITH_THREEDOTS:
return new LayerDrawable(new Drawable[] {
createPressableDrawable(
new RoundRectKeyDrawable(
- (int) (QWERTY_LEFT_OFFSET * density),
- (int) (QWERTY_TOP_OFFSET * density),
- (int) (QWERTY_RIGHT_OFFSET * density),
- (int) (QWERTY_BOTTOM_OFFSET * density),
- (int) (skinType.qwertyKeyRoundRadius * density),
- skinType.qwertyLayoutPressedFunctionKeyTopColor,
- skinType.qwertyLayoutPressedFunctionKeyBottomColor,
- skinType.qwertyLayoutPressedFunctionKeyHighlightColor,
- skinType.qwertyLayoutPressedFunctionKeyShadowColor),
- new RoundRectKeyDrawable(
- (int) (QWERTY_LEFT_OFFSET * density),
- (int) (QWERTY_TOP_OFFSET * density),
- (int) (QWERTY_RIGHT_OFFSET * density),
- (int) (QWERTY_BOTTOM_OFFSET * density),
- (int) (skinType.qwertyKeyRoundRadius * density),
- skinType.qwertyLayoutReleasedFunctionKeyTopColor,
- skinType.qwertyLayoutReleasedFunctionKeyBottomColor,
- skinType.qwertyLayoutReleasedFunctionKeyHighlightColor,
- skinType.qwertyLayoutReleasedFunctionKeyShadowColor)),
+ (int) (skin.qwertyLeftOffsetDimension),
+ (int) (skin.qwertyTopOffsetDimension),
+ (int) (skin.qwertyRightOffsetDimension),
+ (int) (skin.qwertyBottomOffsetDimension),
+ (int) (skin.qwertyRoundRadiusDimension),
+ skin.qwertyLayoutPressedFunctionKeyTopColor,
+ skin.qwertyLayoutPressedFunctionKeyBottomColor,
+ skin.qwertyLayoutPressedFunctionKeyHighlightColor,
+ skin.qwertyLayoutPressedFunctionKeyShadowColor),
+ Optional.<Drawable>of(new RoundRectKeyDrawable(
+ (int) (skin.qwertyLeftOffsetDimension),
+ (int) (skin.qwertyTopOffsetDimension),
+ (int) (skin.qwertyRightOffsetDimension),
+ (int) (skin.qwertyBottomOffsetDimension),
+ (int) (skin.qwertyRoundRadiusDimension),
+ skin.qwertyLayoutReleasedFunctionKeyTopColor,
+ skin.qwertyLayoutReleasedFunctionKeyBottomColor,
+ skin.qwertyLayoutReleasedFunctionKeyHighlightColor,
+ skin.qwertyLayoutReleasedFunctionKeyShadowColor))),
new ThreeDotsIconDrawable(
- (int) ((QWERTY_BOTTOM_OFFSET + QWERTY_THREEDOTS_BOTTOM_OFFSET) * density),
- (int) ((QWERTY_RIGHT_OFFSET + QWERTY_THREEDOTS_RIGHT_OFFSET) * density),
- skinType.threeDotsColor,
+ (int) (skin.qwertyBottomOffsetDimension
+ + (QWERTY_THREEDOTS_BOTTOM_OFFSET * density)),
+ (int) (skin.qwertyRightOffsetDimension
+ + (QWERTY_THREEDOTS_RIGHT_OFFSET * density)),
+ skin.threeDotsColor,
(int) (QWERTY_THREEDOTS_WIDTH * density),
(int) (QWERTY_THREEDOTS_SPAN * density))});
- case QWERTY_FUNCTION_KEY_LIGHT_ON_BACKGROUND:
+ case QWERTY_FUNCTION_KEY_SPACE_WITH_THREEDOTS:
return new LayerDrawable(new Drawable[] {
createPressableDrawable(
- new RoundRectKeyDrawable(
- (int) (QWERTY_LEFT_OFFSET * density),
- (int) (QWERTY_TOP_OFFSET * density),
- (int) (QWERTY_RIGHT_OFFSET * density),
- (int) (QWERTY_BOTTOM_OFFSET * density),
- (int) (skinType.qwertyKeyRoundRadius * density),
- skinType.qwertyLayoutPressedFunctionKeyTopColor,
- skinType.qwertyLayoutPressedFunctionKeyBottomColor,
- skinType.qwertyLayoutPressedFunctionKeyHighlightColor,
- skinType.qwertyLayoutPressedFunctionKeyShadowColor),
- new RoundRectKeyDrawable(
- (int) (QWERTY_LEFT_OFFSET * density),
- (int) (QWERTY_TOP_OFFSET * density),
- (int) (QWERTY_RIGHT_OFFSET * density),
- (int) (QWERTY_BOTTOM_OFFSET * density),
- (int) (skinType.qwertyKeyRoundRadius * density),
- skinType.qwertyLayoutReleasedFunctionKeyTopColor,
- skinType.qwertyLayoutReleasedFunctionKeyBottomColor,
- skinType.qwertyLayoutReleasedFunctionKeyHighlightColor,
- skinType.qwertyLayoutReleasedFunctionKeyShadowColor)),
- new LightIconDrawable(
- (int) ((QWERTY_TOP_OFFSET + QWERTY_LIGHT_TOP_OFFSET + QWERTY_LIGHT_RADIUS)
- * density),
- (int) ((QWERTY_RIGHT_OFFSET + QWERTY_LIGHT_RIGHT_OFFSET + QWERTY_LIGHT_RADIUS)
- * density),
- skinType.qwertyLightOnSignLightColor,
- skinType.qwertyLightOnSignDarkColor,
- skinType.qwertyLightOnSignShadeColor,
- (int) (QWERTY_LIGHT_RADIUS * density))
- });
+ new QwertySpaceKeyDrawable(
+ (int) (skin.qwertySpaceKeyHeightDimension),
+ (int) (skin.qwertySpaceKeyHorizontalOffsetDimension),
+ (int) (skin.qwertyTopOffsetDimension),
+ (int) (skin.qwertySpaceKeyHorizontalOffsetDimension),
+ (int) (skin.qwertyBottomOffsetDimension),
+ (int) (skin.qwertySpaceKeyRoundRadiusDimension),
+ skin.qwertyLayoutPressedSpaceKeyTopColor,
+ skin.qwertyLayoutPressedSpaceKeyBottomColor,
+ skin.qwertyLayoutPressedSpaceKeyHighlightColor,
+ skin.qwertyLayoutPressedSpaceKeyShadowColor),
+ Optional.<Drawable>of(new QwertySpaceKeyDrawable(
+ (int) (skin.qwertySpaceKeyHeightDimension),
+ (int) (skin.qwertySpaceKeyHorizontalOffsetDimension),
+ (int) (skin.qwertyTopOffsetDimension),
+ (int) (skin.qwertySpaceKeyHorizontalOffsetDimension),
+ (int) (skin.qwertyBottomOffsetDimension),
+ (int) (skin.qwertySpaceKeyRoundRadiusDimension),
+ skin.qwertyLayoutReleasedSpaceKeyTopColor,
+ skin.qwertyLayoutReleasedSpaceKeyBottomColor,
+ skin.qwertyLayoutReleasedSpaceKeyHighlightColor,
+ skin.qwertyLayoutReleasedSpaceKeyShadowColor))),
+ new ThreeDotsIconDrawable(
+ (int) (skin.qwertyBottomOffsetDimension
+ + (QWERTY_THREEDOTS_BOTTOM_OFFSET * density)),
+ (int) (skin.qwertySpaceKeyHorizontalOffsetDimension
+ + (QWERTY_THREEDOTS_RIGHT_OFFSET * density)),
+ skin.threeDotsColor,
+ (int) (QWERTY_THREEDOTS_WIDTH * density),
+ (int) (QWERTY_THREEDOTS_SPAN * density))});
- case QWERTY_FUNCTION_KEY_LIGHT_OFF_BACKGROUND:
- return new LayerDrawable(new Drawable[] {
- createPressableDrawable(
- new RoundRectKeyDrawable(
- (int) (QWERTY_LEFT_OFFSET * density),
- (int) (QWERTY_TOP_OFFSET * density),
- (int) (QWERTY_RIGHT_OFFSET * density),
- (int) (QWERTY_BOTTOM_OFFSET * density),
- (int) (skinType.qwertyKeyRoundRadius * density),
- skinType.qwertyLayoutPressedFunctionKeyTopColor,
- skinType.qwertyLayoutPressedFunctionKeyBottomColor,
- skinType.qwertyLayoutPressedFunctionKeyHighlightColor,
- skinType.qwertyLayoutPressedFunctionKeyShadowColor),
- new RoundRectKeyDrawable(
- (int) (QWERTY_LEFT_OFFSET * density),
- (int) (QWERTY_TOP_OFFSET * density),
- (int) (QWERTY_RIGHT_OFFSET * density),
- (int) (QWERTY_BOTTOM_OFFSET * density),
- (int) (skinType.qwertyKeyRoundRadius * density),
- skinType.qwertyLayoutReleasedFunctionKeyTopColor,
- skinType.qwertyLayoutReleasedFunctionKeyBottomColor,
- skinType.qwertyLayoutReleasedFunctionKeyHighlightColor,
- skinType.qwertyLayoutReleasedFunctionKeyShadowColor)),
- new LightIconDrawable(
- (int) ((QWERTY_TOP_OFFSET + QWERTY_LIGHT_TOP_OFFSET + QWERTY_LIGHT_RADIUS)
- * density),
- (int) ((QWERTY_RIGHT_OFFSET + QWERTY_LIGHT_RIGHT_OFFSET + QWERTY_LIGHT_RADIUS)
- * density),
- skinType.qwertyLightOffSignLightColor,
- skinType.qwertyLightOffSignDarkColor,
- skinType.qwertyLightOffSignShadeColor,
- (int) (QWERTY_LIGHT_RADIUS * density))
- });
+ case KEYBOARD_SEPARATOR_TOP:
+ return new InsetDrawable(
+ new ColorDrawable(skin.keyboardSeparatorColor), 0,
+ resources.getDimensionPixelSize(R.dimen.keyboard_separator_padding),
+ 0, 0);
+
+ case KEYBOARD_SEPARATOR_CENTER:
+ return new ColorDrawable(skin.keyboardSeparatorColor);
+
+ case KEYBOARD_SEPARATOR_BOTTOM:
+ return new InsetDrawable(
+ new ColorDrawable(skin.keyboardSeparatorColor), 0, 0, 0,
+ resources.getDimensionPixelSize(R.dimen.keyboard_separator_padding));
+
+ case TRNASPARENT:
+ return DummyDrawable.getInstance();
case TWELVEKEYS_CENTER_FLICK:
return new CenterCircularHighlightDrawable(
- (int) (TWELVEKEYS_LEFT_OFFSET * density),
- (int) (TWELVEKEYS_TOP_OFFSET * density),
- (int) (TWELVEKEYS_RIGHT_OFFSET * density),
- (int) (TWELVEKEYS_BOTTOM_OFFSET * density),
- skinType.flickBaseColor,
- skinType.flickShadeColor);
+ (int) (skin.twelvekeysLeftOffsetDimension),
+ (int) (skin.twelvekeysTopOffsetDimension),
+ (int) (skin.twelvekeysRightOffsetDimension),
+ (int) (skin.twelvekeysBottomOffsetDimension),
+ skin.flickBaseColor,
+ skin.flickShadeColor);
case TWELVEKEYS_LEFT_FLICK:
return new TriangularHighlightDrawable(
- (int) (TWELVEKEYS_LEFT_OFFSET * density),
- (int) (TWELVEKEYS_TOP_OFFSET * density),
- (int) (TWELVEKEYS_RIGHT_OFFSET * density),
- (int) (TWELVEKEYS_BOTTOM_OFFSET * density),
- skinType.flickBaseColor,
- skinType.flickShadeColor,
+ (int) (skin.twelvekeysLeftOffsetDimension),
+ (int) (skin.twelvekeysTopOffsetDimension),
+ (int) (skin.twelvekeysRightOffsetDimension),
+ (int) (skin.twelvekeysBottomOffsetDimension),
+ skin.flickBaseColor,
+ skin.flickShadeColor,
HighlightDirection.LEFT);
case TWELVEKEYS_UP_FLICK:
return new TriangularHighlightDrawable(
- (int) (TWELVEKEYS_LEFT_OFFSET * density),
- (int) (TWELVEKEYS_TOP_OFFSET * density),
- (int) (TWELVEKEYS_RIGHT_OFFSET * density),
- (int) (TWELVEKEYS_BOTTOM_OFFSET * density),
- skinType.flickBaseColor,
- skinType.flickShadeColor,
+ (int) (skin.twelvekeysLeftOffsetDimension),
+ (int) (skin.twelvekeysTopOffsetDimension),
+ (int) (skin.twelvekeysRightOffsetDimension),
+ (int) (skin.twelvekeysBottomOffsetDimension),
+ skin.flickBaseColor,
+ skin.flickShadeColor,
HighlightDirection.UP);
case TWELVEKEYS_RIGHT_FLICK:
return new TriangularHighlightDrawable(
- (int) (TWELVEKEYS_LEFT_OFFSET * density),
- (int) (TWELVEKEYS_TOP_OFFSET * density),
- (int) (TWELVEKEYS_RIGHT_OFFSET * density),
- (int) (TWELVEKEYS_BOTTOM_OFFSET * density),
- skinType.flickBaseColor,
- skinType.flickShadeColor,
+ (int) (skin.twelvekeysLeftOffsetDimension),
+ (int) (skin.twelvekeysTopOffsetDimension),
+ (int) (skin.twelvekeysRightOffsetDimension),
+ (int) (skin.twelvekeysBottomOffsetDimension),
+ skin.flickBaseColor,
+ skin.flickShadeColor,
HighlightDirection.RIGHT);
case TWELVEKEYS_DOWN_FLICK:
return new TriangularHighlightDrawable(
- (int) (TWELVEKEYS_LEFT_OFFSET * density),
- (int) (TWELVEKEYS_TOP_OFFSET * density),
- (int) (TWELVEKEYS_RIGHT_OFFSET * density),
- (int) (TWELVEKEYS_BOTTOM_OFFSET * density),
- skinType.flickBaseColor,
- skinType.flickShadeColor,
+ (int) (skin.twelvekeysLeftOffsetDimension),
+ (int) (skin.twelvekeysTopOffsetDimension),
+ (int) (skin.twelvekeysRightOffsetDimension),
+ (int) (skin.twelvekeysBottomOffsetDimension),
+ skin.flickBaseColor,
+ skin.flickShadeColor,
HighlightDirection.DOWN);
case POPUP_BACKGROUND_WINDOW:
- // TODO(hidehiko): add a flag to control popup style in SkinType.
- return skinType == SkinType.ORANGE_LIGHTGRAY
- ? new PopUpFrameWindowDrawable(
- (int) (POPUP_WINDOW_PADDING * density),
- (int) (POPUP_WINDOW_PADDING * density),
- (int) (POPUP_WINDOW_PADDING * density),
- (int) (POPUP_WINDOW_PADDING * density),
- (int) (POPUP_FRAME_BORDER_WIDTH * density),
- POPUP_SHADOW_SIZE * density,
- skinType.popupFrameWindowTopColor,
- skinType.popupFrameWindowBottomColor,
- skinType.popupFrameWindowBorderColor,
- skinType.popupFrameWindowInnerPaneColor)
- : new RoundRectKeyDrawable(
- (int) (POPUP_WINDOW_PADDING * density),
- (int) (POPUP_WINDOW_PADDING * density),
- (int) (POPUP_WINDOW_PADDING * density),
- (int) (POPUP_WINDOW_PADDING * density),
- (int) (skinType.qwertyKeyRoundRadius * density),
- skinType.popupFrameWindowTopColor,
- skinType.popupFrameWindowBottomColor,
- 0, // No highlight.
- skinType.popupFrameWindowShadowColor);
+ return
+ new RoundRectKeyDrawable(
+ (int) (POPUP_WINDOW_PADDING * density),
+ (int) (POPUP_WINDOW_PADDING * density),
+ (int) (POPUP_WINDOW_PADDING * density),
+ (int) (POPUP_WINDOW_PADDING * density),
+ (int) (skin.qwertyRoundRadiusDimension),
+ skin.popupFrameWindowTopColor,
+ skin.popupFrameWindowBottomColor,
+ 0, // No highlight.
+ skin.popupFrameWindowShadowColor);
+
case CANDIDATE_BACKGROUND:
return createFocusableDrawable(
new CandidateBackgroundFocusedDrawable(
@@ -471,18 +444,19 @@
(int) (CANDIDATE_BACKGROUND_PADDING * density),
(int) (CANDIDATE_BACKGROUND_PADDING * density),
(int) (CANDIDATE_BACKGROUND_PADDING * density),
- skinType.candidateBackgroundFocusedTopColor,
- skinType.candidateBackgroundFocusedBottomColor,
- skinType.candidateBackgroundFocusedShadowColor),
- new CandidateBackgroundDrawable(
+ skin.candidateBackgroundFocusedTopColor,
+ skin.candidateBackgroundFocusedBottomColor,
+ skin.candidateBackgroundFocusedShadowColor),
+ Optional.<Drawable>of(new CandidateBackgroundDrawable(
(int) (CANDIDATE_BACKGROUND_PADDING * density),
(int) (CANDIDATE_BACKGROUND_PADDING * density),
(int) (CANDIDATE_BACKGROUND_PADDING * density),
(int) (CANDIDATE_BACKGROUND_PADDING * density),
- skinType.candidateBackgroundTopColor,
- skinType.candidateBackgroundBottomColor,
- skinType.candidateBackgroundHighlightColor,
- skinType.candidateBackgroundBorderColor));
+ skin.candidateBackgroundTopColor,
+ skin.candidateBackgroundBottomColor,
+ skin.candidateBackgroundHighlightColor,
+ skin.candidateBackgroundBorderColor)));
+
case SYMBOL_CANDIDATE_BACKGROUND:
return createFocusableDrawable(
new CandidateBackgroundFocusedDrawable(
@@ -490,18 +464,18 @@
(int) (SYMBOL_CANDIDATE_BACKGROUND_PADDING * density),
(int) (SYMBOL_CANDIDATE_BACKGROUND_PADDING * density),
(int) (SYMBOL_CANDIDATE_BACKGROUND_PADDING * density),
- skinType.candidateBackgroundFocusedTopColor,
- skinType.candidateBackgroundFocusedBottomColor,
- skinType.candidateBackgroundFocusedShadowColor),
- new CandidateBackgroundDrawable(
+ skin.candidateBackgroundFocusedTopColor,
+ skin.candidateBackgroundFocusedBottomColor,
+ skin.candidateBackgroundFocusedShadowColor),
+ Optional.<Drawable>of(new CandidateBackgroundDrawable(
(int) (SYMBOL_CANDIDATE_BACKGROUND_PADDING * density),
(int) (SYMBOL_CANDIDATE_BACKGROUND_PADDING * density),
(int) (SYMBOL_CANDIDATE_BACKGROUND_PADDING * density),
(int) (SYMBOL_CANDIDATE_BACKGROUND_PADDING * density),
- skinType.symbolCandidateBackgroundTopColor,
- skinType.symbolCandidateBackgroundBottomColor,
- skinType.symbolCandidateBackgroundHighlightColor,
- skinType.symbolCandidateBackgroundBorderColor));
+ skin.symbolCandidateBackgroundTopColor,
+ skin.symbolCandidateBackgroundBottomColor,
+ skin.symbolCandidateBackgroundHighlightColor,
+ skin.symbolCandidateBackgroundBorderColor)));
}
throw new IllegalArgumentException("Unknown drawable type: " + drawableType);
@@ -509,29 +483,32 @@
// TODO(hidehiko): Move this method to the somewhere in view package.
public static Drawable createPressableDrawable(
- Drawable pressedDrawable, Drawable releasedDrawable) {
+ Drawable pressedDrawable, Optional<Drawable> releasedDrawable) {
return createTwoStateDrawable(
- android.R.attr.state_pressed, pressedDrawable, releasedDrawable);
+ android.R.attr.state_pressed, Preconditions.checkNotNull(pressedDrawable),
+ Preconditions.checkNotNull(releasedDrawable));
}
public static Drawable createFocusableDrawable(
- Drawable focusedDrawable, Drawable unfocusedDrawable) {
+ Drawable focusedDrawable, Optional<Drawable> unfocusedDrawable) {
return createTwoStateDrawable(
- android.R.attr.state_focused, focusedDrawable, unfocusedDrawable);
+ android.R.attr.state_focused, Preconditions.checkNotNull(focusedDrawable),
+ Preconditions.checkNotNull(unfocusedDrawable));
}
public static Drawable createSelectableDrawable(
- Drawable selectedDrawable, Drawable unselectedDrawable) {
+ Drawable selectedDrawable, Optional<Drawable> unselectedDrawable) {
return createTwoStateDrawable(
- android.R.attr.state_selected, selectedDrawable, unselectedDrawable);
+ android.R.attr.state_selected, Preconditions.checkNotNull(selectedDrawable),
+ Preconditions.checkNotNull(unselectedDrawable));
}
private static Drawable createTwoStateDrawable(
- int state, Drawable enabledDrawable, Drawable disabledDrawable) {
+ int state, Drawable enabledDrawable, Optional<Drawable> disabledDrawable) {
StateListDrawable drawable = new StateListDrawable();
drawable.addState(new int[] { state }, enabledDrawable);
- if (disabledDrawable != null) {
- drawable.addState(EMPTY_STATE, disabledDrawable);
+ if (disabledDrawable.isPresent()) {
+ drawable.addState(EMPTY_STATE, disabledDrawable.get());
}
return drawable;
}
diff --git a/src/android/src/com/google/android/inputmethod/japanese/keyboard/Flick.java b/src/android/src/com/google/android/inputmethod/japanese/keyboard/Flick.java
index 3ca9dab..3fe183b 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/keyboard/Flick.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/keyboard/Flick.java
@@ -30,6 +30,7 @@
package org.mozc.android.inputmethod.japanese.keyboard;
import com.google.common.base.Objects;
+import com.google.common.base.Preconditions;
/**
* A class corresponding to {@code <Flick>} element in xml resource files.
@@ -61,15 +62,10 @@
private final Flick.Direction direction;
private final KeyEntity keyEntity;
+
public Flick(Direction direction, KeyEntity keyEntity) {
- if (direction == null) {
- throw new NullPointerException("direction shouldn't be null.");
- }
- if (keyEntity == null) {
- throw new NullPointerException("keyEntity shouldn't be null.");
- }
- this.direction = direction;
- this.keyEntity = keyEntity;
+ this.direction = Preconditions.checkNotNull(direction);
+ this.keyEntity = Preconditions.checkNotNull(keyEntity);
}
public Direction getDirection() {
diff --git a/src/android/src/com/google/android/inputmethod/japanese/keyboard/Key.java b/src/android/src/com/google/android/inputmethod/japanese/keyboard/Key.java
index d60590e..8e51588 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/keyboard/Key.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/keyboard/Key.java
@@ -29,6 +29,7 @@
package org.mozc.android.inputmethod.japanese.keyboard;
+import org.mozc.android.inputmethod.japanese.keyboard.BackgroundDrawableFactory.DrawableType;
import com.google.common.base.Objects;
import com.google.common.base.Objects.ToStringHelper;
import com.google.common.base.Optional;
@@ -57,7 +58,6 @@
* <li> {@code edgeFlags}: flags whether the key should stick to keyboard's boundary.
* <li> {@code isRepeatable}: whether the key long press cause a repeated key tapping.
* <li> {@code isModifier}: whether the key is modifier (e.g. shift key).
- * <li> {@code isSticky}: whether the key behaves sticky (e.g. caps lock).
* </ul>
*
* The {@code <Key>} element can have (at most) two {@code <KeyState>} elements.
@@ -86,16 +86,24 @@
private final int edgeFlags;
private final boolean isRepeatable;
private final boolean isModifier;
- private final boolean isSticky;
private final Stick stick;
// Default KeyState.
// Absent if this is a spacer.
private final Optional<KeyState> defaultKeyState;
+ private final DrawableType keyBackgroundDrawableType;
+
private final List<KeyState> keyStateList;
public Key(int x, int y, int width, int height, int horizontalGap,
- int edgeFlags, boolean isRepeatable, boolean isModifier, boolean isSticky,
- Stick stick, List<? extends KeyState> keyStateList) {
+ int edgeFlags, boolean isRepeatable, boolean isModifier,
+ Stick stick, DrawableType keyBackgroundDrawableType,
+ List<? extends KeyState> keyStateList) {
+ Preconditions.checkNotNull(stick);
+ Preconditions.checkNotNull(keyBackgroundDrawableType);
+ Preconditions.checkNotNull(keyStateList);
+ Preconditions.checkArgument(width >= 0);
+ Preconditions.checkArgument(height >= 0);
+
this.x = x;
this.y = y;
this.width = width;
@@ -104,28 +112,29 @@
this.edgeFlags = edgeFlags;
this.isRepeatable = isRepeatable;
this.isModifier = isModifier;
- this.isSticky = isSticky;
this.stick = stick;
+ this.keyBackgroundDrawableType = keyBackgroundDrawableType;
List<KeyState> tmpKeyStateList = null; // Lazy creation.
Optional<KeyState> defaultKeyState = Optional.absent();
for (KeyState keyState : keyStateList) {
Set<KeyState.MetaState> metaStateSet = keyState.getMetaStateSet();
- if (metaStateSet.isEmpty()) {
+ if (metaStateSet.isEmpty() || metaStateSet.contains(KeyState.MetaState.FALLBACK)) {
if (defaultKeyState.isPresent()) {
throw new IllegalArgumentException("Found duplicate default meta state");
}
defaultKeyState = Optional.of(keyState);
- continue;
+ if (metaStateSet.size() <= 1) { // metaStateSet contains only FALLBACK
+ continue;
+ }
}
if (tmpKeyStateList == null) {
tmpKeyStateList = new ArrayList<KeyState>();
}
tmpKeyStateList.add(keyState);
}
- if (!defaultKeyState.isPresent() && tmpKeyStateList != null) {
- throw new IllegalArgumentException("Default KeyState is mandatory for non-spacer.");
- }
+ Preconditions.checkArgument(defaultKeyState.isPresent() || tmpKeyStateList == null,
+ "Default KeyState is mandatory for non-spacer.");
this.defaultKeyState = defaultKeyState;
this.keyStateList = tmpKeyStateList == null
? Collections.<KeyState>emptyList()
@@ -164,14 +173,14 @@
return isModifier;
}
- public boolean isSticky() {
- return isSticky;
- }
-
public Stick getStick() {
return stick;
}
+ public DrawableType getKeyBackgroundDrawableType() {
+ return keyBackgroundDrawableType;
+ }
+
/**
* Returns {@code KeyState} at least one of which the metaState is in given {@code metaStates}.
* <p>
diff --git a/src/android/src/com/google/android/inputmethod/japanese/keyboard/KeyEntity.java b/src/android/src/com/google/android/inputmethod/japanese/keyboard/KeyEntity.java
index 9da4629..5184f09 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/keyboard/KeyEntity.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/keyboard/KeyEntity.java
@@ -29,8 +29,9 @@
package org.mozc.android.inputmethod.japanese.keyboard;
-import org.mozc.android.inputmethod.japanese.keyboard.BackgroundDrawableFactory.DrawableType;
import com.google.common.base.Objects;
+import com.google.common.base.Optional;
+import com.google.common.base.Preconditions;
/**
* A class corresponding to a {@code <KeyEntity>} element in xml resource files.
@@ -39,45 +40,43 @@
*
*/
public class KeyEntity {
+
/** INVALID_KEY_CODE represents the key has no key code to call the Mozc server back. */
public static final int INVALID_KEY_CODE = Integer.MIN_VALUE;
private final int sourceId;
private final int keyCode;
private final int longPressKeyCode;
+ private final boolean longPressTimeoutTrigger;
private final int keyIconResourceId;
// If |keyIconResourceId| is empty and |keyCharacter| is set,
// use this character for rendering key top.
// TODO(team): Implement rendering method.
- private final String keyCharacter;
- // TODO(hidehiko): Move this field to Key.
- private final DrawableType keyBackgroundDrawableType;
+ private final Optional<String> keyCharacter;
private final boolean flickHighlightEnabled;
- private final PopUp popUp;
-
- // Constructor for compatibility.
- // TODO(team): Remove this constructor after changing all callers including tests.
- public KeyEntity(int sourceId, int keyCode, int longPressKeyCode,
- int keyIconResourceId,
- DrawableType keyBackgroundDrawableType,
- boolean flickHighlightEnabled, PopUp popUp) {
- this(
- sourceId, keyCode, longPressKeyCode, keyIconResourceId, null, keyBackgroundDrawableType,
- flickHighlightEnabled, popUp);
- }
+ private final Optional<PopUp> popUp;
+ private final int horizontalPadding;
+ private final int verticalPadding;
+ private final int iconWidth;
+ private final int iconHeight;
public KeyEntity(int sourceId, int keyCode, int longPressKeyCode,
- int keyIconResourceId, String keyCharacter,
- DrawableType keyBackgroundDrawableType,
- boolean flickHighlightEnabled, PopUp popUp) {
+ boolean longPressTimeoutTrigger, int keyIconResourceId,
+ Optional<String> keyCharacter, boolean flickHighlightEnabled,
+ Optional<PopUp> popUp, int horizontalPadding, int verticalPadding,
+ int iconWidth, int iconHeight) {
this.sourceId = sourceId;
this.keyCode = keyCode;
this.longPressKeyCode = longPressKeyCode;
+ this.longPressTimeoutTrigger = longPressTimeoutTrigger;
this.keyIconResourceId = keyIconResourceId;
- this.keyCharacter = keyCharacter;
- this.keyBackgroundDrawableType = keyBackgroundDrawableType;
+ this.keyCharacter = Preconditions.checkNotNull(keyCharacter);
this.flickHighlightEnabled = flickHighlightEnabled;
- this.popUp = popUp;
+ this.popUp = Preconditions.checkNotNull(popUp);
+ this.horizontalPadding = horizontalPadding;
+ this.verticalPadding = verticalPadding;
+ this.iconWidth = iconWidth;
+ this.iconHeight = iconHeight;
}
public int getSourceId() {
@@ -92,34 +91,55 @@
return longPressKeyCode;
}
+ public boolean isLongPressTimeoutTrigger() {
+ return longPressTimeoutTrigger;
+ }
+
public int getKeyIconResourceId() {
return keyIconResourceId;
}
- public String getKeyCharacter() {
+ public Optional<String> getKeyCharacter() {
return keyCharacter;
}
- public DrawableType getKeyBackgroundDrawableType() {
- return keyBackgroundDrawableType;
- }
-
public boolean isFlickHighlightEnabled() {
return flickHighlightEnabled;
}
- public PopUp getPopUp() {
+ public Optional<PopUp> getPopUp() {
return popUp;
}
+ public int getHorizontalPadding() {
+ return horizontalPadding;
+ }
+
+ public int getVerticalPadding() {
+ return verticalPadding;
+ }
+
+ public int getIconWidth() {
+ return iconWidth;
+ }
+
+ public int getIconHeight() {
+ return iconHeight;
+ }
+
@Override
public String toString() {
return Objects.toStringHelper(this)
.add("sourceId", sourceId)
.add("keyCode", keyCode)
.add("longPressKeyCode", longPressKeyCode)
+ .add("longPressTimeoutTrigger", longPressTimeoutTrigger)
.add("keyIconResourceId", keyIconResourceId)
.add("keyCharacter", keyCharacter)
+ .add("horizontalPadding", horizontalPadding)
+ .add("verticalPadding", verticalPadding)
+ .add("iconWidth", iconWidth)
+ .add("iconHeight", iconHeight)
.toString();
}
}
diff --git a/src/android/src/com/google/android/inputmethod/japanese/keyboard/KeyEventContext.java b/src/android/src/com/google/android/inputmethod/japanese/keyboard/KeyEventContext.java
index a8947d9..02c3b6c 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/keyboard/KeyEventContext.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/keyboard/KeyEventContext.java
@@ -39,8 +39,6 @@
import java.util.Set;
-import javax.annotation.Nullable;
-
/**
* This class represents user's one action, e.g., the sequence of:
* press -> move -> move -> ... -> move -> release.
@@ -49,8 +47,8 @@
* E.g. for user's two finger strokes, two instances will be instantiated.
*
*/
-// TODO(matsuzakit): Get rid of @Nullable.
public class KeyEventContext {
+
final Key key;
final int pointerId;
private final float pressedX;
@@ -62,7 +60,7 @@
// TODO(hidehiko): Move logging code to an upper layer, e.g., MozcService or ViewManager etc.
// after refactoring the architecture.
- private TouchAction lastAction = null;
+ private Optional<TouchAction> lastAction = Optional.absent();
private float lastX;
private float lastY;
private long lastTimestamp;
@@ -70,7 +68,9 @@
private final int keyboardHeight;
// This variable will be updated in the callback of long press key event (if necessary).
- boolean longPressSent = false;
+ boolean pastLongPressSentTimeout = false;
+
+ Optional<Runnable> longPressCallback = Optional.absent();
public KeyEventContext(Key key, int pointerId, float pressedX, float pressedY,
int keyboardWidth, int keyboardHeight,
@@ -95,9 +95,8 @@
/**
* Returns true iff the point ({@code x}, {@code y}) is contained by the {@code key}'s region.
- * This is package private for testing purpose.
*/
- static boolean isContained(float x, float y, Key key) {
+ @VisibleForTesting static boolean isContained(float x, float y, Key key) {
float relativeX = x - key.getX();
float relativeY = y - key.getY();
return 0 <= relativeX && relativeX < key.getWidth() &&
@@ -117,75 +116,82 @@
return false;
}
KeyState keyState = optionalKeyState.get();
- return keyState.getFlick(Flick.Direction.LEFT) != null ||
- keyState.getFlick(Flick.Direction.UP) != null ||
- keyState.getFlick(Flick.Direction.RIGHT) != null ||
- keyState.getFlick(Flick.Direction.DOWN) != null;
+ return keyState.getFlick(Flick.Direction.LEFT).isPresent() ||
+ keyState.getFlick(Flick.Direction.UP).isPresent() ||
+ keyState.getFlick(Flick.Direction.RIGHT).isPresent() ||
+ keyState.getFlick(Flick.Direction.DOWN).isPresent();
}
/**
* Returns the key entity corresponding to {@code metaState} and {@code direction}.
*/
- @Nullable
- public static KeyEntity getKeyEntity(Key key, Set<MetaState> metaState,
- @Nullable Flick.Direction direction) {
+ public static Optional<KeyEntity> getKeyEntity(Key key, Set<MetaState> metaState,
+ Optional<Flick.Direction> direction) {
Preconditions.checkNotNull(key);
Preconditions.checkNotNull(metaState);
+ Preconditions.checkNotNull(direction);
if (key.isSpacer()) {
- return null;
+ return Optional.absent();
}
// Key is not spacer for at least one KeyState is available.
- return getKeyEntityInternal(key.getKeyState(metaState).get(), direction).orNull();
+ return getKeyEntityInternal(key.getKeyState(metaState).get(), direction);
}
private Optional<KeyEntity> getKeyEntity(Flick.Direction direction) {
return keyState.isPresent()
- ? getKeyEntityInternal(keyState.get(), direction)
+ ? getKeyEntityInternal(keyState.get(), Optional.of(direction))
: Optional.<KeyEntity>absent();
}
private static Optional<KeyEntity> getKeyEntityInternal(KeyState keyState,
- @Nullable Flick.Direction direction) {
+ Optional<Flick.Direction> direction) {
Preconditions.checkNotNull(keyState);
+ Preconditions.checkNotNull(direction);
- if (direction == null) {
+ if (!direction.isPresent()) {
return Optional.absent();
}
- Flick flick = keyState.getFlick(direction);
- return flick == null ? Optional.<KeyEntity>absent() : Optional.of(flick.getKeyEntity());
+ Optional<Flick> flick = keyState.getFlick(direction.get());
+ return flick.isPresent()
+ ? Optional.of(flick.get().getKeyEntity())
+ : Optional.<KeyEntity>absent();
}
/**
* Returns the key code to be sent via {@link KeyboardActionListener#onKey(int, java.util.List)}.
+ * <p>
+ * If {@code keyEntyty} doesn't trigger longpress by timeout (isLongPressTimeoutTrigger is false),
+ * the result depends on the timestamp of touch-down event.
*/
public int getKeyCode() {
- if (longPressSent) {
+ Optional<KeyEntity> keyEntity = getKeyEntity(flickDirection);
+ if (!keyEntity.isPresent()
+ || (pastLongPressSentTimeout && keyEntity.get().isLongPressTimeoutTrigger())) {
// If the long-press-key event is already sent, just return INVALID_KEY_CODE.
return KeyEntity.INVALID_KEY_CODE;
}
-
- Optional<KeyEntity> keyEntity = getKeyEntity(flickDirection);
- return keyEntity.isPresent()
- ? keyEntity.get().getKeyCode()
- : KeyEntity.INVALID_KEY_CODE;
+ return !keyEntity.get().isLongPressTimeoutTrigger()
+ && keyEntity.get().getLongPressKeyCode() != KeyEntity.INVALID_KEY_CODE
+ && pastLongPressSentTimeout
+ ? keyEntity.get().getLongPressKeyCode() : keyEntity.get().getKeyCode();
}
Set<MetaState> getNextMetaStates(Set<MetaState> originalMetaStates) {
+ Preconditions.checkNotNull(originalMetaStates);
if (!key.isModifier() || key.isSpacer()) {
// Non-modifier key shouldn't change meta state.
return originalMetaStates;
}
- Set<MetaState> result = keyState.get().getNextMetaStates(originalMetaStates);
- return result;
+ return keyState.get().getNextMetaStates(originalMetaStates);
}
/**
* Returns the key code to be sent for long press event.
*/
int getLongPressKeyCode() {
- if (longPressSent) {
+ if (pastLongPressSentTimeout) {
// If the long-press-key event is already sent, just return INVALID_KEY_CODE.
return KeyEntity.INVALID_KEY_CODE;
}
@@ -197,6 +203,11 @@
: KeyEntity.INVALID_KEY_CODE;
}
+ boolean isLongPressTimeoutTrigger() {
+ Optional<KeyEntity> keyEntity = getKeyEntity(Flick.Direction.CENTER);
+ return !keyEntity.isPresent() || keyEntity.get().isLongPressTimeoutTrigger();
+ }
+
/**
* Returns the key code to be send via {@link KeyboardActionListener#onPress(int)} and
* {@link KeyboardActionListener#onRelease(int)}.
@@ -212,20 +223,20 @@
* Returns true if this key event sequence represents toggling meta state.
*/
boolean isMetaStateToggleEvent() {
- return !longPressSent && key.isModifier() && flickDirection == Flick.Direction.CENTER;
+ return !pastLongPressSentTimeout && key.isModifier()
+ && flickDirection == Flick.Direction.CENTER;
}
/**
* Returns the pop up data for the current state.
*/
- @Nullable
- PopUp getCurrentPopUp() {
- if (longPressSent) {
- return null;
+ Optional<PopUp> getCurrentPopUp() {
+ if (pastLongPressSentTimeout) {
+ return Optional.absent();
}
Optional<KeyEntity> keyEntity = getKeyEntity(flickDirection);
- return keyEntity.isPresent() ? keyEntity.get().getPopUp() : null;
+ return keyEntity.isPresent() ? keyEntity.get().getPopUp() : Optional.<PopUp>absent();
}
/**
@@ -234,8 +245,9 @@
* @return {@code true} if the internal state is actually updated.
*/
public boolean update(float x, float y, TouchAction touchAction, long timestamp) {
+ lastAction = Optional.of(touchAction);
+
Flick.Direction originalDirection = flickDirection;
- lastAction = touchAction;
lastX = x;
lastY = y;
lastTimestamp = timestamp;
@@ -257,28 +269,41 @@
flickDirection = deltaX > 0 ? Flick.Direction.RIGHT : Flick.Direction.LEFT;
}
}
- return flickDirection != originalDirection;
+
+ if (flickDirection == originalDirection) {
+ return false;
+ } else {
+ // If flickDirection has been updated, reset pastLongPressSentTimeout flag
+ // so that long-press even can be sent again.
+ // This happens when
+ // [Hold 'q' key]
+ // -> [Popup '1' is shown as the result of long-press]
+ // -> [Flick outside to dismiss the popup]
+ // -> [Flick again to the center position and hold]
+ // -> [Popup '1' is shown again as the result of long-press]
+ pastLongPressSentTimeout = false;
+ return true;
+ }
}
/**
* @return {@code TouchEvent} instance which includes the stroke related to this context.
*/
- @Nullable
- public TouchEvent getTouchEvent() {
+ public Optional<TouchEvent> getTouchEvent() {
Optional<KeyEntity> keyEntity = getKeyEntity(flickDirection);
if (!keyEntity.isPresent()) {
- return null;
+ return Optional.absent();
}
TouchEvent.Builder builder = TouchEvent.newBuilder()
.setSourceId(keyEntity.get().getSourceId());
builder.addStroke(createTouchPosition(
TouchAction.TOUCH_DOWN, pressedX, pressedY, keyboardWidth, keyboardHeight, 0));
- if (lastAction != null) {
+ if (lastAction.isPresent()) {
builder.addStroke(createTouchPosition(
- lastAction, lastX, lastY, keyboardWidth, keyboardHeight, lastTimestamp));
+ lastAction.get(), lastX, lastY, keyboardWidth, keyboardHeight, lastTimestamp));
}
- return builder.build();
+ return Optional.of(builder.build());
}
public static TouchPosition createTouchPosition(
@@ -290,4 +315,8 @@
.setTimestamp(timestamp)
.build();
}
+
+ public void setLongPressCallback(Runnable longPressCallback) {
+ this.longPressCallback = Optional.of(longPressCallback);
+ }
}
diff --git a/src/android/src/com/google/android/inputmethod/japanese/keyboard/KeyEventHandler.java b/src/android/src/com/google/android/inputmethod/japanese/keyboard/KeyEventHandler.java
index 7d5c9fb..3ab306f 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/keyboard/KeyEventHandler.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/keyboard/KeyEventHandler.java
@@ -31,6 +31,7 @@
import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Input.TouchEvent;
import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Preconditions;
import android.os.Handler;
import android.os.Looper;
@@ -44,13 +45,13 @@
*
*/
public class KeyEventHandler implements Handler.Callback {
+
// A dummy argument which is passed to the callback's message.
private static final int DUMMY_ARG = 0;
// Keys to figure out what message is sent in the callback.
- // Package private for testing purpose.
- static final int REPEAT_KEY = 1;
- static final int LONG_PRESS_KEY = 2;
+ @VisibleForTesting static final int REPEAT_KEY = 1;
+ @VisibleForTesting static final int LONG_PRESS_KEY = 2;
@VisibleForTesting final Handler handler;
private final KeyboardActionListener keyboardActionListener;
@@ -67,14 +68,8 @@
public KeyEventHandler(
Looper looper, KeyboardActionListener keyboardActionListener,
int repeatKeyDelay, int repeatKeyInterval, int longPressKeyDelay) {
- if (looper == null) {
- throw new NullPointerException("looper is null.");
- }
- if (keyboardActionListener == null) {
- throw new NullPointerException("keyboardActionListener is null.");
- }
- this.handler = new Handler(looper, this);
- this.keyboardActionListener = keyboardActionListener;
+ this.handler = new Handler(Preconditions.checkNotNull(looper), this);
+ this.keyboardActionListener = Preconditions.checkNotNull(keyboardActionListener);
this.repeatKeyDelay = repeatKeyDelay;
this.repeatKeyInterval = repeatKeyInterval;
this.longPressKeyDelay = longPressKeyDelay;
@@ -82,25 +77,51 @@
@Override
public boolean handleMessage(Message message) {
- int keyCode = message.arg1;
KeyEventContext context = KeyEventContext.class.cast(message.obj);
- keyboardActionListener.onKey(keyCode, Collections.singletonList(context.getTouchEvent()));
-
switch (message.what) {
case REPEAT_KEY: {
- Message newMessage = handler.obtainMessage(REPEAT_KEY, keyCode, DUMMY_ARG, context);
- handler.sendMessageDelayed(newMessage, repeatKeyInterval);
+ handleMessageRepeatKey(context);
break;
}
case LONG_PRESS_KEY:
- // Set a flag that means long-press-key-event has been sent.
- context.longPressSent = true;
+ handleMessageLongPress(context);
break;
}
return true;
}
+ private void handleMessageRepeatKey(KeyEventContext context) {
+ int keyCode = context.getPressedKeyCode();
+ // TODO(hsumita): confirm that we can put null as a touch event or not.
+ keyboardActionListener.onKey(
+ keyCode, Collections.singletonList(context.getTouchEvent().orNull()));
+ Message newMessage = handler.obtainMessage(REPEAT_KEY, keyCode, DUMMY_ARG, context);
+ handler.sendMessageDelayed(newMessage, repeatKeyInterval);
+ }
+
+ /**
+ * Does the things which should be done when long-press operation is done.
+ * <p>
+ * This is public because this is called from KeyboardView directory in order to implement
+ * accessibility feature.
+ */
+ public void handleMessageLongPress(KeyEventContext context) {
+ int keyCode = context.getLongPressKeyCode();
+ if (context.isLongPressTimeoutTrigger()) {
+ // TODO(hsumita): confirm that we can put null as a touch event or not.
+ keyboardActionListener.onKey(
+ keyCode, Collections.singletonList(context.getTouchEvent().orNull()));
+ }
+ // Callback a function if present then flip the flag for long-press timeout.
+ // If isLongPressTimeoutTrigger is true, key-code for long-press has already been sent.
+ // If false, touch-up event for the context will send long-press key code.
+ if (context.longPressCallback.isPresent()) {
+ context.longPressCallback.get().run();
+ }
+ context.pastLongPressSentTimeout = true;
+ }
+
public void sendPress(int keyCode) {
keyboardActionListener.onPress(keyCode);
}
@@ -109,7 +130,7 @@
keyboardActionListener.onRelease(keyCode);
}
- public void sendKey(int keyCode, List<? extends TouchEvent> touchEventList) {
+ public void sendKey(int keyCode, List<TouchEvent> touchEventList) {
keyboardActionListener.onKey(keyCode, touchEventList);
}
@@ -117,9 +138,8 @@
keyboardActionListener.onCancel();
}
- private void startDelayedKeyEventInternal(
- int what, int keyCode, KeyEventContext context, int delay) {
- Message message = handler.obtainMessage(what, keyCode, DUMMY_ARG, context);
+ private void startDelayedKeyEventInternal(int what, KeyEventContext context, int delay) {
+ Message message = handler.obtainMessage(what, DUMMY_ARG, DUMMY_ARG, context);
handler.sendMessageDelayed(message, delay);
}
@@ -128,16 +148,16 @@
* based on the given {@code context}.
*/
public void maybeStartDelayedKeyEvent(KeyEventContext context) {
- Key key = context.key;
+ Key key = Preconditions.checkNotNull(context).key;
if (key.isRepeatable()) {
int keyCode = context.getPressedKeyCode();
if (keyCode != KeyEntity.INVALID_KEY_CODE) {
- startDelayedKeyEventInternal(REPEAT_KEY, keyCode, context, repeatKeyDelay);
+ startDelayedKeyEventInternal(REPEAT_KEY, context, repeatKeyDelay);
}
} else {
int longPressKeyCode = context.getLongPressKeyCode();
if (longPressKeyCode != KeyEntity.INVALID_KEY_CODE) {
- startDelayedKeyEventInternal(LONG_PRESS_KEY, longPressKeyCode, context, longPressKeyDelay);
+ startDelayedKeyEventInternal(LONG_PRESS_KEY, context, longPressKeyDelay);
}
}
}
diff --git a/src/android/src/com/google/android/inputmethod/japanese/keyboard/KeyState.java b/src/android/src/com/google/android/inputmethod/japanese/keyboard/KeyState.java
index bcc55e9..81e488b 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/keyboard/KeyState.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/keyboard/KeyState.java
@@ -30,11 +30,13 @@
package org.mozc.android.inputmethod.japanese.keyboard;
import com.google.common.base.Objects;
+import com.google.common.base.Optional;
import com.google.common.base.Preconditions;
import com.google.common.collect.Sets;
import java.util.Arrays;
import java.util.Collection;
+import java.util.Collections;
import java.util.EnumMap;
import java.util.EnumSet;
import java.util.Map;
@@ -51,6 +53,7 @@
*
*/
public class KeyState {
+
public enum MetaState {
SHIFT(1, true),
CAPS_LOCK(2, false),
@@ -76,13 +79,22 @@
// TYPE_TEXT_VARIATION_WEB_EMAIL_ADDRESS, TYPE_TEXT_VARIATION_EMAIL_ADDRESS
VARIATION_EMAIL_ADDRESS(2048, false),
- // Set if Globe button is enabled by preference.
- // TODO(matsuzakit): Implement me.
+ // Set if Globe button should be offered.
+ // c.f., SubtypeImeSwitcher#shouldOfferSwitchingToNextInputMethod()
GLOBE(4096, false),
+ // !GLOBE
+ NO_GLOBE(8192, false),
// Set if there is composition string.
- // TODO(matsuzakit): Implement me. This is mandatory when implementing ACTION_*.
- COMPOSING(8192, false),
+ COMPOSING(16384, false),
+ // Set if the KeyboardView is handling at least one touch event.
+ HANDLING_TOUCH_EVENT(32768, false),
+
+ // DO NOT USE. Theoretically this is package private entry.
+ // "fallback" flag is useful when defining .xml file with logical-OR operator
+ // (e.g. "fallback|composing").
+ // This entry is used just for it.
+ FALLBACK(1073741824, false),
;
private final int bitFlag;
@@ -116,11 +128,17 @@
// MetaStates for text variations.
public static final Set<MetaState> VARIATION_EXCLUSIVE_GROUP =
Sets.immutableEnumSet(MetaState.VARIATION_URI, MetaState.VARIATION_EMAIL_ADDRESS);
+ // MetaStates for Globe icon.
+ public static final Set<MetaState> GLOBE_EXCLUSIVE_OR_GROUP =
+ Sets.immutableEnumSet(MetaState.GLOBE, MetaState.NO_GLOBE);
@SuppressWarnings("unchecked")
private static final Collection<Set<MetaState>> EXCLUSIVE_GROUP =
Arrays.<Set<MetaState>>asList(CHAR_TYPE_EXCLUSIVE_GROUP,
ACTION_EXCLUSIVE_GROUP,
- VARIATION_EXCLUSIVE_GROUP);
+ VARIATION_EXCLUSIVE_GROUP,
+ GLOBE_EXCLUSIVE_OR_GROUP);
+ private static final Collection<Set<MetaState>> OR_GROUP =
+ Collections.singleton(GLOBE_EXCLUSIVE_OR_GROUP);
/**
* Checks if {@code testee} is valid set.
@@ -129,6 +147,8 @@
* Do not call from chokepoint.
*/
public static boolean isValidSet(Set<MetaState> testee) {
+ Preconditions.checkNotNull(testee);
+
// Set#retainAll can make the implementation simpler, but it requires instantiation of
// (Enum)Set for each iteration.
for (Set<MetaState> exclusiveGroup : EXCLUSIVE_GROUP) {
@@ -142,6 +162,11 @@
}
}
}
+ for (Set<MetaState> orGroup : OR_GROUP) {
+ if (orGroup.isEmpty()) {
+ return false;
+ }
+ }
return true;
}
}
@@ -160,14 +185,13 @@
this.contentDescription = Preconditions.checkNotNull(contentDescription);
Preconditions.checkNotNull(metaStates);
this.metaState = Sets.newEnumSet(metaStates, MetaState.class);
- this.nextAddMetaStates = nextAddMetaStates;
- this.nextRemoveMetaStates = nextRemoveMetaStates;
+ this.nextAddMetaStates = Preconditions.checkNotNull(nextAddMetaStates);
+ this.nextRemoveMetaStates = Preconditions.checkNotNull(nextRemoveMetaStates);
this.flickMap = new EnumMap<Flick.Direction, Flick>(Flick.Direction.class);
- for (Flick flick : flickCollection) {
- if (this.flickMap.put(flick.getDirection(), flick) != null) {
- throw new IllegalArgumentException(
- "Duplicate flick direction is found: " + flick.getDirection());
- }
+ for (Flick flick : Preconditions.checkNotNull(flickCollection)) {
+ Preconditions.checkArgument(
+ this.flickMap.put(flick.getDirection(), flick) == null,
+ "Duplicate flick direction is found: " + flick.getDirection());
}
}
@@ -188,12 +212,12 @@
* The result is "valid" in the light of {@code MetaState#isValidSet(Set)}.
*/
public Set<MetaState> getNextMetaStates(Set<MetaState> originalMetaStates) {
- return Sets.union(Sets.difference(originalMetaStates,
+ return Sets.union(Sets.difference(Preconditions.checkNotNull(originalMetaStates),
nextRemoveMetaStates), nextAddMetaStates).immutableCopy();
}
- public Flick getFlick(Flick.Direction direction) {
- return flickMap.get(direction);
+ public Optional<Flick> getFlick(Flick.Direction direction) {
+ return Optional.fromNullable(flickMap.get(direction));
}
@Override
diff --git a/src/android/src/com/google/android/inputmethod/japanese/keyboard/Keyboard.java b/src/android/src/com/google/android/inputmethod/japanese/keyboard/Keyboard.java
index 50c8910..b12e1d9 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/keyboard/Keyboard.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/keyboard/Keyboard.java
@@ -29,9 +29,18 @@
package org.mozc.android.inputmethod.japanese.keyboard;
+import org.mozc.android.inputmethod.japanese.KeyboardSpecificationName;
+import org.mozc.android.inputmethod.japanese.keyboard.Flick.Direction;
+import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.CompositionMode;
+import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Request.CrossingEdgeBehavior;
+import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Request.SpaceOnAlphanumeric;
+import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Request.SpecialRomanjiTable;
+import org.mozc.android.inputmethod.japanese.resources.R;
import com.google.common.base.Optional;
import com.google.common.base.Preconditions;
+import android.util.SparseIntArray;
+
import java.util.Collections;
import java.util.List;
@@ -42,6 +51,231 @@
*/
public class Keyboard {
+ /**
+ * Each keyboard has its own specification.
+ *
+ * For example, some keyboards use a special Romanji table.
+ */
+ public static enum KeyboardSpecification {
+ // 12 keys.
+ TWELVE_KEY_TOGGLE_KANA(
+ new KeyboardSpecificationName("TWELVE_KEY_TOGGLE_KANA", 0, 2, 0),
+ R.xml.kbd_12keys_kana,
+ false,
+ CompositionMode.HIRAGANA,
+ SpecialRomanjiTable.TWELVE_KEYS_TO_HIRAGANA,
+ SpaceOnAlphanumeric.SPACE_OR_CONVERT_KEEPING_COMPOSITION,
+ true,
+ CrossingEdgeBehavior.DO_NOTHING),
+
+ TWELVE_KEY_TOGGLE_ALPHABET(
+ new KeyboardSpecificationName("TWELVE_KEY_TOGGLE_ALPHABET", 0, 2, 0),
+ R.xml.kbd_12keys_abc,
+ false,
+ CompositionMode.HALF_ASCII,
+ SpecialRomanjiTable.TWELVE_KEYS_TO_HALFWIDTHASCII,
+ SpaceOnAlphanumeric.COMMIT,
+ false,
+ CrossingEdgeBehavior.DO_NOTHING),
+
+ TWELVE_KEY_TOGGLE_QWERTY_ALPHABET(
+ new KeyboardSpecificationName("TWELVE_KEY_TOGGLE_QWERTY_ALPHABET", 0, 5, 0),
+ R.xml.kbd_qwerty_abc,
+ false,
+ CompositionMode.HALF_ASCII,
+ SpecialRomanjiTable.QWERTY_MOBILE_TO_HALFWIDTHASCII,
+ SpaceOnAlphanumeric.COMMIT,
+ false,
+ CrossingEdgeBehavior.COMMIT_WITHOUT_CONSUMING),
+
+ // Flick mode.
+ TWELVE_KEY_FLICK_KANA(
+ new KeyboardSpecificationName("TWELVE_KEY_FLICK_KANA", 0, 2, 0),
+ R.xml.kbd_12keys_flick_kana,
+ false,
+ CompositionMode.HIRAGANA,
+ SpecialRomanjiTable.FLICK_TO_HIRAGANA,
+ SpaceOnAlphanumeric.SPACE_OR_CONVERT_KEEPING_COMPOSITION,
+ true,
+ CrossingEdgeBehavior.DO_NOTHING),
+
+ TWELVE_KEY_FLICK_ALPHABET(
+ new KeyboardSpecificationName("TWELVE_KEY_FLICK_ALPHABET", 0, 2, 0),
+ R.xml.kbd_12keys_flick_abc,
+ false,
+ CompositionMode.HALF_ASCII,
+ SpecialRomanjiTable.FLICK_TO_HALFWIDTHASCII,
+ SpaceOnAlphanumeric.COMMIT,
+ false,
+ CrossingEdgeBehavior.COMMIT_WITHOUT_CONSUMING),
+
+ TWELVE_KEY_TOGGLE_FLICK_KANA(
+ new KeyboardSpecificationName("TWELVE_KEY_TOGGLE_FLICK_KANA", 0, 2, 0),
+ R.xml.kbd_12keys_flick_kana,
+ false,
+ CompositionMode.HIRAGANA,
+ SpecialRomanjiTable.TOGGLE_FLICK_TO_HIRAGANA,
+ SpaceOnAlphanumeric.SPACE_OR_CONVERT_KEEPING_COMPOSITION,
+ true,
+ CrossingEdgeBehavior.DO_NOTHING),
+
+ TWELVE_KEY_TOGGLE_FLICK_ALPHABET(
+ new KeyboardSpecificationName("TWELVE_KEY_TOGGLE_FLICK_ALPHABET", 0, 2, 0),
+ R.xml.kbd_12keys_flick_abc,
+ false,
+ CompositionMode.HALF_ASCII,
+ SpecialRomanjiTable.TOGGLE_FLICK_TO_HALFWIDTHASCII,
+ SpaceOnAlphanumeric.COMMIT,
+ false,
+ CrossingEdgeBehavior.DO_NOTHING),
+
+ // QWERTY keyboard.
+ QWERTY_KANA(
+ new KeyboardSpecificationName("QWERTY_KANA", 0, 4, 0),
+ R.xml.kbd_qwerty_kana,
+ false,
+ CompositionMode.HIRAGANA,
+ SpecialRomanjiTable.QWERTY_MOBILE_TO_HIRAGANA,
+ SpaceOnAlphanumeric.SPACE_OR_CONVERT_KEEPING_COMPOSITION,
+ false,
+ CrossingEdgeBehavior.DO_NOTHING),
+
+ QWERTY_ALPHABET(
+ new KeyboardSpecificationName("QWERTY_ALPHABET", 0, 5, 0),
+ R.xml.kbd_qwerty_abc,
+ false,
+ CompositionMode.HALF_ASCII,
+ SpecialRomanjiTable.QWERTY_MOBILE_TO_HALFWIDTHASCII,
+ SpaceOnAlphanumeric.COMMIT,
+ false,
+ CrossingEdgeBehavior.COMMIT_WITHOUT_CONSUMING),
+
+ QWERTY_ALPHABET_NUMBER(
+ new KeyboardSpecificationName("QWERTY_ALPHABET_NUMBER", 0, 3, 0),
+ R.xml.kbd_qwerty_abc_123,
+ false,
+ CompositionMode.HALF_ASCII,
+ SpecialRomanjiTable.QWERTY_MOBILE_TO_HALFWIDTHASCII,
+ SpaceOnAlphanumeric.COMMIT,
+ false,
+ CrossingEdgeBehavior.COMMIT_WITHOUT_CONSUMING),
+
+ // Godan keyboard.
+ GODAN_KANA(
+ new KeyboardSpecificationName("GODAN_KANA", 0, 2, 0),
+ R.xml.kbd_godan_kana,
+ false,
+ CompositionMode.HIRAGANA,
+ SpecialRomanjiTable.GODAN_TO_HIRAGANA,
+ SpaceOnAlphanumeric.SPACE_OR_CONVERT_KEEPING_COMPOSITION,
+ true,
+ CrossingEdgeBehavior.COMMIT_WITHOUT_CONSUMING),
+
+ NUMBER(
+ new KeyboardSpecificationName("NUMBER", 0, 1, 0),
+ R.xml.kbd_123,
+ false,
+ CompositionMode.HALF_ASCII,
+ SpecialRomanjiTable.QWERTY_MOBILE_TO_HALFWIDTHASCII,
+ SpaceOnAlphanumeric.COMMIT,
+ false,
+ CrossingEdgeBehavior.DO_NOTHING),
+
+ // Number keyboard on symbol input view.
+ SYMBOL_NUMBER(
+ new KeyboardSpecificationName("TWELVE_KEY_SYMBOL_NUMBER", 0, 1, 0),
+ R.xml.kbd_symbol_123,
+ false,
+ CompositionMode.HALF_ASCII,
+ SpecialRomanjiTable.QWERTY_MOBILE_TO_HALFWIDTHASCII,
+ SpaceOnAlphanumeric.COMMIT,
+ false,
+ CrossingEdgeBehavior.DO_NOTHING),
+
+ // HARDWARE QWERTY keyboard.
+ HARDWARE_QWERTY_KANA(
+ new KeyboardSpecificationName("HARDWARE_QWERTY_KANA", 0, 1, 0),
+ 0,
+ true,
+ CompositionMode.HIRAGANA,
+ SpecialRomanjiTable.DEFAULT_TABLE,
+ SpaceOnAlphanumeric.SPACE_OR_CONVERT_KEEPING_COMPOSITION,
+ false,
+ CrossingEdgeBehavior.DO_NOTHING),
+
+ HARDWARE_QWERTY_ALPHABET(
+ new KeyboardSpecificationName("HARDWARE_QWERTY_ALPHABET", 0, 1, 0),
+ 0,
+ true,
+ CompositionMode.HALF_ASCII,
+ SpecialRomanjiTable.DEFAULT_TABLE,
+ SpaceOnAlphanumeric.COMMIT,
+ false,
+ CrossingEdgeBehavior.DO_NOTHING),
+
+ ;
+
+ private final KeyboardSpecificationName specName;
+ private final int resourceId;
+ private final boolean isHardwareKeyboard;
+ private final CompositionMode compositionMode;
+ private final SpecialRomanjiTable specialRomanjiTable;
+ private final SpaceOnAlphanumeric spaceOnAlphanumeric;
+ private final boolean kanaModifierInsensitiveConversion;
+ private final CrossingEdgeBehavior crossingEdgeBehavior;
+
+ private KeyboardSpecification(
+ KeyboardSpecificationName specName,
+ int resourceId,
+ boolean isHardwareKeyboard,
+ CompositionMode compositionMode,
+ SpecialRomanjiTable specialRomanjiTable,
+ SpaceOnAlphanumeric spaceOnAlphanumeric,
+ boolean kanaModifierInsensitiveConversion,
+ CrossingEdgeBehavior crossingEdgeBehavior) {
+ this.specName = Preconditions.checkNotNull(specName);
+ this.resourceId = resourceId;
+ this.isHardwareKeyboard = isHardwareKeyboard;
+ this.compositionMode = Preconditions.checkNotNull(compositionMode);
+ this.specialRomanjiTable = Preconditions.checkNotNull(specialRomanjiTable);
+ this.spaceOnAlphanumeric = Preconditions.checkNotNull(spaceOnAlphanumeric);
+ this.kanaModifierInsensitiveConversion = kanaModifierInsensitiveConversion;
+ this.crossingEdgeBehavior = Preconditions.checkNotNull(crossingEdgeBehavior);
+ }
+
+ public int getXmlLayoutResourceId() {
+ return resourceId;
+ }
+
+ public CompositionMode getCompositionMode() {
+ return compositionMode;
+ }
+
+ public KeyboardSpecificationName getKeyboardSpecificationName() {
+ return specName;
+ }
+
+ public SpecialRomanjiTable getSpecialRomanjiTable() {
+ return specialRomanjiTable;
+ }
+
+ public SpaceOnAlphanumeric getSpaceOnAlphanumeric() {
+ return spaceOnAlphanumeric;
+ }
+
+ public boolean isKanaModifierInsensitiveConversion() {
+ return kanaModifierInsensitiveConversion;
+ }
+
+ public CrossingEdgeBehavior getCrossingEdgeBehavior() {
+ return crossingEdgeBehavior;
+ }
+
+ public boolean isHardwareKeyboard() {
+ return isHardwareKeyboard;
+ }
+ }
+
private final Optional<String> contentDescription;
private final float flickThreshold;
private final List<Row> rowList;
@@ -50,9 +284,12 @@
public final int contentRight;
public final int contentTop;
public final int contentBottom;
+ protected final KeyboardSpecification specification;
+ private Optional<SparseIntArray> sourceIdToKeyCode = Optional.absent();
public Keyboard(Optional<String> contentDescription,
- List<? extends Row> rowList, float flickThreshold) {
+ List<? extends Row> rowList, float flickThreshold,
+ KeyboardSpecification specification) {
this.contentDescription = Preconditions.checkNotNull(contentDescription);
this.flickThreshold = flickThreshold;
this.rowList = Collections.unmodifiableList(rowList);
@@ -71,6 +308,7 @@
this.contentRight = right;
this.contentTop = top;
this.contentBottom = bottom;
+ this.specification = Preconditions.checkNotNull(specification);
}
public Optional<String> getContentDescription() {
@@ -84,4 +322,39 @@
public List<Row> getRowList() {
return rowList;
}
+
+ public KeyboardSpecification getSpecification() {
+ return specification;
+ }
+
+ /**
+ * Returns keyCode from {@code souceId}.
+ *
+ * <p>If not found, {@code Integer.MIN_VALUE} is returned.
+ */
+ public int getKeyCode(int sourceId) {
+ ensureSourceIdToKeyCode();
+ return sourceIdToKeyCode.get().get(sourceId, Integer.MIN_VALUE);
+ }
+
+ private void ensureSourceIdToKeyCode() {
+ if (sourceIdToKeyCode.isPresent()) {
+ return;
+ }
+ SparseIntArray result = new SparseIntArray();
+ for (Row row : getRowList()) {
+ for (Key key : row.getKeyList()) {
+ for (KeyState keyState : key.getKeyStates()) {
+ for (Direction direction : Direction.values()) {
+ Optional<Flick> flick = keyState.getFlick(direction);
+ if (flick.isPresent()) {
+ KeyEntity keyEntity = flick.get().getKeyEntity();
+ result.put(keyEntity.getSourceId(), keyEntity.getKeyCode());
+ }
+ }
+ }
+ }
+ }
+ sourceIdToKeyCode = Optional.of(result);
+ }
}
diff --git a/src/android/src/com/google/android/inputmethod/japanese/keyboard/KeyboardActionListener.java b/src/android/src/com/google/android/inputmethod/japanese/keyboard/KeyboardActionListener.java
index bdc8a5c..51ee9e3 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/keyboard/KeyboardActionListener.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/keyboard/KeyboardActionListener.java
@@ -35,11 +35,11 @@
/**
* A listener of keyboard actions.
- *
+ *
*/
public interface KeyboardActionListener {
public void onCancel();
public void onPress(int keycode);
public void onRelease(int keycode);
- public void onKey(int primaryCode, List<? extends TouchEvent> touchEventList);
+ public void onKey(int primaryCode, List<TouchEvent> touchEventList);
}
diff --git a/src/android/src/com/google/android/inputmethod/japanese/keyboard/KeyboardFactory.java b/src/android/src/com/google/android/inputmethod/japanese/keyboard/KeyboardFactory.java
new file mode 100644
index 0000000..3f38a5f
--- /dev/null
+++ b/src/android/src/com/google/android/inputmethod/japanese/keyboard/KeyboardFactory.java
@@ -0,0 +1,152 @@
+// Copyright 2010-2014, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package org.mozc.android.inputmethod.japanese.keyboard;
+
+import org.mozc.android.inputmethod.japanese.MozcLog;
+import org.mozc.android.inputmethod.japanese.keyboard.Keyboard.KeyboardSpecification;
+import org.mozc.android.inputmethod.japanese.util.LeastRecentlyUsedCacheMap;
+import com.google.common.base.Optional;
+
+import android.content.res.Resources;
+import android.content.res.Resources.NotFoundException;
+
+import org.xmlpull.v1.XmlPullParserException;
+
+import java.io.IOException;
+import java.util.Collections;
+import java.util.Map;
+
+/**
+ * Factory of the keyboard data based on xml.
+ *
+ */
+public class KeyboardFactory {
+
+ /**
+ * Key for the cache map of keyboard.
+ *
+ * Currently the keyboard is depending on its specification and display's size.
+ */
+ private static class CacheKey {
+ private final KeyboardSpecification specification;
+ private final int width;
+ private final int height;
+
+ CacheKey(KeyboardSpecification specification, int width, int height) {
+ this.specification = specification;
+ this.width = width;
+ this.height = height;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj instanceof CacheKey) {
+ CacheKey other = CacheKey.class.cast(obj);
+ return specification == other.specification &&
+ width == other.width &&
+ height == other.height;
+ }
+ return false;
+ }
+
+ @Override
+ public int hashCode() {
+ return (specification.hashCode() * 31 ^ width) * 31 ^ height;
+ }
+ }
+
+ /**
+ * The max size of cached keyboards. This is based on the max number of keyboard variation
+ * for a configuration.
+ */
+ private static final int CACHE_SIZE = 6;
+
+ private final Map<CacheKey, Keyboard> cache =
+ new LeastRecentlyUsedCacheMap<CacheKey, Keyboard>(CACHE_SIZE);
+
+ /**
+ * @return JapaneseKeyboard instance based on given resources and specification.
+ * If it is already parsed, just returns cached one. Otherwise, tries to parse
+ * corresponding xml data, then caches and returns it.
+ * Returns {@code null} if parsing is failed.
+ * @throws NullPointerException if given {@code resources} or {@code specification} is
+ * {@code null}.
+ */
+ public Keyboard get(Resources resources, KeyboardSpecification specification,
+ int keyboardWidth, int keyboardHeight) {
+ if (resources == null) {
+ throw new NullPointerException("resources is null.");
+ }
+ if (specification == null) {
+ throw new NullPointerException("specification is null.");
+ }
+
+ CacheKey cacheKey =
+ new CacheKey(specification, keyboardWidth, keyboardHeight);
+
+ // First, look up from the cache.
+ Keyboard keyboard = cache.get(cacheKey);
+ if (keyboard == null) {
+ // If not found, parse keyboard from a xml resource file. The result will be cached in
+ // the cache map.
+ keyboard = parseKeyboard(resources, specification, keyboardWidth, keyboardHeight);
+ if (keyboard != null) {
+ cache.put(cacheKey, keyboard);
+ }
+ }
+ return keyboard;
+ }
+
+ private static Keyboard parseKeyboard(
+ Resources resources, KeyboardSpecification specification,
+ int keyboardWidth, int keyboardHeight) {
+ KeyboardParser parser = new KeyboardParser(
+ resources, keyboardWidth, keyboardHeight, specification);
+ try {
+ return parser.parseKeyboard();
+ } catch (NotFoundException e) {
+ MozcLog.e(e.getMessage());
+ } catch (XmlPullParserException e) {
+ MozcLog.e(e.getMessage());
+ } catch (IOException e) {
+ MozcLog.e(e.getMessage());
+ }
+ // Returns dummy keyboard to avoid crash.
+ return new Keyboard(Optional.<String>absent(), Collections.<Row>emptyList(), 0,
+ KeyboardSpecification.TWELVE_KEY_TOGGLE_FLICK_KANA);
+ }
+
+ /**
+ * Clears cached keyboards.
+ */
+ public void clear() {
+ cache.clear();
+ }
+}
diff --git a/src/android/src/com/google/android/inputmethod/japanese/keyboard/KeyboardParser.java b/src/android/src/com/google/android/inputmethod/japanese/keyboard/KeyboardParser.java
index 80ac180..cd4c57e 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/keyboard/KeyboardParser.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/keyboard/KeyboardParser.java
@@ -31,7 +31,9 @@
import org.mozc.android.inputmethod.japanese.keyboard.BackgroundDrawableFactory.DrawableType;
import org.mozc.android.inputmethod.japanese.keyboard.Key.Stick;
+import org.mozc.android.inputmethod.japanese.keyboard.Keyboard.KeyboardSpecification;
import org.mozc.android.inputmethod.japanese.resources.R;
+import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Objects;
import com.google.common.base.Optional;
import com.google.common.base.Preconditions;
@@ -59,35 +61,172 @@
public class KeyboardParser {
/** Attributes for the key dimensions. */
- private static class KeyAttributes {
+ @VisibleForTesting static class KeyAttributes {
+
+ @VisibleForTesting static class Builder {
+
+ private int width;
+ private int height;
+ private int horizontalLayoutWeight;
+ private int horizontalGap;
+ private int verticalGap;
+ private int defaultIconWidth;
+ private int defaultIconHeight;
+ private int defaultHorizontalPadding;
+ private int defaultVerticalPadding;
+ private DrawableType keyBackgroundDrawableType =
+ DrawableType.TWELVEKEYS_REGULAR_KEY_BACKGROUND;
+ private int edgeFlags;
+ private boolean isRepeatable;
+ private boolean isModifier;
+ private Stick stick = Stick.EVEN;
+ private List<KeyState> keyStateList = Collections.<KeyState>emptyList();
+
+ Builder setWidth(int width) {
+ this.width = width;
+ return this;
+ }
+ Builder setHeight(int height) {
+ this.height = height;
+ return this;
+ }
+ Builder setHorizontalLayoutWeight(int horizontalLayoutWeight) {
+ this.horizontalLayoutWeight = horizontalLayoutWeight;
+ return this;
+ }
+ Builder setHorizontalGap(int horizontalGap) {
+ this.horizontalGap = horizontalGap;
+ return this;
+ }
+ Builder setVerticalGap(int verticalGap) {
+ this.verticalGap = verticalGap;
+ return this;
+ }
+ Builder setDefaultIconWidth(int defaultIconWidth) {
+ this.defaultIconWidth = defaultIconWidth;
+ return this;
+ }
+ Builder setDefaultIconHeight(int defaultIconHeight) {
+ this.defaultIconHeight = defaultIconHeight;
+ return this;
+ }
+ Builder setDefaultHorizontalPadding(int defaultHorizontalPadding) {
+ this.defaultHorizontalPadding = defaultHorizontalPadding;
+ return this;
+ }
+ Builder setDefaultVerticalPadding(int defaultVerticalPadding) {
+ this.defaultVerticalPadding = defaultVerticalPadding;
+ return this;
+ }
+ Builder setKeybackgroundDrawableType(DrawableType type) {
+ this.keyBackgroundDrawableType = Preconditions.checkNotNull(type);
+ return this;
+ }
+ Builder setEdgeFlags(int edgeFlags) {
+ this.edgeFlags = edgeFlags;
+ return this;
+ }
+ Builder setRepeatable(boolean isRepeatable) {
+ this.isRepeatable = isRepeatable;
+ return this;
+ }
+ Builder setModifier(boolean isModifier) {
+ this.isModifier = isModifier;
+ return this;
+ }
+ Builder setStick(Stick stick) {
+ this.stick = Preconditions.checkNotNull(stick);
+ return this;
+ }
+ Builder setKeyStateList(List<KeyState> keyStateList) {
+ this.keyStateList = Preconditions.checkNotNull(keyStateList);
+ return this;
+ }
+ KeyAttributes build() {
+ return new KeyAttributes(this);
+ }
+ }
+
final int width;
final int height;
+ final int horizontalLayoutWeight;
final int horizontalGap;
final int verticalGap;
- DrawableType keyBackgroundDrawableType;
+ final int defaultIconWidth;
+ final int defaultIconHeight;
+ final int defaultHorizontalPadding;
+ final int defaultVerticalPadding;
+ final DrawableType keyBackgroundDrawableType;
+ final int edgeFlags;
+ final boolean isRepeatable;
+ final boolean isModifier;
+ final Stick stick;
+ final List<KeyState> keyStateList;
- KeyAttributes(int width, int height, int horizontalGap, int verticalGap,
- DrawableType keyBackgroundDrawableType) {
- this.width = width;
- this.height = height;
- this.horizontalGap = horizontalGap;
- this.verticalGap = verticalGap;
- this.keyBackgroundDrawableType = keyBackgroundDrawableType;
+ private KeyAttributes(Builder builder) {
+ this.width = builder.width;
+ this.height = builder.height;
+ this.horizontalLayoutWeight = builder.horizontalLayoutWeight;
+ this.horizontalGap = builder.horizontalGap;
+ this.verticalGap = builder.verticalGap;
+ this.defaultIconWidth = builder.defaultIconWidth;
+ this.defaultIconHeight = builder.defaultIconHeight;
+ this.defaultHorizontalPadding = builder.defaultHorizontalPadding;
+ this.defaultVerticalPadding = builder.defaultVerticalPadding;
+ this.keyBackgroundDrawableType =
+ Preconditions.checkNotNull(builder.keyBackgroundDrawableType);
+ this.edgeFlags = builder.edgeFlags;
+ this.isRepeatable = builder.isRepeatable;
+ this.isModifier = builder.isModifier;
+ this.stick = builder.stick;
+ this.keyStateList = builder.keyStateList;
+ }
+
+ static Builder newBuilder() {
+ return new Builder();
+ }
+
+ Builder toBuilder() {
+ return newBuilder()
+ .setWidth(width)
+ .setHeight(height)
+ .setHorizontalLayoutWeight(horizontalLayoutWeight)
+ .setHorizontalGap(horizontalGap)
+ .setVerticalGap(verticalGap)
+ .setDefaultHorizontalPadding(defaultHorizontalPadding)
+ .setDefaultVerticalPadding(defaultVerticalPadding)
+ .setDefaultIconWidth(defaultIconWidth)
+ .setDefaultIconHeight(defaultIconHeight)
+ .setKeybackgroundDrawableType(keyBackgroundDrawableType)
+ .setEdgeFlags(edgeFlags)
+ .setRepeatable(isRepeatable)
+ .setModifier(isModifier)
+ .setStick(stick)
+ .setKeyStateList(keyStateList);
+ }
+
+ Key buildKey(int x, int y, int width) {
+ return new Key(x, y, width, height, horizontalGap, edgeFlags,
+ isRepeatable, isModifier, stick, keyBackgroundDrawableType, keyStateList);
}
}
/** Attributes for the popup dimensions. */
private static class PopUpAttributes {
- final int popUpWidth;
+
final int popUpHeight;
final int popUpXOffset;
final int popUpYOffset;
+ final int popUpIconWidth;
+ final int popUpIconHeight;
- PopUpAttributes(int popUpWidth, int popUpHeight, int popUpXOffset, int popUpYOffset) {
- this.popUpWidth = popUpWidth;
+ PopUpAttributes(int popUpHeight, int popUpXOffset, int popUpYOffset,
+ int popUpIconWidth, int popUpIconHeight) {
this.popUpHeight = popUpHeight;
this.popUpXOffset = popUpXOffset;
this.popUpYOffset = popUpYOffset;
+ this.popUpIconWidth = popUpIconWidth;
+ this.popUpIconHeight = popUpIconHeight;
}
}
@@ -115,16 +254,47 @@
private static final int ROW_ROW_EDGE_FLAGS_INDEX =
Arrays.binarySearch(ROW_ATTRIBUTES, R.attr.rowEdgeFlags);
+ private static final int[] POPUP_ATTRIBUTES = {
+ R.attr.popUpIcon,
+ R.attr.popUpLongPressIcon,
+ R.attr.popUpHeight,
+ R.attr.popUpXOffset,
+ R.attr.popUpYOffset,
+ R.attr.popUpIconWidth,
+ R.attr.popUpIconHeight,
+ };
+ static {
+ Arrays.sort(POPUP_ATTRIBUTES);
+ }
+ private static final int POPUP_KEY_ICON_INDEX =
+ Arrays.binarySearch(POPUP_ATTRIBUTES, R.attr.popUpIcon);
+ private static final int POPUP_KEY_LONG_PRESS_ICON_INDEX =
+ Arrays.binarySearch(POPUP_ATTRIBUTES, R.attr.popUpLongPressIcon);
+ private static final int POPUP_KEY_HEIGHT_INDEX =
+ Arrays.binarySearch(POPUP_ATTRIBUTES, R.attr.popUpHeight);
+ private static final int POPUP_KEY_X_OFFSET_INDEX =
+ Arrays.binarySearch(POPUP_ATTRIBUTES, R.attr.popUpXOffset);
+ private static final int POPUP_KEY_Y_OFFSET_INDEX =
+ Arrays.binarySearch(POPUP_ATTRIBUTES, R.attr.popUpYOffset);
+ private static final int POPUP_KEY_ICON_WIDTH_INDEX =
+ Arrays.binarySearch(POPUP_ATTRIBUTES, R.attr.popUpIconWidth);
+ private static final int POPUP_KEY_ICON_HEIGHT_INDEX =
+ Arrays.binarySearch(POPUP_ATTRIBUTES, R.attr.popUpIconHeight);
+
/** Attributes for a {@code <Key>} element. */
private static final int[] KEY_ATTRIBUTES = {
R.attr.keyWidth,
R.attr.keyHeight,
+ R.attr.keyHorizontalLayoutWeight,
R.attr.horizontalGap,
+ R.attr.defaultIconWidth,
+ R.attr.defaultIconHeight,
+ R.attr.defaultHorizontalPadding,
+ R.attr.defaultVerticalPadding,
R.attr.keyBackground,
R.attr.keyEdgeFlags,
R.attr.isRepeatable,
R.attr.isModifier,
- R.attr.isSticky,
};
static {
Arrays.sort(KEY_ATTRIBUTES);
@@ -133,8 +303,18 @@
Arrays.binarySearch(KEY_ATTRIBUTES, R.attr.keyWidth);
private static final int KEY_KEY_HEIGHT_INDEX =
Arrays.binarySearch(KEY_ATTRIBUTES, R.attr.keyHeight);
+ private static final int KEY_KEY_HORIZONTAL_LAYOUT_WEIGHT_INDEX =
+ Arrays.binarySearch(KEY_ATTRIBUTES, R.attr.keyHorizontalLayoutWeight);
private static final int KEY_HORIZONTAL_GAP_INDEX =
Arrays.binarySearch(KEY_ATTRIBUTES, R.attr.horizontalGap);
+ private static final int KEY_DEFAULT_ICON_WIDTH_INDEX =
+ Arrays.binarySearch(KEY_ATTRIBUTES, R.attr.defaultIconWidth);
+ private static final int KEY_DEFAULT_ICON_HEIGHT_INDEX =
+ Arrays.binarySearch(KEY_ATTRIBUTES, R.attr.defaultIconHeight);
+ private static final int KEY_DEFAULT_HORIZONTAL_PADDING_INDEX =
+ Arrays.binarySearch(KEY_ATTRIBUTES, R.attr.defaultHorizontalPadding);
+ private static final int KEY_DEFAULT_VERTICAL_PADDING_INDEX =
+ Arrays.binarySearch(KEY_ATTRIBUTES, R.attr.defaultVerticalPadding);
private static final int KEY_KEY_BACKGROUND_INDEX =
Arrays.binarySearch(KEY_ATTRIBUTES, R.attr.keyBackground);
private static final int KEY_KEY_EDGE_FLAGS_INDEX =
@@ -143,32 +323,35 @@
Arrays.binarySearch(KEY_ATTRIBUTES, R.attr.isRepeatable);
private static final int KEY_IS_MODIFIER_INDEX =
Arrays.binarySearch(KEY_ATTRIBUTES, R.attr.isModifier);
- private static final int KEY_IS_STICKY_INDEX =
- Arrays.binarySearch(KEY_ATTRIBUTES, R.attr.isSticky);
/** Attributes for a {@code <Spacer>} element. */
private static final int[] SPACER_ATTRIBUTES = {
+ R.attr.keyWidth,
R.attr.keyHeight,
- R.attr.horizontalGap,
+ R.attr.keyHorizontalLayoutWeight,
R.attr.keyEdgeFlags,
R.attr.stick,
+ R.attr.keyBackground,
};
static {
Arrays.sort(SPACER_ATTRIBUTES);
}
+ private static final int SPACER_KEY_WIDTH_INDEX =
+ Arrays.binarySearch(SPACER_ATTRIBUTES, R.attr.keyWidth);
private static final int SPACER_KEY_HEIGHT_INDEX =
Arrays.binarySearch(SPACER_ATTRIBUTES, R.attr.keyHeight);
- private static final int SPACER_HORIZONTAL_GAP_INDEX =
- Arrays.binarySearch(SPACER_ATTRIBUTES, R.attr.horizontalGap);
+ private static final int SPACER_KEY_HORIZONTAL_LAYOUT_WEIGHT_INDEX =
+ Arrays.binarySearch(SPACER_ATTRIBUTES, R.attr.keyHorizontalLayoutWeight);
private static final int SPACER_KEY_EDGE_FLAGS_INDEX =
Arrays.binarySearch(SPACER_ATTRIBUTES, R.attr.keyEdgeFlags);
private static final int SPACER_STICK_INDEX =
Arrays.binarySearch(SPACER_ATTRIBUTES, R.attr.stick);
+ private static final int SPACER_KEY_BACKGROUND_INDEX =
+ Arrays.binarySearch(SPACER_ATTRIBUTES, R.attr.keyBackground);
/** Attributes for a {@code <KeyState>} element. */
private static final int[] KEY_STATE_ATTRIBUTES = {
R.attr.contentDescription,
- R.attr.keyBackground,
R.attr.metaState,
R.attr.nextMetaState,
R.attr.nextRemovedMetaStates,
@@ -178,8 +361,6 @@
}
private static final int KEY_STATE_CONTENT_DESCRIPTION_INDEX =
Arrays.binarySearch(KEY_STATE_ATTRIBUTES, R.attr.contentDescription);
- private static final int KEY_STATE_KEY_BACKGROUND_INDEX =
- Arrays.binarySearch(KEY_STATE_ATTRIBUTES, R.attr.keyBackground);
private static final int KEY_STATE_META_STATE_INDEX =
Arrays.binarySearch(KEY_STATE_ATTRIBUTES, R.attr.metaState);
private static final int KEY_STATE_NEXT_META_STATE_INDEX =
@@ -192,9 +373,14 @@
R.attr.sourceId,
R.attr.keyCode,
R.attr.longPressKeyCode,
+ R.attr.longPressTimeoutTrigger,
R.attr.keyIcon,
R.attr.keyCharacter,
R.attr.flickHighlight,
+ R.attr.horizontalPadding,
+ R.attr.verticalPadding,
+ R.attr.iconWidth,
+ R.attr.iconHeight,
};
static {
Arrays.sort(KEY_ENTITY_ATTRIBUTES);
@@ -205,12 +391,22 @@
Arrays.binarySearch(KEY_ENTITY_ATTRIBUTES, R.attr.keyCode);
private static final int KEY_ENTITY_LONG_PRESS_KEY_CODE_INDEX =
Arrays.binarySearch(KEY_ENTITY_ATTRIBUTES, R.attr.longPressKeyCode);
+ private static final int KEY_ENTITY_LONG_PRESS_TIMEOUT_TRIGGER_INDEX =
+ Arrays.binarySearch(KEY_ENTITY_ATTRIBUTES, R.attr.longPressTimeoutTrigger);
private static final int KEY_ENTITY_KEY_ICON_INDEX =
Arrays.binarySearch(KEY_ENTITY_ATTRIBUTES, R.attr.keyIcon);
private static final int KEY_ENTITY_KEY_CHAR_INDEX =
Arrays.binarySearch(KEY_ENTITY_ATTRIBUTES, R.attr.keyCharacter);
private static final int KEY_ENTITY_FLICK_HIGHLIGHT_INDEX =
Arrays.binarySearch(KEY_ENTITY_ATTRIBUTES, R.attr.flickHighlight);
+ private static final int KEY_ENTITY_HORIZONTAL_PADDING_INDEX =
+ Arrays.binarySearch(KEY_ENTITY_ATTRIBUTES, R.attr.horizontalPadding);
+ private static final int KEY_ENTITY_VERTICAL_PADDING_INDEX =
+ Arrays.binarySearch(KEY_ENTITY_ATTRIBUTES, R.attr.verticalPadding);
+ private static final int KEY_ENTITY_ICON_WIDTH_INDEX =
+ Arrays.binarySearch(KEY_ENTITY_ATTRIBUTES, R.attr.iconWidth);
+ private static final int KEY_ENTITY_ICON_HEIGHT_INDEX =
+ Arrays.binarySearch(KEY_ENTITY_ATTRIBUTES, R.attr.iconHeight);
/**
* Mapping table from enum value in xml to DrawableType by using the enum value as index.
@@ -222,30 +418,33 @@
DrawableType.QWERTY_REGULAR_KEY_BACKGROUND,
DrawableType.QWERTY_FUNCTION_KEY_BACKGROUND,
DrawableType.QWERTY_FUNCTION_KEY_BACKGROUND_WITH_THREEDOTS,
- DrawableType.QWERTY_FUNCTION_KEY_LIGHT_ON_BACKGROUND,
- DrawableType.QWERTY_FUNCTION_KEY_LIGHT_OFF_BACKGROUND,
+ DrawableType.QWERTY_FUNCTION_KEY_SPACE_WITH_THREEDOTS,
+ DrawableType.KEYBOARD_SEPARATOR_TOP,
+ DrawableType.KEYBOARD_SEPARATOR_CENTER,
+ DrawableType.KEYBOARD_SEPARATOR_BOTTOM,
+ DrawableType.TRNASPARENT,
};
/**
* @return "sourceId" assigned to {@code value}.
*/
- static int getSourceId(TypedValue value, @SuppressWarnings("unused") int defaultValue) {
- if (value == null ||
- (value.type != TypedValue.TYPE_INT_DEC &&
- value.type != TypedValue.TYPE_INT_HEX)) {
- throw new IllegalArgumentException("sourceId is mandatory for KeyEntity.");
- }
+ private static int getSourceId(TypedValue value, @SuppressWarnings("unused") int defaultValue) {
+ Preconditions.checkNotNull(value);
+ Preconditions.checkArgument(
+ value.type == TypedValue.TYPE_INT_DEC || value.type == TypedValue.TYPE_INT_HEX,
+ "sourceId is mandatory for KeyEntity.");
return value.data;
}
/**
* @return the pixel offsets based on metrics and base
*/
- static int getDimensionOrFraction(
- TypedValue value, int base, int defaultValue, DisplayMetrics metrics) {
- if (value == null) {
+ @VisibleForTesting static int getDimensionOrFraction(
+ Optional<TypedValue> optionalValue, int base, int defaultValue, DisplayMetrics metrics) {
+ if (!optionalValue.isPresent()) {
return defaultValue;
}
+ TypedValue value = optionalValue.get();
switch (value.type) {
case TypedValue.TYPE_DIMENSION:
@@ -258,13 +457,29 @@
" value = " + value.toString());
}
+ @VisibleForTesting static int getFraction(
+ Optional<TypedValue> optionalValue, int base, int defaultValue) {
+ if (!optionalValue.isPresent()) {
+ return defaultValue;
+ }
+ TypedValue value = optionalValue.get();
+
+ if (value.type == TypedValue.TYPE_FRACTION) {
+ return Math.round(TypedValue.complexToFraction(value.data, base, base));
+ }
+
+ throw new IllegalArgumentException(
+ "The type fraction is required. value = " + value.toString());
+ }
+
/**
* @return "codes" assigned to {@code value}
*/
- static int getCode(TypedValue value, int defaultValue) {
- if (value == null) {
+ @VisibleForTesting static int getCode(Optional<TypedValue> optionalValue, int defaultValue) {
+ if (!optionalValue.isPresent()) {
return defaultValue;
}
+ TypedValue value = optionalValue.get();
if (value.type == TypedValue.TYPE_INT_DEC ||
value.type == TypedValue.TYPE_INT_HEX) {
@@ -277,20 +492,6 @@
return defaultValue;
}
- /**
- * A simple wrapper of {@link CharSequence#toString()}, in order to avoid
- * {@code NullPointerException}.
- * @param sequence input character sequence
- * @return {@code sequence.toString()} if {@code sequence} is not {@code null}.
- * Otherwise, {@code null}.
- */
- static String toStringOrNull(CharSequence sequence) {
- if (sequence == null) {
- return null;
- }
- return sequence.toString();
- }
-
private static void ignoreWhiteSpaceAndComment(XmlPullParser parser)
throws XmlPullParserException, IOException {
int event = parser.getEventType();
@@ -302,8 +503,8 @@
private static void assertStartDocument(XmlPullParser parser) throws XmlPullParserException {
if (parser.getEventType() != XmlPullParser.START_DOCUMENT) {
throw new IllegalArgumentException(
- "The start of document is expected, but actually not: " +
- parser.getPositionDescription());
+ "The start of document is expected, but actually not: "
+ + parser.getPositionDescription());
}
}
@@ -325,8 +526,8 @@
String actualName = parser.getName();
if (!actualName.equals(expectedName)) {
throw new IllegalArgumentException(
- "Tag <" + expectedName + "> is expected, but found <" + actualName + ">: " +
- parser.getPositionDescription());
+ "Tag <" + expectedName + "> is expected, but found <" + actualName + ">: "
+ + parser.getPositionDescription());
}
}
@@ -353,20 +554,16 @@
private final Set<Integer> sourceIdSet = new HashSet<Integer>();
private final int keyboardWidth;
private final int keyboardHeight;
+ private final KeyboardSpecification specification;
- public KeyboardParser(Resources resources, XmlResourceParser xmlResourceParser,
- int keyboardWidth, int keyboardHeight) {
- if (resources == null) {
- throw new NullPointerException("resources shouldn't be null.");
- }
- if (xmlResourceParser == null) {
- throw new NullPointerException("xmlResourceParser shouldn't be null.");
- }
-
- this.resources = resources;
- this.xmlResourceParser = xmlResourceParser;
+ public KeyboardParser(Resources resources,
+ int keyboardWidth, int keyboardHeight,
+ KeyboardSpecification specification) {
+ this.resources = Preconditions.checkNotNull(resources);
this.keyboardWidth = keyboardWidth;
this.keyboardHeight = keyboardHeight;
+ this.specification = Preconditions.checkNotNull(specification);
+ this.xmlResourceParser = resources.getXml(specification.getXmlLayoutResourceId());
}
/**
@@ -427,23 +624,38 @@
// The default keyWidth is 10% of the display for width, and 50px for height.
keyAttributes = parseKeyAttributes(
attributes,
- new KeyAttributes(keyboardWidth / 10, 50, 0, 0, null),
+ KeyAttributes.newBuilder()
+ .setWidth(keyboardWidth / 10)
+ .setHeight(50)
+ .setKeybackgroundDrawableType(DrawableType.TWELVEKEYS_REGULAR_KEY_BACKGROUND)
+ .setDefaultIconWidth(keyboardWidth)
+ .setDefaultIconHeight(keyboardHeight)
+ .setDefaultHorizontalPadding(0)
+ .setDefaultVerticalPadding(0)
+ .build(),
metrics,
this.keyboardWidth,
this.keyboardHeight,
R.styleable.Keyboard_keyWidth,
R.styleable.Keyboard_keyHeight,
+ R.styleable.Keyboard_keyHorizontalLayoutWeight,
R.styleable.Keyboard_horizontalGap,
R.styleable.Keyboard_verticalGap,
+ R.styleable.Keyboard_defaultIconWidth,
+ R.styleable.Keyboard_defaultIconHeight,
+ R.styleable.Keyboard_defaultHorizontalPadding,
+ R.styleable.Keyboard_defaultVerticalPadding,
R.styleable.Keyboard_keyBackground);
popUpAttributes = parsePopUpAttributes(
attributes,
+ new PopUpAttributes(0, 0, 0, 0, 0),
metrics,
this.keyboardWidth,
- R.styleable.Keyboard_popUpWidth,
R.styleable.Keyboard_popUpHeight,
R.styleable.Keyboard_popUpXOffset,
- R.styleable.Keyboard_popUpYOffset);
+ R.styleable.Keyboard_popUpYOffset,
+ R.styleable.Keyboard_popUpIconWidth,
+ R.styleable.Keyboard_popUpIconHeight);
flickThreshold = parseFlickThreshold(
attributes, R.styleable.Keyboard_flickThreshold);
contentDescription = Optional.fromNullable(
@@ -473,7 +685,36 @@
ignoreWhiteSpaceAndComment(parser);
assertEndDocument(parser);
- return buildKeyboard(contentDescription, rowList, flickThreshold);
+ return new Keyboard(Preconditions.checkNotNull(contentDescription),
+ Preconditions.checkNotNull(rowList), flickThreshold, specification);
+ }
+
+ @VisibleForTesting
+ static List<Key> buildKeyList(List<KeyAttributes> keyAttributesList,
+ int y, int rowWidth) {
+ float remainingWidthByWeight = rowWidth;
+ int remainingWeight = 0;
+ for (KeyAttributes attributes : keyAttributesList) {
+ remainingWidthByWeight -= attributes.width;
+ remainingWeight += attributes.horizontalLayoutWeight;
+ }
+
+ List<Key> keyList = new ArrayList<Key>(keyAttributesList.size());
+ float exactX = 0;
+ for (KeyAttributes attributes : keyAttributesList) {
+ int weight = attributes.horizontalLayoutWeight;
+ Preconditions.checkState(remainingWeight >= weight);
+ float widthByWeight = weight > 0 ? remainingWidthByWeight * weight / remainingWeight : 0;
+ remainingWidthByWeight -= widthByWeight;
+ remainingWeight -= weight;
+ int x = Math.round(exactX);
+ Key key =
+ attributes.buildKey(x, y, Math.round(exactX + widthByWeight + attributes.width) - x);
+ keyList.add(key);
+ exactX += widthByWeight + attributes.width;
+ }
+ Preconditions.checkState(remainingWeight == 0);
+ return keyList;
}
/**
@@ -494,10 +735,10 @@
TypedArray attributes = resources.obtainAttributes(parser, ROW_ATTRIBUTES);
try {
verticalGap = getDimensionOrFraction(
- attributes.peekValue(ROW_VERTICAL_GAP_INDEX),
+ Optional.fromNullable(attributes.peekValue(ROW_VERTICAL_GAP_INDEX)),
keyboardHeight, defaultKeyAttributes.verticalGap, metrics);
rowHeight = getDimensionOrFraction(
- attributes.peekValue(ROW_KEY_HEIGHT_INDEX), keyboardHeight,
+ Optional.fromNullable(attributes.peekValue(ROW_KEY_HEIGHT_INDEX)), keyboardHeight,
defaultKeyAttributes.height, metrics);
edgeFlags = attributes.getInt(ROW_ROW_EDGE_FLAGS_INDEX, 0);
} finally {
@@ -505,8 +746,7 @@
}
}
- List<Key> keyList = new ArrayList<Key>();
- int x = 0;
+ List<KeyAttributes> keyAttributesList = new ArrayList<KeyAttributes>(16); // 16 is heuristic
while (true) {
parser.next();
ignoreWhiteSpaceAndComment(parser);
@@ -515,25 +755,22 @@
break;
}
if ("Key".equals(parser.getName())) {
- Key key = parseKey(x, y, edgeFlags, defaultKeyAttributes, popUpAttributes);
- keyList.add(key);
- x += key.getWidth();
+ keyAttributesList.add(parseKey(edgeFlags, defaultKeyAttributes, popUpAttributes));
} else if ("Spacer".equals(parser.getName())) {
- Key key = parseSpacer(x, y, edgeFlags, defaultKeyAttributes);
- keyList.add(key);
- x += key.getWidth();
+ keyAttributesList.add(parseSpacer(edgeFlags, defaultKeyAttributes));
}
}
assertEndTag(parser, "Row");
+ List<Key> keyList = buildKeyList(keyAttributesList, y, keyboardWidth);
return buildRow(keyList, rowHeight, verticalGap);
}
/**
* Parses a {@code Key} element, and returns an instance.
*/
- private Key parseKey(int x, int y, int edgeFlags,
- KeyAttributes defaultKeyAttributes, PopUpAttributes popUpAttributes)
+ private KeyAttributes parseKey(int edgeFlags, KeyAttributes defaultKeyAttributes,
+ PopUpAttributes popUpAttributes)
throws XmlPullParserException, IOException {
XmlResourceParser parser = this.xmlResourceParser;
assertStartTag(parser, "Key");
@@ -541,19 +778,20 @@
KeyAttributes keyAttributes;
boolean isRepeatable;
boolean isModifier;
- boolean isSticky;
+ DisplayMetrics metrics = resources.getDisplayMetrics();
{
TypedArray attributes = resources.obtainAttributes(parser, KEY_ATTRIBUTES);
try {
- DisplayMetrics metrics = resources.getDisplayMetrics();
keyAttributes = parseKeyAttributes(
attributes, defaultKeyAttributes, metrics, keyboardWidth, keyboardHeight,
- KEY_KEY_WIDTH_INDEX, KEY_KEY_HEIGHT_INDEX, KEY_HORIZONTAL_GAP_INDEX, -1,
+ KEY_KEY_WIDTH_INDEX, KEY_KEY_HEIGHT_INDEX, KEY_KEY_HORIZONTAL_LAYOUT_WEIGHT_INDEX,
+ KEY_HORIZONTAL_GAP_INDEX, -1,
+ KEY_DEFAULT_ICON_WIDTH_INDEX, KEY_DEFAULT_ICON_HEIGHT_INDEX,
+ KEY_DEFAULT_HORIZONTAL_PADDING_INDEX, KEY_DEFAULT_VERTICAL_PADDING_INDEX,
KEY_KEY_BACKGROUND_INDEX);
edgeFlags |= attributes.getInt(KEY_KEY_EDGE_FLAGS_INDEX, 0);
isRepeatable = attributes.getBoolean(KEY_IS_REPEATABLE_INDEX, false);
isModifier = attributes.getBoolean(KEY_IS_MODIFIER_INDEX, false);
- isSticky = attributes.getBoolean(KEY_IS_STICKY_INDEX, false);
} finally {
attributes.recycle();
}
@@ -568,18 +806,19 @@
break;
}
- keyStateList.add(
- parseKeyState(keyAttributes.keyBackgroundDrawableType, popUpAttributes));
+ keyStateList.add(parseKeyState(keyAttributes, popUpAttributes, metrics));
}
// At the moment, we just accept keys which has default state.
boolean hasDefault = false;
boolean hasLongPressKeyCode = false;
for (KeyState keyState : keyStateList) {
- if (keyState.getMetaStateSet().isEmpty()) {
+ if (keyState.getMetaStateSet().isEmpty()
+ || keyState.getMetaStateSet().contains(KeyState.MetaState.FALLBACK)) {
hasDefault = true;
- if (keyState.getFlick(Flick.Direction.CENTER).getKeyEntity().getLongPressKeyCode() !=
- KeyEntity.INVALID_KEY_CODE) {
+ Optional<Flick> flick = keyState.getFlick(Flick.Direction.CENTER);
+ Preconditions.checkState(flick.isPresent());
+ if (flick.get().getKeyEntity().getLongPressKeyCode() != KeyEntity.INVALID_KEY_CODE) {
hasLongPressKeyCode = true;
}
break;
@@ -589,23 +828,26 @@
throw new IllegalArgumentException(
"No default KeyState element is found: " + parser.getPositionDescription());
}
-
if (isRepeatable && hasLongPressKeyCode) {
throw new IllegalArgumentException(
- "The key has both isRepeatable attribute and longPressKeyCode: " +
- parser.getPositionDescription());
+ "The key has both isRepeatable attribute and longPressKeyCode: "
+ + parser.getPositionDescription());
}
assertEndTag(parser, "Key");
- return new Key(
- x, y, keyAttributes.width, keyAttributes.height, keyAttributes.horizontalGap,
- edgeFlags, isRepeatable, isModifier, isSticky, Stick.EVEN, keyStateList);
+ return keyAttributes.toBuilder()
+ .setEdgeFlags(edgeFlags)
+ .setRepeatable(isRepeatable)
+ .setModifier(isModifier)
+ .setStick(Stick.EVEN)
+ .setKeyStateList(keyStateList)
+ .build();
}
/**
* Parses a {@code Spacer} element, and returns an instance.
*/
- private Key parseSpacer(int x, int y, int edgeFlags, KeyAttributes defaultKeyAttributes)
+ private KeyAttributes parseSpacer(int edgeFlags, KeyAttributes defaultKeyAttributes)
throws XmlPullParserException, IOException {
XmlResourceParser parser = this.xmlResourceParser;
DisplayMetrics metrics = resources.getDisplayMetrics();
@@ -618,7 +860,9 @@
try {
keyAttributes = parseKeyAttributes(
attributes, defaultKeyAttributes, metrics, keyboardWidth, keyboardHeight,
- -1, SPACER_KEY_HEIGHT_INDEX, SPACER_HORIZONTAL_GAP_INDEX, -1, -1);
+ SPACER_KEY_WIDTH_INDEX, SPACER_KEY_HEIGHT_INDEX,
+ SPACER_KEY_HORIZONTAL_LAYOUT_WEIGHT_INDEX, -1, -1, -1, -1, -1, -1,
+ SPACER_KEY_BACKGROUND_INDEX);
edgeFlags |= attributes.getInt(SPACER_KEY_EDGE_FLAGS_INDEX, 0);
stick = Stick.values()[attributes.getInt(SPACER_STICK_INDEX, 0)];
} finally {
@@ -630,19 +874,21 @@
assertEndTag(parser, "Spacer");
// Returns a dummy key object.
- return new Key(
- x, y, keyAttributes.horizontalGap, keyAttributes.height,
- 0, edgeFlags, false, false, false, stick, Collections.<KeyState>emptyList());
+ return keyAttributes.toBuilder()
+ .setRepeatable(false)
+ .setModifier(false)
+ .setEdgeFlags(edgeFlags)
+ .setStick(stick)
+ .build();
}
- private KeyState parseKeyState(DrawableType defaultBackgroundDrawableType,
- PopUpAttributes popUpAttributes)
+ private KeyState parseKeyState(KeyAttributes defaultKeyAttributes,
+ PopUpAttributes popUpAttributes, DisplayMetrics metrics)
throws XmlPullParserException, IOException {
XmlResourceParser parser = this.xmlResourceParser;
assertStartTag(parser, "KeyState");
String contentDescription;
- DrawableType backgroundDrawableType;
Set<KeyState.MetaState> metaStateSet;
Set<KeyState.MetaState> nextAddMetaState;
Set<KeyState.MetaState> nextRemoveMetaState;
@@ -651,8 +897,6 @@
try {
contentDescription = Objects.firstNonNull(
attributes.getText(KEY_STATE_CONTENT_DESCRIPTION_INDEX), "").toString();
- backgroundDrawableType = parseKeyBackgroundDrawableType(
- attributes, KEY_STATE_KEY_BACKGROUND_INDEX, defaultBackgroundDrawableType);
metaStateSet = parseMetaState(attributes, KEY_STATE_META_STATE_INDEX);
nextAddMetaState = parseMetaState(attributes, KEY_STATE_NEXT_META_STATE_INDEX);
nextRemoveMetaState = parseMetaState(attributes, KEY_STATE_NEXT_REMOVED_META_STATES_INDEX);
@@ -669,7 +913,7 @@
if (parser.getEventType() == XmlResourceParser.END_TAG) {
break;
}
- flickList.add(parseFlick(backgroundDrawableType, popUpAttributes));
+ flickList.add(parseFlick(defaultKeyAttributes, popUpAttributes, metrics));
}
// At the moment, we support only keys which has flick data to the CENTER direction.
@@ -690,8 +934,8 @@
flickList);
}
- private Flick parseFlick(DrawableType backgroundDrawableType,
- PopUpAttributes popUpAttributes)
+ private Flick parseFlick(KeyAttributes defaultKeyAttributes,
+ PopUpAttributes popUpAttributes, DisplayMetrics metrics)
throws XmlPullParserException, IOException {
XmlResourceParser parser = this.xmlResourceParser;
assertStartTag(parser, "Flick");
@@ -707,13 +951,13 @@
}
parser.next();
- KeyEntity entity = parseKeyEntity(backgroundDrawableType, popUpAttributes);
+ KeyEntity entity = parseKeyEntity(defaultKeyAttributes, popUpAttributes, metrics);
- if (entity.getLongPressKeyCode() != KeyEntity.INVALID_KEY_CODE &&
- direction != Flick.Direction.CENTER) {
+ if (entity.getLongPressKeyCode() != KeyEntity.INVALID_KEY_CODE
+ && direction != Flick.Direction.CENTER) {
throw new IllegalArgumentException(
- "longPressKeyCode can be set to only a KenEntity for CENTER direction: " +
- parser.getPositionDescription());
+ "longPressKeyCode can be set to only a KenEntity for CENTER direction: "
+ + parser.getPositionDescription());
}
parser.next();
@@ -722,8 +966,8 @@
return new Flick(direction, entity);
}
- private KeyEntity parseKeyEntity(
- DrawableType backgroundDrawableType, PopUpAttributes popUpAttributes)
+ private KeyEntity parseKeyEntity(KeyAttributes defaultKeyAttributes,
+ PopUpAttributes popUpAttributes, DisplayMetrics metrics)
throws XmlPullParserException, IOException {
XmlResourceParser parser = this.xmlResourceParser;
assertStartTag(parser, "KeyEntity");
@@ -731,11 +975,14 @@
int sourceId;
int keyCode;
int longPressKeyCode;
+ boolean longPressTimeoutTrigger;
int keyIconResourceId;
- String keyCharacter;
- @SuppressWarnings("unused")
- DrawableType keyBackgroundDrawableType;
+ Optional<String> keyCharacter = Optional.absent();
boolean flickHighlight;
+ int horizontalPadding;
+ int verticalPadding;
+ int iconWidth;
+ int iconHeight;
{
TypedArray attributes = resources.obtainAttributes(parser, KEY_ENTITY_ATTRIBUTES);
try {
@@ -743,15 +990,33 @@
if (!sourceIdSet.add(sourceId)) {
// Same sourceId is found.
throw new IllegalArgumentException(
- "Duplicataed sourceId is found: " + xmlResourceParser.getPositionDescription());
+ "Duplicataed sourceId (" + sourceId + ") is found: "
+ + xmlResourceParser.getPositionDescription());
}
keyCode = getCode(
- attributes.peekValue(KEY_ENTITY_KEY_CODE_INDEX), KeyEntity.INVALID_KEY_CODE);
- longPressKeyCode = getCode(attributes.peekValue(KEY_ENTITY_LONG_PRESS_KEY_CODE_INDEX),
- KeyEntity.INVALID_KEY_CODE);
+ Optional.fromNullable(attributes.peekValue(KEY_ENTITY_KEY_CODE_INDEX)),
+ KeyEntity.INVALID_KEY_CODE);
+ longPressKeyCode = getCode(
+ Optional.fromNullable(attributes.peekValue(KEY_ENTITY_LONG_PRESS_KEY_CODE_INDEX)),
+ KeyEntity.INVALID_KEY_CODE);
+ longPressTimeoutTrigger = attributes.getBoolean(KEY_ENTITY_LONG_PRESS_TIMEOUT_TRIGGER_INDEX,
+ true);
keyIconResourceId = attributes.getResourceId(KEY_ENTITY_KEY_ICON_INDEX, 0);
- keyCharacter = attributes.getString(KEY_ENTITY_KEY_CHAR_INDEX);
+ keyCharacter = Optional.fromNullable(attributes.getString(KEY_ENTITY_KEY_CHAR_INDEX));
flickHighlight = attributes.getBoolean(KEY_ENTITY_FLICK_HIGHLIGHT_INDEX, false);
+
+ horizontalPadding = getDimensionOrFraction(
+ Optional.fromNullable(attributes.peekValue(KEY_ENTITY_HORIZONTAL_PADDING_INDEX)),
+ keyboardWidth, defaultKeyAttributes.defaultHorizontalPadding, metrics);
+ verticalPadding = getDimensionOrFraction(
+ Optional.fromNullable(attributes.peekValue(KEY_ENTITY_VERTICAL_PADDING_INDEX)),
+ keyboardHeight, defaultKeyAttributes.defaultVerticalPadding, metrics);
+ iconWidth = getDimensionOrFraction(
+ Optional.fromNullable(attributes.peekValue(KEY_ENTITY_ICON_WIDTH_INDEX)),
+ keyboardWidth, defaultKeyAttributes.defaultIconWidth, metrics);
+ iconHeight = getDimensionOrFraction(
+ Optional.fromNullable(attributes.peekValue(KEY_ENTITY_ICON_HEIGHT_INDEX)),
+ keyboardHeight, defaultKeyAttributes.defaultIconHeight, metrics);
} finally {
attributes.recycle();
}
@@ -760,84 +1025,128 @@
parser.next();
ignoreWhiteSpaceAndComment(parser);
- PopUp popUp = null;
+ Optional<PopUp> popUp = Optional.absent();
if (parser.getEventType() == XmlResourceParser.START_TAG) {
- popUp = parsePopUp(popUpAttributes);
+ popUp = Optional.of(parsePopUp(popUpAttributes));
parser.next();
ignoreWhiteSpaceAndComment(parser);
}
assertEndTag(parser, "KeyEntity");
- return new KeyEntity(sourceId, keyCode, longPressKeyCode, keyIconResourceId, keyCharacter,
- backgroundDrawableType, flickHighlight, popUp);
+ return new KeyEntity(sourceId, keyCode, longPressKeyCode, longPressTimeoutTrigger,
+ keyIconResourceId, keyCharacter, flickHighlight, popUp,
+ horizontalPadding, verticalPadding, iconWidth, iconHeight);
}
- private PopUp parsePopUp(PopUpAttributes popUpAttributes)
+ private PopUp parsePopUp(PopUpAttributes defaultValue)
throws XmlPullParserException, IOException {
XmlResourceParser parser = this.xmlResourceParser;
assertStartTag(parser, "PopUp");
+ PopUpAttributes popUpAttributes;
+ TypedArray attributes = resources.obtainAttributes(parser, POPUP_ATTRIBUTES);
int popUpIconResourceId;
- {
- TypedArray attributes = resources.obtainAttributes(parser, R.styleable.PopUp);
- try {
- popUpIconResourceId = attributes.getResourceId(R.styleable.PopUp_popUpIcon, 0);
- } finally {
- attributes.recycle();
- }
+ int popUpLongPressIconResourceId;
+ try {
+ popUpAttributes = parsePopUpAttributes(attributes, defaultValue,
+ resources.getDisplayMetrics(),
+ keyboardWidth, POPUP_KEY_HEIGHT_INDEX,
+ POPUP_KEY_X_OFFSET_INDEX, POPUP_KEY_Y_OFFSET_INDEX,
+ POPUP_KEY_ICON_WIDTH_INDEX, POPUP_KEY_ICON_HEIGHT_INDEX);
+ popUpIconResourceId = attributes.getResourceId(POPUP_KEY_ICON_INDEX, 0);
+ popUpLongPressIconResourceId = attributes.getResourceId(POPUP_KEY_LONG_PRESS_ICON_INDEX, 0);
+ } finally {
+ attributes.recycle();
}
parser.next();
assertEndTag(parser, "PopUp");
return new PopUp(popUpIconResourceId,
- popUpAttributes.popUpWidth,
+ popUpLongPressIconResourceId,
popUpAttributes.popUpHeight,
popUpAttributes.popUpXOffset,
- popUpAttributes.popUpYOffset);
+ popUpAttributes.popUpYOffset,
+ popUpAttributes.popUpIconWidth,
+ popUpAttributes.popUpIconHeight);
}
private float parseFlickThreshold(TypedArray attributes, int index) {
float flickThreshold = attributes.getDimension(
index, resources.getDimension(R.dimen.default_flick_threshold));
- if (flickThreshold <= 0) {
- throw new IllegalArgumentException(
- "flickThreshold must be greater than 0. value = " + flickThreshold);
- }
+ Preconditions.checkArgument(
+ flickThreshold > 0, "flickThreshold must be greater than 0. value = " + flickThreshold);
return flickThreshold;
}
private static KeyAttributes parseKeyAttributes(
TypedArray attributes, KeyAttributes defaultValue, DisplayMetrics metrics,
int keyboardWidth, int keyboardHeight,
- int keyWidthIndex, int keyHeightIndex, int horizontalGapIndex, int verticalGapIndex,
+ int keyWidthIndex, int keyHeightIndex, int keyHorizontalLayoutWeightIndex,
+ int horizontalGapIndex, int verticalGapIndex,
+ int defaultIconWidthIndex, int defaultIconHeightIndex,
+ int defaultHorizontalPaddingIndex, int defaultVerticalPaddingIndex,
int keyBackgroundIndex) {
+
int keyWidth = (keyWidthIndex >= 0)
? getDimensionOrFraction(
- attributes.peekValue(keyWidthIndex), keyboardWidth,
+ Optional.fromNullable(attributes.peekValue(keyWidthIndex)), keyboardWidth,
defaultValue.width, metrics)
: defaultValue.width;
int keyHeight = (keyHeightIndex >= 0)
? getDimensionOrFraction(
- attributes.peekValue(keyHeightIndex), keyboardHeight,
+ Optional.fromNullable(attributes.peekValue(keyHeightIndex)), keyboardHeight,
defaultValue.height, metrics)
: defaultValue.height;
+ int keyHorizontalLayoutWeight = (keyHorizontalLayoutWeightIndex >= 0)
+ ? attributes.getInt(keyHorizontalLayoutWeightIndex, defaultValue.horizontalLayoutWeight)
+ : defaultValue.horizontalLayoutWeight;
int horizontalGap = (horizontalGapIndex >= 0)
? getDimensionOrFraction(
- attributes.peekValue(horizontalGapIndex),
+ Optional.fromNullable(attributes.peekValue(horizontalGapIndex)),
keyboardWidth, defaultValue.horizontalGap, metrics)
: defaultValue.horizontalGap;
int verticalGap = (verticalGapIndex >= 0)
? getDimensionOrFraction(
- attributes.peekValue(verticalGapIndex),
+ Optional.fromNullable(attributes.peekValue(verticalGapIndex)),
keyboardHeight, defaultValue.verticalGap, metrics)
: defaultValue.verticalGap;
+ int defaultIconWidth = (defaultIconWidthIndex >= 0)
+ ? getDimensionOrFraction(
+ Optional.fromNullable(attributes.peekValue(defaultIconWidthIndex)),
+ keyboardWidth, defaultValue.defaultIconWidth, metrics)
+ : defaultValue.defaultIconWidth;
+ int defaultIconHeight = (defaultIconHeightIndex >= 0)
+ ? getDimensionOrFraction(
+ Optional.fromNullable(attributes.peekValue(defaultIconHeightIndex)),
+ keyboardHeight, defaultValue.defaultIconHeight, metrics)
+ : defaultValue.defaultIconHeight;
+ int defaultHorizontalPadding = (defaultHorizontalPaddingIndex >= 0)
+ ? getDimensionOrFraction(
+ Optional.fromNullable(attributes.peekValue(defaultHorizontalPaddingIndex)),
+ keyboardWidth, defaultValue.defaultHorizontalPadding, metrics)
+ : defaultValue.defaultHorizontalPadding;
+ int defaultVerticalPadding = (defaultVerticalPaddingIndex >= 0)
+ ? getDimensionOrFraction(
+ Optional.fromNullable(attributes.peekValue(defaultVerticalPaddingIndex)),
+ keyboardWidth, defaultValue.defaultVerticalPadding, metrics)
+ : defaultValue.defaultVerticalPadding;
DrawableType keyBackgroundDrawableType = parseKeyBackgroundDrawableType(
attributes, keyBackgroundIndex, defaultValue.keyBackgroundDrawableType);
- return new KeyAttributes(
- keyWidth, keyHeight, horizontalGap, verticalGap, keyBackgroundDrawableType);
+ return KeyAttributes.newBuilder()
+ .setWidth(keyWidth)
+ .setHeight(keyHeight)
+ .setHorizontalLayoutWeight(keyHorizontalLayoutWeight)
+ .setHorizontalGap(horizontalGap)
+ .setVerticalGap(verticalGap)
+ .setDefaultHorizontalPadding(defaultHorizontalPadding)
+ .setDefaultVerticalPadding(defaultVerticalPadding)
+ .setDefaultIconWidth(defaultIconWidth)
+ .setDefaultIconHeight(defaultIconHeight)
+ .setKeybackgroundDrawableType(keyBackgroundDrawableType)
+ .build();
}
private static DrawableType parseKeyBackgroundDrawableType(
@@ -850,17 +1159,37 @@
}
private static PopUpAttributes parsePopUpAttributes(
- TypedArray attributes, DisplayMetrics metrics, int keyboardWidth,
- int popUpWidthIndex, int popUpHeightIndex, int popUpXOffsetIndex, int popUpYOffsetIndex) {
- int popUpWidth = getDimensionOrFraction(
- attributes.peekValue(popUpWidthIndex), keyboardWidth, 0, metrics);
- int popUpHeight = getDimensionOrFraction(
- attributes.peekValue(popUpHeightIndex), keyboardWidth, 0, metrics);
- int popUpXOffset = getDimensionOrFraction(
- attributes.peekValue(popUpXOffsetIndex), keyboardWidth, 0, metrics);
- int popUpYOffset = getDimensionOrFraction(
- attributes.peekValue(popUpYOffsetIndex), keyboardWidth, 0, metrics);
- return new PopUpAttributes(popUpWidth, popUpHeight, popUpXOffset, popUpYOffset);
+ TypedArray attributes, PopUpAttributes defaultValue, DisplayMetrics metrics,
+ int keyboardWidth, int popUpHeightIndex,
+ int popUpXOffsetIndex, int popUpYOffsetIndex,
+ int popUpIconWidthIndex, int popUpIconHeightIndex) {
+ int popUpHeight = (popUpHeightIndex >= 0)
+ ? getDimensionOrFraction(
+ Optional.fromNullable(attributes.peekValue(popUpHeightIndex)), keyboardWidth,
+ defaultValue.popUpHeight, metrics)
+ : defaultValue.popUpHeight;
+ int popUpXOffset = (popUpXOffsetIndex >= 0)
+ ? getDimensionOrFraction(
+ Optional.fromNullable(attributes.peekValue(popUpXOffsetIndex)), keyboardWidth,
+ defaultValue.popUpXOffset, metrics)
+ : defaultValue.popUpXOffset;
+ int popUpYOffset = (popUpYOffsetIndex >= 0)
+ ? getDimensionOrFraction(
+ Optional.fromNullable(attributes.peekValue(popUpYOffsetIndex)), keyboardWidth,
+ defaultValue.popUpYOffset, metrics)
+ : defaultValue.popUpYOffset;
+ int popUpIconWidth = (popUpIconWidthIndex >= 0)
+ ? getDimensionOrFraction(
+ Optional.fromNullable(attributes.peekValue(popUpIconWidthIndex)), keyboardWidth,
+ defaultValue.popUpIconWidth, metrics)
+ : defaultValue.popUpIconWidth;
+ int popUpIconHeight = (popUpIconHeightIndex >= 0)
+ ? getDimensionOrFraction(
+ Optional.fromNullable(attributes.peekValue(popUpIconHeightIndex)), keyboardWidth,
+ defaultValue.popUpIconHeight, metrics)
+ : defaultValue.popUpIconHeight;
+ return new PopUpAttributes(
+ popUpHeight, popUpXOffset, popUpYOffset, popUpIconWidth, popUpIconHeight);
}
/**
@@ -889,13 +1218,7 @@
return Flick.Direction.valueOf(attributes.getInt(index, Flick.Direction.CENTER.index));
}
- protected Keyboard buildKeyboard(
- Optional<String> contentDescription, List<Row> rowList, float flickThreshold) {
- return new Keyboard(Preconditions.checkNotNull(contentDescription),
- Preconditions.checkNotNull(rowList), flickThreshold);
- }
-
- protected Row buildRow(List<Key> keyList, int height, int verticalGap) {
+ private Row buildRow(List<Key> keyList, int height, int verticalGap) {
return new Row(keyList, height, verticalGap);
}
}
diff --git a/src/android/src/com/google/android/inputmethod/japanese/keyboard/KeyboardView.java b/src/android/src/com/google/android/inputmethod/japanese/keyboard/KeyboardView.java
index 6fa2d4c..ac47204 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/keyboard/KeyboardView.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/keyboard/KeyboardView.java
@@ -37,20 +37,17 @@
import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Input.TouchEvent;
import org.mozc.android.inputmethod.japanese.resources.R;
import org.mozc.android.inputmethod.japanese.view.DrawableCache;
-import org.mozc.android.inputmethod.japanese.view.MozcDrawableFactory;
-import org.mozc.android.inputmethod.japanese.view.SkinType;
+import org.mozc.android.inputmethod.japanese.view.Skin;
import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Optional;
import com.google.common.base.Preconditions;
+import com.google.common.collect.ForwardingMap;
import com.google.common.collect.Sets;
+import android.annotation.SuppressLint;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Canvas;
-import android.graphics.Color;
-import android.graphics.Shader.TileMode;
-import android.graphics.drawable.BitmapDrawable;
-import android.graphics.drawable.Drawable;
import android.os.Looper;
import android.support.v4.view.ViewCompat;
import android.text.InputType;
@@ -74,31 +71,85 @@
*
*/
public class KeyboardView extends View implements MemoryManageable {
+
private final BackgroundDrawableFactory backgroundDrawableFactory =
- new BackgroundDrawableFactory(getResources().getDisplayMetrics().density);
- private final DrawableCache drawableCache =
- new DrawableCache(new MozcDrawableFactory(getResources()));
+ new BackgroundDrawableFactory(getResources());
+ private final DrawableCache drawableCache = new DrawableCache(getResources());
private final PopUpPreview.Pool popupPreviewPool =
new PopUpPreview.Pool(
this, Looper.getMainLooper(), backgroundDrawableFactory, drawableCache);
private final long popupDismissDelay;
- private Keyboard keyboard;
+ private Optional<Keyboard> keyboard = Optional.absent();
// Do not update directly. Use setMetaState instead.
@VisibleForTesting Set<MetaState> metaState;
@VisibleForTesting final KeyboardViewBackgroundSurface backgroundSurface =
new KeyboardViewBackgroundSurface(backgroundDrawableFactory, drawableCache);
@VisibleForTesting boolean isKeyPressed;
- private final int keycodeSymbol;
private final float scaledDensity;
private int flickSensitivity;
private boolean popupEnabled = true;
- private SkinType skinType = SkinType.ORANGE_LIGHTGRAY;
private final KeyboardAccessibilityDelegate accessibilityDelegate;
+ /**
+ * Decorator class for {@code Map} for {@code KeyEventContextMap}.
+ * <p>
+ * When the number of the content is changed, meta state "HANDLING_TOUCH_EVENT"
+ * is updated.
+ */
+ private final class KeyEventContextMap extends ForwardingMap<Integer, KeyEventContext>{
+
+ private final Map<Integer, KeyEventContext> delegate;
+
+ private KeyEventContextMap(Map<Integer, KeyEventContext> delegate) {
+ this.delegate = delegate;
+ }
+
+ @Override
+ protected Map<Integer, KeyEventContext> delegate() {
+ return delegate;
+ }
+
+ @Override
+ public void clear() {
+ super.clear();
+ updateHandlingTouchEventMetaState();
+ }
+
+ @Override
+ public KeyEventContext put(Integer key, KeyEventContext value) {
+ KeyEventContext result = super.put(key, value);
+ updateHandlingTouchEventMetaState();
+ return result;
+ }
+
+ @Override
+ public void putAll(Map<? extends Integer, ? extends KeyEventContext> map) {
+ super.putAll(map);
+ updateHandlingTouchEventMetaState();
+ }
+
+ @Override
+ public KeyEventContext remove(Object object) {
+ KeyEventContext result = super.remove(object);
+ updateHandlingTouchEventMetaState();
+ return result;
+ }
+
+ private void updateHandlingTouchEventMetaState() {
+ if (keyEventContextMap.isEmpty()) {
+ updateMetaStates(Collections.<MetaState>emptySet(),
+ Collections.singleton(MetaState.HANDLING_TOUCH_EVENT));
+ } else {
+ updateMetaStates(Collections.singleton(MetaState.HANDLING_TOUCH_EVENT),
+ Collections.<MetaState>emptySet());
+ }
+ }
+ }
+
// A map from pointerId to KeyEventContext.
// Note: the pointerId should be small integers, e.g. 0, 1, 2... So if it turned out
// that the usage of Map is heavy, we probably can replace this map by a List or
@@ -107,9 +158,9 @@
// in the pressing order in flushPendingKeyEvent.
// Its initial capacity (16) and load factor (0.75) are just heuristics.
@VisibleForTesting public final Map<Integer, KeyEventContext> keyEventContextMap =
- new LinkedHashMap<Integer, KeyEventContext>(16, 0.75f, false);
+ new KeyEventContextMap(new LinkedHashMap<Integer, KeyEventContext>(16, 0.75f, false));
- private KeyEventHandler keyEventHandler = null;
+ private Optional<KeyEventHandler> keyEventHandler = Optional.absent();
// This constructor is package private for this unit test.
public KeyboardView(Context context) {
@@ -129,11 +180,37 @@
Context context = getContext();
Resources res = context.getResources();
popupDismissDelay = res.getInteger(R.integer.config_popup_dismiss_delay);
- keycodeSymbol = res.getInteger(R.integer.key_symbol);
scaledDensity = res.getDisplayMetrics().scaledDensity;
- accessibilityDelegate = new KeyboardAccessibilityDelegate(this);
+ accessibilityDelegate = new KeyboardAccessibilityDelegate(
+ this, new KeyboardAccessibilityDelegate.TouchEventEmulator() {
+ @Override
+ public void emulateLongPress(Key key) {
+ Preconditions.checkNotNull(key);
+ emulateImpl(key, true);
+ }
+
+ @Override
+ public void emulateKeyInput(Key key) {
+ Preconditions.checkNotNull(key);
+ emulateImpl(key, false);
+ }
+
+ private void emulateImpl(Key key, boolean isLongPress) {
+ KeyEventContext keyEventContext = new KeyEventContext(key, 0, 0, 0, 0, 0, 0, metaState);
+ processKeyEventContextForOnDownEvent(keyEventContext);
+ if (isLongPress && keyEventHandler.isPresent()) {
+ keyEventHandler.get().handleMessageLongPress(keyEventContext);
+ }
+ processKeyEventContextForOnUpEvent(keyEventContext);
+ // Without the invalidation this view cannot know that its content
+ // has been updated.
+ invalidate();
+ }
+ });
ViewCompat.setAccessibilityDelegate(this, accessibilityDelegate);
- setMetaStates(Collections.<MetaState>emptySet());
+ // Not sure if globe is really activated.
+ // However metastate requires GLOBE or NO_GLOBE state.
+ setMetaStates(EnumSet.of(MetaState.NO_GLOBE));
}
/**
@@ -153,24 +230,23 @@
return -flickSensitivity * 1.5f * scaledDensity;
}
- KeyEventContext getKeyEventContextByKey(Key key) {
+ private Optional<KeyEventContext> getKeyEventContextByKey(Key key) {
+ Preconditions.checkNotNull(key);
for (KeyEventContext keyEventContext : keyEventContextMap.values()) {
- if (keyEventContext != null && key == keyEventContext.key) {
- return keyEventContext;
+ if (key == keyEventContext.key) {
+ return Optional.of(keyEventContext);
}
}
- return null;
+ return Optional.absent();
}
private void disposeKeyEventContext(KeyEventContext keyEventContext) {
- if (keyEventContext == null) {
- return;
+ Preconditions.checkNotNull(keyEventContext);
+ if (keyEventHandler.isPresent()) {
+ keyEventHandler.get().cancelDelayedKeyEvent(keyEventContext);
}
- if (keyEventHandler != null) {
- keyEventHandler.cancelDelayedKeyEvent(keyEventContext);
- }
- backgroundSurface.requestUpdateKey(keyEventContext.key, null);
- if (popupEnabled) {
+ backgroundSurface.requestUpdateKey(keyEventContext.key, Optional.<Flick.Direction>absent());
+ if (popupEnabled || keyEventContext.longPressCallback.isPresent()) {
popupPreviewPool.releaseDelayed(keyEventContext.pointerId, popupDismissDelay);
}
}
@@ -186,7 +262,9 @@
keyEventContextMap.clear();
}
- private void flushPendingKeyEvent(TouchEvent relativeTouchEvent) {
+ private void flushPendingKeyEvent(Optional<TouchEvent> relativeTouchEvent) {
+ Preconditions.checkNotNull(relativeTouchEvent);
+
// Back up values and clear the map first to avoid stack overflow
// in case this method is invoked recursively from the callback.
// TODO(hidehiko): Refactor around keyEventHandler and keyEventContext. Also we should be
@@ -194,30 +272,30 @@
KeyEventContext[] keyEventContextArray =
keyEventContextMap.values().toArray(new KeyEventContext[keyEventContextMap.size()]);
keyEventContextMap.clear();
- KeyEventHandler keyEventHandler = this.keyEventHandler;
for (KeyEventContext keyEventContext : keyEventContextArray) {
int keyCode = keyEventContext.getKeyCode();
int pressedKeyCode = keyEventContext.getPressedKeyCode();
disposeKeyEventContext(keyEventContext);
- if (keyEventHandler != null) {
+ if (keyEventHandler.isPresent()) {
// Send relativeTouchEvent as well if exists.
- List<TouchEvent> touchEventList = relativeTouchEvent == null
- ? Collections.singletonList(keyEventContext.getTouchEvent())
- : Arrays.asList(relativeTouchEvent, keyEventContext.getTouchEvent());
- keyEventHandler.sendKey(keyCode, touchEventList);
- keyEventHandler.sendRelease(pressedKeyCode);
+ // TODO(hsumita): Confirm that we can put null on touchEventList or not.
+ List<TouchEvent> touchEventList = relativeTouchEvent.isPresent()
+ ? Arrays.asList(relativeTouchEvent.get(), keyEventContext.getTouchEvent().orNull())
+ : Collections.singletonList(keyEventContext.getTouchEvent().orNull());
+ keyEventHandler.get().sendKey(keyCode, touchEventList);
+ keyEventHandler.get().sendRelease(pressedKeyCode);
}
}
}
/** Set a given keyboard to this view, and send a request to update. */
public void setKeyboard(Keyboard keyboard) {
- flushPendingKeyEvent(null);
+ flushPendingKeyEvent(Optional.<TouchEvent>absent());
- this.keyboard = keyboard;
+ this.keyboard = Optional.of(keyboard);
updateMetaStates(Collections.<MetaState>emptySet(), MetaState.CHAR_TYPE_EXCLUSIVE_GROUP);
- accessibilityDelegate.setKeyboard(Optional.fromNullable(keyboard));
+ accessibilityDelegate.setKeyboard(this.keyboard);
this.drawableCache.clear();
backgroundSurface.requestUpdateKeyboard(keyboard, metaState);
backgroundSurface.requestUpdateSize(keyboard.contentRight - keyboard.contentLeft,
@@ -244,93 +322,107 @@
}
/** @return the current keyboard instance */
- public Keyboard getKeyboard() {
+ public Optional<Keyboard> getKeyboard() {
return keyboard;
}
- public void setSkinType(SkinType skinType) {
- this.skinType = skinType;
- drawableCache.setSkinType(skinType);
- backgroundDrawableFactory.setSkinType(skinType);
- resetBackground();
- if (keyboard != null) {
- backgroundSurface.requestUpdateKeyboard(keyboard, metaState);
- }
- }
-
@SuppressWarnings("deprecation")
- private void resetBackground() {
- Optional<Drawable> optionalKeyboardBackground =
- drawableCache.getDrawable(skinType.windowBackgroundResourceId);
- if (!optionalKeyboardBackground.isPresent()) {
- setBackgroundColor(Color.BLACK); // Set default background color.
- } else {
- Drawable keyboardBackground = optionalKeyboardBackground.get();
- if (keyboardBackground instanceof BitmapDrawable) {
- // If the background is bitmap resource, set repeat mode.
- BitmapDrawable.class.cast(keyboardBackground).setTileModeXY(
- TileMode.REPEAT, TileMode.REPEAT);
- }
- setBackgroundDrawable(keyboardBackground);
+ public void setSkin(Skin skin) {
+ Preconditions.checkNotNull(skin);
+ drawableCache.setSkin(skin);
+ backgroundDrawableFactory.setSkin(skin);
+ if (keyboard.isPresent()) {
+ backgroundSurface.requestUpdateKeyboard(keyboard.get(), metaState);
}
+ setBackgroundDrawable(skin.windowBackgroundDrawable.getConstantState().newDrawable());
}
public void setKeyEventHandler(KeyEventHandler keyEventHandler) {
// This method needs to be invoked from a thread which the looper held by older keyEventHandler
// points. Otherwise, there can be inconsistent state.
- KeyEventHandler oldKeyEventHandler = this.keyEventHandler;
- if (oldKeyEventHandler != null) {
+ Optional<KeyEventHandler> oldKeyEventHandler = this.keyEventHandler;
+ if (oldKeyEventHandler.isPresent()) {
// Cancel pending key event messages sent by this view.
for (KeyEventContext keyEventContext : keyEventContextMap.values()) {
- oldKeyEventHandler.cancelDelayedKeyEvent(keyEventContext);
+ oldKeyEventHandler.get().cancelDelayedKeyEvent(keyEventContext);
}
}
-
- this.keyEventHandler = keyEventHandler;
- accessibilityDelegate.setKeyEventHandler(Optional.fromNullable(keyEventHandler));
+ this.keyEventHandler = Optional.of(keyEventHandler);
}
@Override
public void onDraw(Canvas canvas) {
super.onDraw(canvas);
- if (keyboard == null) {
+ if (!keyboard.isPresent()) {
// We have nothing to do.
return;
}
-
+ // Draw keyboard.
backgroundSurface.update();
backgroundSurface.draw(canvas);
}
+ @SuppressLint("InlinedApi")
private static int getPointerIndex(int action) {
return
(action & MotionEvent.ACTION_POINTER_INDEX_MASK) >> MotionEvent.ACTION_POINTER_INDEX_SHIFT;
}
private void onDown(MotionEvent event) {
+ Preconditions.checkState(keyboard.isPresent());
+
int pointerIndex = getPointerIndex(event.getAction());
float x = event.getX(pointerIndex);
float y = event.getY(pointerIndex);
- Key key = getKeyByCoord(x, y);
- if (key == null) {
+ Optional<Key> optionalKey = getKeyByCoord(x, y);
+ if (!optionalKey.isPresent()) {
// Just ignore if a key isn't found.
return;
}
- if (getKeyEventContextByKey(key) != null) {
+ if (getKeyEventContextByKey(optionalKey.get()).isPresent()) {
// If the key is already pressed, we simply ignore event sequence related to this press.
return;
}
// Create a new key event context.
int pointerId = event.getPointerId(pointerIndex);
- float flickThreshold = Math.max(keyboard.getFlickThreshold() + getFlickSensitivityInDip(), 1);
- KeyEventContext keyEventContext = new KeyEventContext(
- key, pointerId, x, y, getWidth(), getHeight(),
+ float flickThreshold =
+ Math.max(keyboard.get().getFlickThreshold() + getFlickSensitivityInDip(), 1);
+ final KeyEventContext keyEventContext = new KeyEventContext(
+ optionalKey.get(), pointerId, x, y, getWidth(), getHeight(),
flickThreshold * flickThreshold, metaState);
+ // Show popup.
+ updatePopUp(keyEventContext, false);
+ Optional<KeyEntity> keyEntity =
+ KeyEventContext.getKeyEntity(keyEventContext.key, metaState,
+ Optional.of(Flick.Direction.CENTER));
+ if (keyEntity.isPresent() && keyEntity.get().getPopUp().isPresent()
+ && !keyEntity.get().isLongPressTimeoutTrigger()) {
+ keyEventContext.setLongPressCallback(new Runnable() {
+ @Override
+ public void run() {
+ updatePopUp(keyEventContext, true);
+ }
+ });
+ }
+
+ // Process the KeyEventContext (e.g., sending messages to KeyEventHandler, updating the surface,
+ // flushing pending key events and so on)
+ processKeyEventContextForOnDownEvent(keyEventContext);
+ // keyEventContextMap contains older event.
+ // TODO(hidehiko): Switch to ignoring new event, or overwriting the old event
+ // not to show unknown exceptions to users.
+ Preconditions.checkState(
+ keyEventContextMap.put(pointerId, keyEventContext) == null,
+ "Conflicting keyEventContext is found: " + pointerId);
+ }
+
+ private void processKeyEventContextForOnDownEvent(
+ final KeyEventContext keyEventContext) {
Set<MetaState> nextMetaStates = keyEventContext.getNextMetaStates(metaState);
if (!nextMetaStates.equals(metaState)) {
@@ -350,41 +442,29 @@
// Update the metaState and request to update the full keyboard image
// to update all key icons.
setMetaStates(nextMetaStates);
- backgroundSurface.requestUpdateKeyboard(keyboard, nextMetaStates);
+ backgroundSurface.requestUpdateKeyboard(keyboard.get(), nextMetaStates);
} else {
// Remember if a non-modifier key is pressed.
isKeyPressed = true;
// Request to update the image of only this key on the view.
- backgroundSurface.requestUpdateKey(key, keyEventContext.flickDirection);
+ backgroundSurface.requestUpdateKey(keyEventContext.key,
+ Optional.of(keyEventContext.flickDirection));
}
-
- if (keyEventContextMap.put(pointerId, keyEventContext) != null) {
- // keyEventContextMap contains older event.
- // TODO(hidehiko): Switch to ignoring new event, or overwriting the old event
- // not to show unknown exceptions to users.
- throw new IllegalStateException("Conflicting keyEventContext is found: " + pointerId);
- }
-
- // Show popup.
- if (popupEnabled) {
- popupPreviewPool.getInstance(pointerId)
- .showIfNecessary(key, keyEventContext.getCurrentPopUp());
- }
-
- if (keyEventHandler != null) {
+ if (keyEventHandler.isPresent()) {
// Clear pending key events and overwrite by this press key's one.
for (KeyEventContext context : keyEventContextMap.values()) {
- keyEventHandler.cancelDelayedKeyEvent(context);
+ keyEventHandler.get().cancelDelayedKeyEvent(context);
}
- keyEventHandler.maybeStartDelayedKeyEvent(keyEventContext);
-
+ keyEventHandler.get().maybeStartDelayedKeyEvent(keyEventContext);
// Finally we send a notification to listeners.
- keyEventHandler.sendPress(keyEventContext.getPressedKeyCode());
+ keyEventHandler.get().sendPress(keyEventContext.getPressedKeyCode());
}
}
private void onUp(MotionEvent event) {
+ Preconditions.checkState(keyboard.isPresent());
+
int pointerIndex = getPointerIndex(event.getAction());
KeyEventContext keyEventContext = keyEventContextMap.remove(event.getPointerId(pointerIndex));
if (keyEventContext == null) {
@@ -396,21 +476,22 @@
float y = event.getY(pointerIndex);
keyEventContext.update(x, y, TouchAction.TOUCH_UP, event.getEventTime() - event.getDownTime());
- int keyCode = keyEventContext.getKeyCode();
- int pressedKeyCode = keyEventContext.getPressedKeyCode();
+ processKeyEventContextForOnUpEvent(keyEventContext);
+ }
+
+ private void processKeyEventContextForOnUpEvent(KeyEventContext keyEventContext) {
disposeKeyEventContext(keyEventContext);
- if (keyEventHandler != null) {
- // In multi touch event, CursorView and SymbolInputView can't show by not primary touch event
- // because user may intend to input characters rapidly by multi touch, not change mode.
- // TODO(yoichio): Move this logic to ViewManager. "In theory" this should be done
- // in the class.
- if (keyCode != KeyEntity.INVALID_KEY_CODE &&
- (keyCode != keycodeSymbol || event.getAction() == MotionEvent.ACTION_UP)) {
- keyEventHandler.sendKey(keyCode,
- Collections.singletonList(keyEventContext.getTouchEvent()));
+ int keyCode = keyEventContext.getKeyCode();
+ int pressedKeyCode = keyEventContext.getPressedKeyCode();
+
+ if (keyEventHandler.isPresent()) {
+ if (keyCode != KeyEntity.INVALID_KEY_CODE) {
+ // TODO(hsumita): Confirm that we can put null as a touch event or not.
+ keyEventHandler.get().sendKey(keyCode,
+ Collections.singletonList(keyEventContext.getTouchEvent().orNull()));
}
- keyEventHandler.sendRelease(pressedKeyCode);
+ keyEventHandler.get().sendRelease(pressedKeyCode);
}
if (keyEventContext.isMetaStateToggleEvent()) {
@@ -420,7 +501,7 @@
// reset the keyboard's meta state to unmodified.
flushPendingKeyEvent(keyEventContext.getTouchEvent());
updateMetaStates(Collections.<MetaState>emptySet(), MetaState.CHAR_TYPE_EXCLUSIVE_GROUP);
- backgroundSurface.requestUpdateKeyboard(keyboard, Collections.<MetaState>emptySet());
+ backgroundSurface.requestUpdateKeyboard(keyboard.get(), Collections.<MetaState>emptySet());
}
} else {
if (!metaState.isEmpty() && keyEventContextMap.isEmpty()) {
@@ -434,7 +515,8 @@
}
if (!nextMetaState.equals(metaState)) {
setMetaStates(nextMetaState);
- backgroundSurface.requestUpdateKeyboard(keyboard, Collections.<MetaState>emptySet());
+ backgroundSurface.requestUpdateKeyboard(
+ keyboard.get(), Collections.<MetaState>emptySet());
}
}
}
@@ -451,17 +533,17 @@
Key key = keyEventContext.key;
if (keyEventContext.update(event.getX(i), event.getY(i), TouchAction.TOUCH_MOVE,
event.getEventTime() - event.getDownTime())) {
- // The key's state is updated from, at least, initial state, so we'll cancel the
- // pending key events.
- if (keyEventHandler != null) {
- keyEventHandler.cancelDelayedKeyEvent(keyEventContext);
+ if (keyEventHandler.isPresent()) {
+ // The key's state is updated from, at least, initial state, so we'll cancel the
+ // pending key events, and invoke new pending key events if necessary.
+ keyEventHandler.get().cancelDelayedKeyEvent(keyEventContext);
+ if (keyEventContext.flickDirection == Flick.Direction.CENTER) {
+ keyEventHandler.get().maybeStartDelayedKeyEvent(keyEventContext);
+ }
}
- if (popupEnabled) {
- popupPreviewPool.getInstance(keyEventContext.pointerId).showIfNecessary(
- key, keyEventContext.getCurrentPopUp());
- }
+ updatePopUp(keyEventContext, false);
}
- backgroundSurface.requestUpdateKey(key, keyEventContext.flickDirection);
+ backgroundSurface.requestUpdateKey(key, Optional.of(keyEventContext.flickDirection));
}
}
@@ -469,8 +551,8 @@
// other onXXX methods defined above.
private void onCancel(@SuppressWarnings("unused") MotionEvent event) {
resetState();
- if (keyEventHandler != null) {
- keyEventHandler.sendCancel();
+ if (keyEventHandler.isPresent()) {
+ keyEventHandler.get().sendCancel();
}
}
@@ -505,30 +587,31 @@
* Finds a key containing the given coordinate.
* @param x {@code x}-coordinate.
* @param y {@code y}-coordinate.
- * @return A corresponding {@code Key} instance, or {@code null} if not found.
+ * @return A corresponding {@code Key} instance, or {@code Optional.<Key>absent()} if not found.
*/
- @VisibleForTesting Key getKeyByCoord(float x, float y) {
- if (y < 0 || keyboard == null || keyboard.getRowList().isEmpty()) {
- return null;
+ @VisibleForTesting Optional<Key> getKeyByCoord(float x, float y) {
+ if (y < 0 || !keyboard.isPresent() || keyboard.get().getRowList().isEmpty()) {
+ return Optional.absent();
}
+ List<Row> rowList = keyboard.get().getRowList();
int rowBottom = 0;
- Row lastRow = keyboard.getRowList().get(keyboard.getRowList().size() - 1);
- for (Row row : keyboard.getRowList()) {
+ Row lastRow = rowList.get(rowList.size() - 1);
+ for (Row row : rowList) {
rowBottom += row.getHeight() + row.getVerticalGap();
Key prevKey = null;
for (Key key : row.getKeyList()) {
if ((// Stick vertical gaps to the keys above.
- y < key.getY() + key.getHeight() + row.getVerticalGap() ||
+ y < key.getY() + key.getHeight() + row.getVerticalGap()
// Or the key is at the bottom of the keyboard.
// Note: Some devices sense touch events of out-side of screen.
// So, for better user experiences, we return the bottom row
// if a user touches below the screen bottom boundary.
- row == lastRow ||
- key.getY() + key.getHeight() >= keyboard.contentBottom) &&
+ || row == lastRow
+ || key.getY() + key.getHeight() >= keyboard.get().contentBottom)
// Horizontal gap is included in the width,
// so we don't need to calculate horizontal gap in addition to width.
- x < key.getX() + key.getWidth() &&
+ && x < key.getX() + key.getWidth()
// The following condition selects a key hit in A, C, or D
// (C and D are on the same key), and excludes a key hit in B.
// +---+---+
@@ -539,21 +622,21 @@
// The condition y < rowBottom allows hits on A and C, and the other
// condition key.getX() <= x allows hits on C and D but not B.
// Hence, the hits on B are excluded.
- (y < rowBottom || key.getX() <= x)) {
+ && (y < rowBottom || key.getX() <= x)) {
if (!key.isSpacer()) {
- return key; // Found a key.
+ return Optional.of(key); // Found a key.
}
switch (key.getStick()) {
case LEFT:
if (prevKey != null) {
- return prevKey;
+ return Optional.of(prevKey);
}
break;
case EVEN:
// Split the spacer evenly, assuming we don't have any consecutive spacers.
if (x < key.getX() + key.getWidth() / 2 && prevKey != null) {
- return prevKey;
+ return Optional.of(prevKey);
}
break;
case RIGHT:
@@ -567,11 +650,11 @@
}
if ((y < rowBottom || row == lastRow) && prevKey != null) {
- return prevKey;
+ return Optional.of(prevKey);
}
}
- return null; // Not found.
+ return Optional.absent(); // Not found.
}
@Override
@@ -583,6 +666,7 @@
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
+ Preconditions.checkNotNull(event);
if (AccessibilityUtil.isTouchExplorationEnabled(getContext())) {
return accessibilityDelegate.dispatchTouchEvent(event);
}
@@ -591,6 +675,7 @@
@Override
public boolean dispatchHoverEvent(MotionEvent event) {
+ Preconditions.checkNotNull(event);
if (AccessibilityUtil.isTouchExplorationEnabled(getContext())) {
return accessibilityDelegate.dispatchHoverEvent(event);
}
@@ -598,7 +683,7 @@
}
@VisibleForTesting
- Set<MetaState> getMetaStates() {
+ public Set<MetaState> getMetaStates() {
return this.metaState;
}
@@ -607,6 +692,7 @@
Preconditions.checkArgument(MetaState.isValidSet(metaState));
this.metaState = metaState;
accessibilityDelegate.setMetaState(metaState);
+ backgroundSurface.requestMetaState(metaState);
}
public void updateMetaStates(Set<MetaState> addedMetaStates, Set<MetaState> removedMetaStates) {
@@ -615,6 +701,7 @@
setMetaStates(Sets.union(Sets.difference(metaState, removedMetaStates),
addedMetaStates).immutableCopy());
+ invalidate();
}
public void setPasswordField(boolean isPasswordField) {
@@ -625,31 +712,35 @@
Preconditions.checkNotNull(editorInfo);
Set<MetaState> metaStates = EnumSet.noneOf(MetaState.class);
- switch (editorInfo.imeOptions & EditorInfo.IME_MASK_ACTION) {
- case EditorInfo.IME_ACTION_DONE:
- metaStates.add(MetaState.ACTION_DONE);
- break;
- case EditorInfo.IME_ACTION_GO:
- metaStates.add(MetaState.ACTION_GO);
- break;
- case EditorInfo.IME_ACTION_NEXT:
- metaStates.add(MetaState.ACTION_NEXT);
- break;
- case EditorInfo.IME_ACTION_NONE:
- metaStates.add(MetaState.ACTION_NONE);
- break;
- case EditorInfo.IME_ACTION_PREVIOUS:
- metaStates.add(MetaState.ACTION_PREVIOUS);
- break;
- case EditorInfo.IME_ACTION_SEARCH:
- metaStates.add(MetaState.ACTION_SEARCH);
- break;
- case EditorInfo.IME_ACTION_SEND:
- metaStates.add(MetaState.ACTION_SEND);
- break;
- default:
- // Do nothing
+ // If IME_FLAG_NO_ENTER_ACTION is set, normal action icon should be shown.
+ if ((editorInfo.imeOptions & EditorInfo.IME_FLAG_NO_ENTER_ACTION) == 0) {
+ switch (editorInfo.imeOptions & EditorInfo.IME_MASK_ACTION) {
+ case EditorInfo.IME_ACTION_DONE:
+ metaStates.add(MetaState.ACTION_DONE);
+ break;
+ case EditorInfo.IME_ACTION_GO:
+ metaStates.add(MetaState.ACTION_GO);
+ break;
+ case EditorInfo.IME_ACTION_NEXT:
+ metaStates.add(MetaState.ACTION_NEXT);
+ break;
+ case EditorInfo.IME_ACTION_NONE:
+ metaStates.add(MetaState.ACTION_NONE);
+ break;
+ case EditorInfo.IME_ACTION_PREVIOUS:
+ metaStates.add(MetaState.ACTION_PREVIOUS);
+ break;
+ case EditorInfo.IME_ACTION_SEARCH:
+ metaStates.add(MetaState.ACTION_SEARCH);
+ break;
+ case EditorInfo.IME_ACTION_SEND:
+ metaStates.add(MetaState.ACTION_SEND);
+ break;
+ default:
+ // Do nothing
+ }
}
+
// InputType variation is *NOT* bit-fields in fact.
int clazz = editorInfo.inputType & InputType.TYPE_MASK_CLASS;
int variation = editorInfo.inputType & InputType.TYPE_MASK_VARIATION;
@@ -674,4 +765,25 @@
updateMetaStates(metaStates, Sets.union(MetaState.ACTION_EXCLUSIVE_GROUP,
MetaState.VARIATION_EXCLUSIVE_GROUP));
}
+
+ public void setGlobeButtonEnabled(boolean isGlobeButtonEnabled) {
+ if (isGlobeButtonEnabled) {
+ updateMetaStates(EnumSet.of(MetaState.GLOBE), EnumSet.of(MetaState.NO_GLOBE));
+ } else {
+ updateMetaStates(EnumSet.of(MetaState.NO_GLOBE), EnumSet.of(MetaState.GLOBE));
+ }
+ }
+
+ private void updatePopUp(KeyEventContext keyEventContext, boolean isDelayedPopUp) {
+ PopUpPreview popUpPreview = popupPreviewPool.getInstance(keyEventContext.pointerId);
+ // Even if popup is disabled by preference, delayed popup (== popup for long-press)
+ // is shown otherwise a user cannot know how long (s)he has to press the key
+ // to get a character corresponding to long-press.
+ if (popupEnabled || isDelayedPopUp) {
+ popUpPreview.showIfNecessary(
+ keyEventContext.key, keyEventContext.getCurrentPopUp(), isDelayedPopUp);
+ } else {
+ popUpPreview.dismiss();
+ }
+ }
}
diff --git a/src/android/src/com/google/android/inputmethod/japanese/keyboard/KeyboardViewBackgroundSurface.java b/src/android/src/com/google/android/inputmethod/japanese/keyboard/KeyboardViewBackgroundSurface.java
index e1d10d6..8cd0023 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/keyboard/KeyboardViewBackgroundSurface.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/keyboard/KeyboardViewBackgroundSurface.java
@@ -32,8 +32,11 @@
import org.mozc.android.inputmethod.japanese.MemoryManageable;
import org.mozc.android.inputmethod.japanese.MozcUtil;
import org.mozc.android.inputmethod.japanese.keyboard.BackgroundDrawableFactory.DrawableType;
+import org.mozc.android.inputmethod.japanese.keyboard.Flick.Direction;
import org.mozc.android.inputmethod.japanese.keyboard.KeyState.MetaState;
import org.mozc.android.inputmethod.japanese.view.DrawableCache;
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Optional;
import com.google.common.base.Preconditions;
import android.graphics.Bitmap;
@@ -49,6 +52,8 @@
import java.util.Map;
import java.util.Set;
+import javax.annotation.Nullable;
+
/**
* Implementation of the background surface for {@link KeyboardView}.
* This class takes care of double-buffering and diff-only-updating to improve the rendering
@@ -73,7 +78,7 @@
* backgroundSurface.requestUpdateKey(key3, Flick.Direction.RIGHT);
*
* // Set flick direction to null means the key is released.
- * backgroundSurface.requestUpdateKey(key1, null);
+ * backgroundSurface.requestUpdateKey(key1, Optional.<Direction>absent());
*
* // Actual update is done below.
* backgroundSurface.update();
@@ -85,12 +90,12 @@
* This class is exposed as public in order to mock for testing purpose.
*
*/
-public class KeyboardViewBackgroundSurface implements MemoryManageable {
+@VisibleForTesting public class KeyboardViewBackgroundSurface implements MemoryManageable {
/**
* A simple rendering related utilities for keyboard rendering.
*/
- interface SurfaceCanvas {
+ @VisibleForTesting interface SurfaceCanvas {
/**
* Clears a rectangle region of
@@ -123,12 +128,11 @@
private final Canvas canvas;
SurfaceCanvasImpl(Canvas canvas) {
- this.canvas = canvas;
+ this.canvas = Preconditions.checkNotNull(canvas);
}
@Override
public void clearRegion(int x, int y, int width, int height) {
- Canvas canvas = this.canvas;
int saveCount = canvas.save();
try {
canvas.clipRect(x, y, x + width, y + height, Op.REPLACE);
@@ -139,7 +143,7 @@
}
@Override
- public void drawDrawable(Drawable drawable, int x, int y, int width, int height) {
+ public void drawDrawable(@Nullable Drawable drawable, int x, int y, int width, int height) {
if (drawable == null) {
return;
}
@@ -149,7 +153,7 @@
@Override
public void drawDrawableAtCenterWithKeepAspectRatio(
- Drawable drawable, int x, int y, int width, int height) {
+ @Nullable Drawable drawable, int x, int y, int width, int height) {
if (drawable == null) {
return;
}
@@ -164,8 +168,6 @@
private void drawDrawableInternal(Drawable drawable, int x, int y, int width, int height,
float scale) {
- Canvas canvas = this.canvas;
-
int saveCount = canvas.save();
try {
canvas.translate(x, y);
@@ -205,24 +207,23 @@
private final BackgroundDrawableFactory backgroundDrawableFactory;
private final DrawableCache drawableCache;
- public KeyboardViewBackgroundSurface(
- BackgroundDrawableFactory backgroundDrawableFactory, DrawableCache drawableCache) {
- this.backgroundDrawableFactory = backgroundDrawableFactory;
- this.drawableCache = drawableCache;
- }
-
// The current image and its rendering object.
- // surfaceCanvas is package private for testing purpose.
- private Bitmap surfaceBitmap;
- SurfaceCanvas surfaceCanvas;
+ private Optional<Bitmap> surfaceBitmap = Optional.absent();
+ @VisibleForTesting Optional<SurfaceCanvas> surfaceCanvas = Optional.absent();
// Width and height this background surface is to be in pixels
private int requestedWidth;
private int requestedHeight;
private boolean fullUpdateRequested;
- private Keyboard requestedKeyboard;
- private Set<MetaState> requestedMetaState;
+ private Optional<Keyboard> requestedKeyboard = Optional.absent();
+ private Set<MetaState> requestedMetaState = Collections.emptySet();
+
+ public KeyboardViewBackgroundSurface(
+ BackgroundDrawableFactory backgroundDrawableFactory, DrawableCache drawableCache) {
+ this.backgroundDrawableFactory = Preconditions.checkNotNull(backgroundDrawableFactory);
+ this.drawableCache = Preconditions.checkNotNull(drawableCache);
+ }
/**
* A set of pending keys to be updated.
@@ -233,29 +234,30 @@
* TODO(hidehiko): We should have direction state in somewhere else, not in the pending requests,
* so that we can re-render the correct image even if we have any sequence of requests.
*/
- private final Map<Key, Flick.Direction> pendingKeys = new HashMap<Key, Flick.Direction>();
+ @VisibleForTesting
+ final Map<Key, Optional<Flick.Direction>> pendingKeys =
+ new HashMap<Key, Optional<Flick.Direction>>();
/**
* Resets and release the current image this instance holds.
* By this method's invocation, we assume all key's directions are also reset.
*/
public void reset() {
- if (surfaceBitmap != null) {
- surfaceBitmap.recycle();
- surfaceBitmap = null;
+ if (surfaceBitmap.isPresent()) {
+ surfaceBitmap.get().recycle();
+ surfaceBitmap = Optional.absent();
}
- surfaceCanvas = null;
+ surfaceCanvas = Optional.absent();
pendingKeys.clear();
}
/**
* Adds the given {@code key} to the pending key set to render it lazily.
* In other words, the key isn't rendered until {@link #update()} is invoked.
- * If {@code key} is {@code null}, it will be just ignored.
*/
- public void requestUpdateKey(Key key, Flick.Direction flickDirection) {
- if ((key != null) && !key.isSpacer()) {
- pendingKeys.put(key, flickDirection);
+ public void requestUpdateKey(Key key, Optional<Flick.Direction> flickDirection) {
+ if (!Preconditions.checkNotNull(key).isSpacer()) {
+ pendingKeys.put(key, Preconditions.checkNotNull(flickDirection));
}
}
@@ -273,7 +275,7 @@
* This also cancels all key's direction for now.
*/
public void requestUpdateKeyboard(Keyboard keyboard, Set<MetaState> metaState) {
- requestedKeyboard = Preconditions.checkNotNull(keyboard);
+ requestedKeyboard = Optional.of(keyboard);
requestedMetaState = Preconditions.checkNotNull(metaState);
fullUpdateRequested = true;
@@ -283,6 +285,41 @@
}
/**
+ * Requests new {@code metaState} to be rendered on this surface.
+ *
+ * This method requests redraw only the keys which are required to be redrawn according to
+ * metastate's change.
+ * This also cancels such keys' direction for now.
+ */
+ public void requestMetaState(Set<MetaState> newMetaState) {
+ Preconditions.checkNotNull(newMetaState);
+
+ Set<MetaState> previousMetaState = requestedMetaState;
+ requestedMetaState = newMetaState;
+
+ if (newMetaState.equals(previousMetaState) || !requestedKeyboard.isPresent()) {
+ return;
+ }
+
+ // Update only the keys which should update corresponding KeyState based on given metaState.
+ for (Row row : requestedKeyboard.get().getRowList()) {
+ for (Key key : row.getKeyList()) {
+ KeyState previousKeyState = key.getKeyState(previousMetaState).orNull();
+ KeyState newKeyState = key.getKeyState(newMetaState).orNull();
+ // Intentionally using != operator instead of equals method.
+ // - Faster than full-spec equals method.
+ // - The values of Optional which are returned by Key#getKeyState are always
+ // the same object so equals is overkill.
+ if (previousKeyState != newKeyState) {
+ // Request to draw the key.
+ // pendingKeys may have already contained corresponding key but overwrite here.
+ pendingKeys.put(key, Optional.<Direction>absent());
+ }
+ }
+ }
+ }
+
+ /**
* Actually updates the image this instance holds based on pending update requests.
*/
public void update() {
@@ -292,7 +329,7 @@
fullUpdateRequested = true;
}
- if (requestedKeyboard == null) {
+ if (!requestedKeyboard.isPresent()) {
// We have nothing to do.
return;
}
@@ -311,25 +348,26 @@
}
/**
- * Returns {@code true} iff (re-)initialization is needed. This method is package private
- * just for testing purpose.
+ * Returns {@code true} iff (re-)initialization is needed.
*/
- boolean isInitializationNeeded() {
+ @VisibleForTesting boolean isInitializationNeeded() {
// We need to re-create background buffer if
// - no initialization is done (after construction or reset).
// - the size of view has been changed.
- Bitmap bitmap = this.surfaceBitmap;
- return (bitmap == null)
- || (bitmap.getWidth() != requestedWidth)
- || (bitmap.getHeight() != requestedHeight);
+ Optional<Bitmap> bitmap = surfaceBitmap;
+ return (!bitmap.isPresent())
+ || (bitmap.get().getWidth() != requestedWidth)
+ || (bitmap.get().getHeight() != requestedHeight);
}
void initialize() {
- if (surfaceBitmap != null) {
- surfaceBitmap.recycle();
+ if (surfaceBitmap.isPresent()) {
+ surfaceBitmap.get().recycle();
}
- surfaceBitmap = MozcUtil.createBitmap(requestedWidth, requestedHeight, Bitmap.Config.ARGB_8888);
- surfaceCanvas = new SurfaceCanvasImpl(new Canvas(surfaceBitmap));
+ surfaceBitmap = Optional.of(
+ MozcUtil.createBitmap(requestedWidth, requestedHeight, Bitmap.Config.ARGB_8888));
+ surfaceCanvas = Optional.<SurfaceCanvas>of(
+ new SurfaceCanvasImpl(new Canvas(surfaceBitmap.get())));
}
/**
@@ -337,57 +375,84 @@
* It is required to invoke update() method before this method's invocation.
*/
public void draw(Canvas canvas) {
- canvas.drawBitmap(surfaceBitmap, requestedKeyboard.contentLeft, requestedKeyboard.contentTop,
- null);
+ canvas.drawBitmap(
+ surfaceBitmap.orNull(), requestedKeyboard.get().contentLeft,
+ requestedKeyboard.get().contentTop, null);
}
private void clearCanvas() {
- Bitmap bitmap = this.surfaceBitmap;
- surfaceCanvas.clearRegion(0, 0, bitmap.getWidth(), bitmap.getHeight());
+ if (surfaceBitmap.isPresent() && surfaceCanvas.isPresent()) {
+ Bitmap bitmap = surfaceBitmap.get();
+ surfaceCanvas.get().clearRegion(0, 0, bitmap.getWidth(), bitmap.getHeight());
+ }
}
- private void renderKey(Key key, Flick.Direction flickDirection) {
+ private void renderKey(Key key, Optional<Flick.Direction> flickDirection) {
+ Preconditions.checkNotNull(key);
+ Preconditions.checkNotNull(flickDirection);
+ Preconditions.checkState(surfaceCanvas.isPresent());
+ Preconditions.checkState(requestedKeyboard.isPresent());
+ SurfaceCanvas canvas = surfaceCanvas.get();
+
int horizontalGap = key.getHorizontalGap();
int leftGap = horizontalGap / 2;
- boolean isPressed = flickDirection != null;
+ boolean isPressed = flickDirection.isPresent();
// We split the gap to both sides evenly.
- int x = key.getX() + leftGap - requestedKeyboard.contentLeft;
- int y = key.getY() - requestedKeyboard.contentTop;
- int width = key.getWidth() - horizontalGap;
- int height = key.getHeight();
+ int x = key.getX() + leftGap - requestedKeyboard.get().contentLeft;
+ int y = key.getY() - requestedKeyboard.get().contentTop;
+ // Given width/height for the key.
+ // The icon is drawn inside the width/height.
+ int givenWidth = key.getWidth() - horizontalGap;
+ int givenHeight = key.getHeight();
- KeyEntity keyEntity = getKeyEntityForRendering(key, requestedMetaState, flickDirection);
- surfaceCanvas.drawDrawable(getKeyBackground(keyEntity, isPressed), x, y, width, height);
- if (keyEntity != null && keyEntity.isFlickHighlightEnabled() &&
- KeyEventContext.getKeyEntity(key, requestedMetaState, flickDirection) == keyEntity) {
- surfaceCanvas.drawDrawable(
- backgroundDrawableFactory.getDrawable(FLICK_DRAWABLE_TYPE_MAP.get(flickDirection)),
- x, y, width, height);
+ canvas.drawDrawable(getKeyBackground(key, isPressed).orNull(), x, y, givenWidth, givenHeight);
+ Optional<KeyEntity> keyEntity =
+ getKeyEntityForRendering(key, requestedMetaState, flickDirection);
+ if (flickDirection.isPresent() && keyEntity.isPresent()
+ && keyEntity.get().isFlickHighlightEnabled()
+ && KeyEventContext.getKeyEntity(key, requestedMetaState, flickDirection)
+ .equals(keyEntity)) {
+ DrawableType drawableType = FLICK_DRAWABLE_TYPE_MAP.get(flickDirection.get());
+ Drawable backgroundDrawable = (drawableType != null)
+ ? backgroundDrawableFactory.getDrawable(drawableType) : null;
+ canvas.drawDrawable(backgroundDrawable, x, y, givenWidth, givenHeight);
}
- surfaceCanvas.drawDrawableAtCenterWithKeepAspectRatio(
- getKeyIcon(drawableCache, keyEntity, isPressed), x, y, width, height);
+ int horizontalPadding = keyEntity.isPresent() ? keyEntity.get().getHorizontalPadding() : 0;
+ int verticalPadding = keyEntity.isPresent() ? keyEntity.get().getVerticalPadding() : 0;
+ int iconWidth = keyEntity.isPresent() ? keyEntity.get().getIconWidth() : givenWidth;
+ int iconHeight = keyEntity.isPresent() ? keyEntity.get().getIconHeight() : givenHeight;
+ iconWidth = Math.min(iconWidth, givenWidth - horizontalPadding * 2);
+ iconHeight = Math.min(iconHeight, givenHeight - verticalPadding * 2);
+ canvas.drawDrawableAtCenterWithKeepAspectRatio(
+ getKeyIcon(drawableCache, keyEntity, isPressed).orNull(),
+ x + (givenWidth - iconWidth) / 2, y + (givenHeight - iconHeight) / 2,
+ iconWidth, iconHeight);
}
/**
* Draws all keys in the keyboard.
*/
private void renderKeyboard() {
- for (Row row : requestedKeyboard.getRowList()) {
+ for (Row row : requestedKeyboard.get().getRowList()) {
for (Key key : row.getKeyList()) {
- if (!key.isSpacer()) {
- renderKey(key, pendingKeys.get(key));
+ Optional<Direction> direction = pendingKeys.get(key);
+ if (direction == null) {
+ renderKey(key, Optional.<Direction>absent());
+ } else {
+ renderKey(key, direction);
}
}
}
}
private void renderPendingKeys() {
+ Preconditions.checkState(surfaceCanvas.isPresent());
// The canvas object is used many times, so cache it on local stack.
- SurfaceCanvas canvas = this.surfaceCanvas;
- int offsetX = requestedKeyboard.contentLeft;
- int offsetY = requestedKeyboard.contentTop;
- for (Map.Entry<Key, Flick.Direction> entry : pendingKeys.entrySet()) {
+ SurfaceCanvas canvas = surfaceCanvas.get();
+ int offsetX = requestedKeyboard.get().contentLeft;
+ int offsetY = requestedKeyboard.get().contentTop;
+ for (Map.Entry<Key, Optional<Flick.Direction>> entry : pendingKeys.entrySet()) {
Key key = entry.getKey();
// Clear the key's region and then draw the key there.
@@ -399,55 +464,52 @@
/**
* Returns KeyEntity which should be used for the {@code key}'s rendering with the given state.
- * {@code null} will be returned if we don't need to render the key.
- * This is package private for testing purpose.
+ * {@code Optional.absent()} will be returned if we don't need to render the key.
*/
- static KeyEntity getKeyEntityForRendering(
- Key key, Set<MetaState> metaState, Flick.Direction flickDirection) {
- if (flickDirection != null) {
+ @VisibleForTesting static Optional<KeyEntity> getKeyEntityForRendering(
+ Key key, Set<MetaState> metaState, Optional<Flick.Direction> flickDirection) {
+ if (flickDirection.isPresent()) {
// If the key is under flick state, check if there is corresponding key entity for the
// direction first.
- KeyEntity keyEntity = KeyEventContext.getKeyEntity(key, metaState, flickDirection);
- if (keyEntity != null) {
+ Optional<KeyEntity> keyEntity = KeyEventContext.getKeyEntity(key, metaState, flickDirection);
+ if (keyEntity.isPresent()) {
return keyEntity;
}
}
// Use CENTER direction for released key, or a key flicked to a unsupported direction.
- return KeyEventContext.getKeyEntity(key, metaState, Flick.Direction.CENTER);
+ return KeyEventContext.getKeyEntity(key, metaState, Optional.of(Flick.Direction.CENTER));
}
- private static Drawable setDrawableState(Drawable drawable, boolean isPressed) {
- if (drawable != null) {
- drawable.setState(isPressed ? STATE_PRESSED : STATE_DEFAULT);
+ private static Optional<Drawable> setDrawableState(
+ Optional<Drawable> drawable, boolean isPressed) {
+ if (drawable.isPresent()) {
+ drawable.get().setState(isPressed ? STATE_PRESSED : STATE_DEFAULT);
}
return drawable;
}
/**
* Returns {@code Drawable} for the given key's background with setting appropriate state.
- * This method is package private just for testing purpose.
*/
- Drawable getKeyBackground(KeyEntity keyEntity, boolean isPressed) {
- if (keyEntity == null) {
- return null;
- }
+ @VisibleForTesting Optional<Drawable> getKeyBackground(Key key, boolean isPressed) {
+ Preconditions.checkNotNull(key);
return setDrawableState(
- backgroundDrawableFactory.getDrawable(keyEntity.getKeyBackgroundDrawableType()),
+ Optional.of(backgroundDrawableFactory.getDrawable(key.getKeyBackgroundDrawableType())),
isPressed);
}
/**
* Returns {@code Drawable} for the given key's icon with setting appropriate state.
- * This method is package private just for testing purpose.
*/
- static Drawable getKeyIcon(
- DrawableCache drawableCache, KeyEntity keyEntity, boolean isPressed) {
- if (keyEntity == null) {
- return null;
+ @VisibleForTesting static Optional<Drawable> getKeyIcon(
+ DrawableCache drawableCache, Optional<KeyEntity> keyEntity, boolean isPressed) {
+ if (!keyEntity.isPresent()) {
+ return Optional.absent();
}
+
return setDrawableState(
- drawableCache.getDrawable(keyEntity.getKeyIconResourceId()).orNull(), isPressed);
+ drawableCache.getDrawable(keyEntity.get().getKeyIconResourceId()), isPressed);
}
@Override
diff --git a/src/android/src/com/google/android/inputmethod/japanese/keyboard/PopUp.java b/src/android/src/com/google/android/inputmethod/japanese/keyboard/PopUp.java
index ffc11be..81527cc 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/keyboard/PopUp.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/keyboard/PopUp.java
@@ -29,29 +29,36 @@
package org.mozc.android.inputmethod.japanese.keyboard;
+
/**
*/
public class PopUp {
+
private final int popUpIconResourceId;
- private final int width;
+ private final int longPressPopUpIconResourceId;
private final int height;
private final int xOffset;
private final int yOffset;
+ private final int iconWidth;
+ private final int iconHeight;
- public PopUp(int popUpIconResourceId, int width, int height, int xOffset, int yOffset) {
+ public PopUp(int popUpIconResourceId, int popUpLongPressIconResourceId,
+ int height, int xOffset, int yOffset, int iconWidth, int iconHeight) {
this.popUpIconResourceId = popUpIconResourceId;
- this.width = width;
+ this.longPressPopUpIconResourceId = popUpLongPressIconResourceId;
this.height = height;
this.xOffset = xOffset;
this.yOffset = yOffset;
+ this.iconWidth = iconWidth;
+ this.iconHeight = iconHeight;
}
public int getPopUpIconResourceId() {
return popUpIconResourceId;
}
- public int getWidth() {
- return width;
+ public int getPopUpLongPressIconResourceId() {
+ return longPressPopUpIconResourceId;
}
public int getHeight() {
@@ -65,4 +72,12 @@
public int getYOffset() {
return yOffset;
}
+
+ public int getIconWidth() {
+ return iconWidth;
+ }
+
+ public int getIconHeight() {
+ return iconHeight;
+ }
}
diff --git a/src/android/src/com/google/android/inputmethod/japanese/keyboard/PopUpPreview.java b/src/android/src/com/google/android/inputmethod/japanese/keyboard/PopUpPreview.java
index a14ca79..727ce16 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/keyboard/PopUpPreview.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/keyboard/PopUpPreview.java
@@ -30,18 +30,21 @@
package org.mozc.android.inputmethod.japanese.keyboard;
import org.mozc.android.inputmethod.japanese.keyboard.BackgroundDrawableFactory.DrawableType;
+import org.mozc.android.inputmethod.japanese.resources.R;
+import org.mozc.android.inputmethod.japanese.ui.PopUpLayouter;
import org.mozc.android.inputmethod.japanese.view.DrawableCache;
import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Optional;
+import com.google.common.base.Preconditions;
+import android.annotation.SuppressLint;
+import android.content.res.Resources;
+import android.graphics.drawable.Drawable;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.util.SparseArray;
-import android.view.Gravity;
import android.view.View;
-import android.view.ViewGroup;
-import android.view.ViewGroup.MarginLayoutParams;
-import android.widget.FrameLayout;
import android.widget.ImageView;
import java.util.ArrayList;
@@ -57,7 +60,7 @@
* Production clients shouldn't use this class from outside of this package.
*
*/
-public class PopUpPreview {
+@VisibleForTesting public class PopUpPreview {
/**
* For performance reason, we want to reuse instances of {@link PopUpPreview}.
@@ -68,6 +71,7 @@
*
*/
static class Pool {
+
// Typically 2 or 3 popups are shown in maximum.
private final SparseArray<PopUpPreview> pool = new SparseArray<PopUpPreview>(3);
private final List<PopUpPreview> freeList = new ArrayList<PopUpPreview>();
@@ -78,13 +82,13 @@
Pool(View parent, Looper looper,
BackgroundDrawableFactory backgroundDrawableFactory, DrawableCache drawableCache) {
- this.parent = parent;
- this.backgroundDrawableFactory = backgroundDrawableFactory;
- this.drawableCache = drawableCache;
- this.dismissHandler = new Handler(looper, new Handler.Callback() {
+ this.parent = Preconditions.checkNotNull(parent);
+ this.backgroundDrawableFactory = Preconditions.checkNotNull(backgroundDrawableFactory);
+ this.drawableCache = Preconditions.checkNotNull(drawableCache);
+ this.dismissHandler = new Handler(Preconditions.checkNotNull(looper), new Handler.Callback() {
@Override
public boolean handleMessage(Message message) {
- PopUpPreview preview = PopUpPreview.class.cast(message.obj);
+ PopUpPreview preview = PopUpPreview.class.cast(Preconditions.checkNotNull(message).obj);
preview.dismiss();
freeList.add(preview);
return true;
@@ -133,96 +137,81 @@
}
}
- private static final float POPUP_VIEW_PADDING = 12f;
-
- private final int padding;
- private final View parent;
private final BackgroundDrawableFactory backgroundDrawableFactory;
private final DrawableCache drawableCache;
- @VisibleForTesting final ImageView popupView;
+ @VisibleForTesting final PopUpLayouter<ImageView> popUp;
protected PopUpPreview(
View parent, BackgroundDrawableFactory backgroundDrawableFactory,
DrawableCache drawableCache) {
- this.parent = parent;
- this.backgroundDrawableFactory = backgroundDrawableFactory;
- this.drawableCache = drawableCache;
- this.popupView = new ImageView(parent.getContext());
- popupView.setVisibility(View.GONE);
- View rootView = parent.getRootView();
- if (rootView != null) {
- FrameLayout screenContent =
- FrameLayout.class.cast(rootView.findViewById(android.R.id.content));
- if (screenContent != null) {
- screenContent.addView(
- popupView, new FrameLayout.LayoutParams(0, 0, Gravity.LEFT | Gravity.TOP));
- }
- }
- padding = (int) (popupView.getResources().getDisplayMetrics().density * POPUP_VIEW_PADDING);
+ this.backgroundDrawableFactory = Preconditions.checkNotNull(backgroundDrawableFactory);
+ this.drawableCache = Preconditions.checkNotNull(drawableCache);
+ ImageView popUpView = new ImageView(Preconditions.checkNotNull(parent).getContext());
+ // To use Canvas#drawPicture(), the view shouldn't be h/w accelerated.
+ popUpView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
+ popUpView.setVisibility(View.GONE);
+ this.popUp = new PopUpLayouter<ImageView>(parent, popUpView);
}
/**
- * Shows the popup preview of the given {@code key} and {@code popup} if needed.
+ * Shows the pop-up preview of the given {@code key} and {@code optionalPopup} if needed.
*/
+ @SuppressLint("NewApi")
@SuppressWarnings("deprecation")
- protected void showIfNecessary(Key key, PopUp popup) {
- if (key == null || popup == null) {
- // No images to be rendered.
+ protected void showIfNecessary(Key key, Optional<PopUp> optionalPopup, boolean isDelayedPopup) {
+ Preconditions.checkNotNull(key);
+ if (!Preconditions.checkNotNull(optionalPopup).isPresent()) {
+ hidePopupView();
+ return;
+ }
+ PopUp popup = optionalPopup.get();
+ Optional<Drawable> popUpIconDrawable = drawableCache.getDrawable(isDelayedPopup
+ ? popup.getPopUpLongPressIconResourceId() : popup.getPopUpIconResourceId());
+ if (!popUpIconDrawable.isPresent()) {
hidePopupView();
return;
}
- // Set images.
- popupView.setImageDrawable(drawableCache.getDrawable(popup.getPopUpIconResourceId()).orNull());
+ ImageView popupView = popUp.getContentView();
+ Resources resources = popupView.getContext().getResources();
+ float density = resources.getDisplayMetrics().density;
+ int popUpWindowPadding = (int) (BackgroundDrawableFactory.POPUP_WINDOW_PADDING * density);
+ int width =
+ Math.min(key.getWidth(), resources.getDimensionPixelSize(R.dimen.popup_width_limitation))
+ + popUpWindowPadding * 2;
+ int height = popup.getHeight() + popUpWindowPadding * 2;
+
+ popupView.setImageDrawable(popUpIconDrawable.get());
popupView.setBackgroundDrawable(
backgroundDrawableFactory.getDrawable(DrawableType.POPUP_BACKGROUND_WINDOW));
- popupView.setPadding(padding, padding, padding, padding);
- // Calculate the location to show the popup in window's coordinate system.
+ Preconditions.checkState(popup.getIconWidth() != 0 || popup.getIconHeight() != 0);
+ int horizontalPadding = (popup.getIconWidth() == 0)
+ ? popUpWindowPadding : (width - popup.getIconWidth()) / 2;
+ int verticalPadding = (popup.getIconHeight() == 0)
+ ? popUpWindowPadding : (height - popup.getIconHeight()) / 2;
+ popupView.setPadding(horizontalPadding, verticalPadding, horizontalPadding, verticalPadding);
+
+ // Calculate the location to show the pop-up in window's coordinate system.
int centerX = key.getX() + key.getWidth() / 2;
int centerY = key.getY() + key.getHeight() / 2;
- int width = popup.getWidth();
- int height = popup.getHeight();
-
- ViewGroup.LayoutParams layoutParams = popupView.getLayoutParams();
- if (layoutParams != null) {
- layoutParams.width = width;
- layoutParams.height = height;
- }
-
- if (MarginLayoutParams.class.isInstance(layoutParams)) {
- int x = centerX + popup.getXOffset() - width / 2;
- int y = centerY + popup.getYOffset() - height / 2;
-
- int[] location = new int[2];
- parent.getLocationInWindow(location);
- x += location[0];
- y += location[1];
-
- MarginLayoutParams marginLayoutParams = MarginLayoutParams.class.cast(layoutParams);
- // Clip XY.
- View root = View.class.cast(popupView.getParent());
- if (root != null) {
- x = Math.max(Math.min(x, root.getWidth() - width), 0);
- y = Math.max(Math.min(y, root.getHeight() - height), 0);
- }
- marginLayoutParams.setMargins(x, y, 0, 0);
- }
- popupView.setLayoutParams(layoutParams);
+ int left = centerX + popup.getXOffset() - width / 2;
+ int top = centerY + popup.getYOffset() - height / 2;
+ popUp.setBounds(left, top, left + width, top + height);
popupView.setVisibility(View.VISIBLE);
}
/**
* Hides the pop up preview.
- * protected only for testing.
*/
- protected void dismiss() {
+ void dismiss() {
hidePopupView();
}
@SuppressWarnings("deprecation")
private void hidePopupView() {
+ ImageView popupView = popUp.getContentView();
popupView.setVisibility(View.GONE);
popupView.setImageDrawable(null);
popupView.setBackgroundDrawable(null);
diff --git a/src/android/src/com/google/android/inputmethod/japanese/keyboard/ProbableKeyEventGuesser.java b/src/android/src/com/google/android/inputmethod/japanese/keyboard/ProbableKeyEventGuesser.java
index 9f646cf..507388f 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/keyboard/ProbableKeyEventGuesser.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/keyboard/ProbableKeyEventGuesser.java
@@ -29,7 +29,6 @@
package org.mozc.android.inputmethod.japanese.keyboard;
-import org.mozc.android.inputmethod.japanese.JapaneseKeyboard;
import org.mozc.android.inputmethod.japanese.KeyboardSpecificationName;
import org.mozc.android.inputmethod.japanese.MozcLog;
import org.mozc.android.inputmethod.japanese.MozcUtil;
@@ -64,8 +63,6 @@
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
-import javax.annotation.Nullable;
-
/**
* An object which guesses probable key events for typing correction feature.
*
@@ -90,7 +87,7 @@
*/
@VisibleForTesting
interface StatsFileAccessor {
- InputStream openStream(JapaneseKeyboard japaneseKeyboard, Configuration configuration)
+ InputStream openStream(Keyboard keyboard, Configuration configuration)
throws IOException;
}
@@ -104,8 +101,8 @@
private final List<String> assetFileNames;
StatsFileAccessorImpl(AssetManager assetManager) {
- this.assetManager = assetManager;
- this.assetFileNames = getAssetFileNameList(assetManager);
+ this.assetManager = Preconditions.checkNotNull(assetManager);
+ this.assetFileNames = Preconditions.checkNotNull(getAssetFileNameList(assetManager));
}
private static List<String> getAssetFileNameList(AssetManager assetManager) {
@@ -118,15 +115,17 @@
}
@Override
- public InputStream openStream(JapaneseKeyboard japaneseKeyboard, Configuration configuration)
+ public InputStream openStream(Keyboard keyboard, Configuration configuration)
throws IOException {
+ Preconditions.checkNotNull(keyboard);
+ Preconditions.checkNotNull(configuration);
+
String baseName =
- japaneseKeyboard.getSpecification().getKeyboardSpecificationName().baseName;
+ keyboard.getSpecification().getKeyboardSpecificationName().baseName;
String orientation = KeyboardSpecificationName.getDeviceOrientationString(configuration);
String fileName = String.format("%s_%s.touch_stats", baseName, orientation);
- if (fileName.indexOf(File.separator) != -1) {
- throw new IllegalArgumentException("fileName shouldn't include separator.");
- }
+ Preconditions.checkArgument(
+ fileName.indexOf(File.separator) == -1, "fileName shouldn't include separator.");
for (String file : assetFileNames) {
if (file.equals(fileName)) {
return assetManager.open(fileName);
@@ -157,6 +156,8 @@
@Override
public double getLikelihood(float firstX, float firstY, float deltaX, float deltaY,
float[] probableEvent) {
+ Preconditions.checkNotNull(probableEvent);
+
float sdx = firstX - probableEvent[START_X_AVG];
float sdy = firstY - probableEvent[START_Y_AVG];
// Keys that are too far away from user's touch-down position
@@ -198,32 +199,34 @@
void updateStats(String formattedKeyboardName, SparseArray<float[]> stats);
}
- private final JapaneseKeyboard japaneseKeyboard;
+ private final Keyboard keyboard;
private final Configuration configuration;
private final StatsFileAccessor statsFileAccessor;
private final UpdateStatsListener updateStatsListener;
/**
* @param statsFileAccessor an accessor for stats files. Must be non-null.
- * @param japaneseKeyboard a {@link JapaneseKeyboard} to specify the file to be loaded.
+ * @param keyboard a {@link Keyboard} to specify the file to be loaded.
* @param configuration a {@link Configuration} to specify the file to be loaded
* @param formattedKeyboardNameToStats a {@link Map} to be updated. Must be non-null.
* @param updateStatsExecutor an Executor on which the result is propagated
*/
private StatisticsLoader(
StatsFileAccessor statsFileAccessor,
- JapaneseKeyboard japaneseKeyboard,
+ Keyboard keyboard,
Configuration configuration,
final Map<String, SparseArray<float[]>> formattedKeyboardNameToStats,
final Executor updateStatsExecutor) {
this(
statsFileAccessor,
- japaneseKeyboard,
+ keyboard,
configuration,
new UpdateStatsListener() {
@Override
public void updateStats(final String formattedKeyboardName,
final SparseArray<float[]> stats) {
+ Preconditions.checkNotNull(formattedKeyboardName);
+ Preconditions.checkNotNull(stats);
updateStatsExecutor.execute(new Runnable() {
@Override
public void run() {
@@ -234,14 +237,13 @@
});
}
- // For testing purpose.
@VisibleForTesting
StatisticsLoader(StatsFileAccessor statsFileAccessor,
- JapaneseKeyboard japaneseKeyboard,
+ Keyboard keyboard,
Configuration configuration,
UpdateStatsListener updateStatsListener) {
this.statsFileAccessor = Preconditions.checkNotNull(statsFileAccessor);
- this.japaneseKeyboard = Preconditions.checkNotNull(japaneseKeyboard);
+ this.keyboard = Preconditions.checkNotNull(keyboard);
this.configuration = Preconditions.checkNotNull(configuration);
this.updateStatsListener = Preconditions.checkNotNull(updateStatsListener);
}
@@ -275,7 +277,7 @@
SparseArray<float[]> result = new SparseArray<float[]>(MAX_KEY_NUMBER_IN_KEYBOARD);
InputStream inputStream = null;
try {
- inputStream = statsFileAccessor.openStream(japaneseKeyboard, configuration);
+ inputStream = statsFileAccessor.openStream(keyboard, configuration);
readStream(new DataInputStream(inputStream), result);
} catch (IOException e) {
MozcLog.d("Stream access fails.", e);
@@ -290,7 +292,7 @@
}
}
// Successfully loaded the file so call back updateStatsListener.
- String formattedKeyboardName = japaneseKeyboard.getSpecification()
+ String formattedKeyboardName = keyboard.getSpecification()
.getKeyboardSpecificationName().formattedKeyboardName(configuration);
updateStatsListener.updateStats(formattedKeyboardName, result);
}
@@ -351,14 +353,14 @@
// Invoked from the thread which dataLoadExecutor uses.
private final Executor dataPropagationExecutor;
- // Current JapaneseKeyboard.
- private Optional<JapaneseKeyboard> japaneseKeyboard = Optional.absent();
+ // Current Keyboard.
+ private Optional<Keyboard> keyboard = Optional.absent();
// Current Configuration.
private Optional<Configuration> configuration = Optional.absent();
// Formatted keyboard name.
- // This can be calculated from japaneseKeyboard and configuration so is derivative variable.
+ // This can be calculated from keyboard and configuration so is derivative variable.
// Just for cache.
private Optional<String> formattedKeyboardName = Optional.absent();
@@ -410,17 +412,16 @@
}
/**
- * Sets a {@link JapaneseKeyboard}.
+ * Sets a {@link Keyboard}.
*
* This invocation might load a stats data file (typically) asynchronously.
* Before the loading has finished
* {@link #getProbableKeyEvents(List)} cannot return any probable key events.
* @see #getProbableKeyEvents(List)
- * @param japaneseKeyboard a {@link JapaneseKeyboard} to be set.
- * If null {@link #getProbableKeyEvents(List)} will return null.
+ * @param keyboard a {@link Keyboard} to be set.
*/
- public void setJapaneseKeyboard(@Nullable JapaneseKeyboard japaneseKeyboard) {
- this.japaneseKeyboard = Optional.fromNullable(japaneseKeyboard);
+ public void setKeyboard(Keyboard keyboard) {
+ this.keyboard = Optional.of(keyboard);
updateFormattedKeyboardName();
maybeUpdateEventStatistics();
}
@@ -428,11 +429,11 @@
/**
* Sets a {@link Configuration}.
*
- * Behaves almost the same as {@link #setJapaneseKeyboard(JapaneseKeyboard)}.
+ * Behaves almost the same as {@link #setKeyboard(Keyboard)}.
* @param configuration a {@link Configuration} to be set.
*/
- public void setConfiguration(@Nullable Configuration configuration) {
- this.configuration = Optional.fromNullable(configuration);
+ public void setConfiguration(Optional<Configuration> configuration) {
+ this.configuration = Preconditions.checkNotNull(configuration);
updateFormattedKeyboardName();
maybeUpdateEventStatistics();
}
@@ -441,11 +442,11 @@
* Updates (cached) {@link #formattedKeyboardName}.
*/
private void updateFormattedKeyboardName() {
- if (!japaneseKeyboard.isPresent() || !configuration.isPresent()) {
+ if (!keyboard.isPresent() || !configuration.isPresent()) {
formattedKeyboardName = Optional.absent();
return;
}
- formattedKeyboardName = Optional.of(japaneseKeyboard.get()
+ formattedKeyboardName = Optional.of(keyboard.get()
.getSpecification()
.getKeyboardSpecificationName()
.formattedKeyboardName(
@@ -453,7 +454,7 @@
}
/**
- * If stats for current JapaneseKeyboard and Configuration has not been loaded,
+ * If stats for current {@code Keyboard} and {@code Configuration} has not been loaded,
* load and update it asynchronously.
*
* Loading queue contains only the latest task.
@@ -461,7 +462,7 @@
*/
private void maybeUpdateEventStatistics() {
if (!formattedKeyboardName.isPresent()
- || !japaneseKeyboard.isPresent()
+ || !keyboard.isPresent()
|| !configuration.isPresent()) {
return;
}
@@ -471,7 +472,7 @@
}
dataLoadExecutor.execute(
new StatisticsLoader(
- statsFileAccessor, japaneseKeyboard.get(), configuration.get(),
+ statsFileAccessor, keyboard.get(), configuration.get(),
formattedKeyboardNameToStats,
dataPropagationExecutor));
}
@@ -480,25 +481,25 @@
/**
* Calculates probable key events for given {@code touchEventList}.
*
- * A List is returned (null will not be returned).
* If corresponding stats data has not been loaded yet (file access is done asynchronously),
* empty list is returned.
*
* TODO(matsuzakit): Change the caller side which expects null-return-value,
* before submitting this CL.
*
- * @param touchEventList a List of TouchEvents. If null, empty List is returned.
+ * @param touchEventList a List of TouchEvents.
*/
- public List<ProbableKeyEvent> getProbableKeyEvents(
- @Nullable List<? extends TouchEvent> touchEventList) {
+ public List<ProbableKeyEvent> getProbableKeyEvents(List<TouchEvent> touchEventList) {
+ Preconditions.checkNotNull(touchEventList);
+
// This method's responsibility is to pre-check the condition.
// Calculation itself is done in getProbableKeyEventsInternal method.
- if (!japaneseKeyboard.isPresent() || !configuration.isPresent()) {
+ if (!keyboard.isPresent() || !configuration.isPresent()) {
// Keyboard has not been set up.
return Collections.emptyList();
}
- if (touchEventList == null || touchEventList.size() != 1) {
- // If null || size == 0 , we can do nothing.
+ if (touchEventList.size() != 1) {
+ // If size == 0 , we can do nothing.
// If size >= 2, this is special situation (saturating touch event) so do nothing.
return Collections.emptyList();
}
@@ -507,7 +508,7 @@
if (eventStatistics == null) {
// No corresponding stats is available. Returning null.
// The stats we need might be pushed out from the LRU cache because of bulk-updates of
- // JapaneseKeyboard or Configuration.
+ // Keyboard or Configuration.
// For such case we invoke maybeUpdateEventStatistics method to load the stats.
// This is very rare (and usually not happen) but just in case.
maybeUpdateEventStatistics();
@@ -566,13 +567,14 @@
private SparseArray<Double> getLikelihoodArray(SparseArray<float[]> eventStatistics,
float firstX, float firstY,
float deltaX, float deltaY) {
- Preconditions.checkState(japaneseKeyboard.isPresent());
+ Preconditions.checkNotNull(eventStatistics);
+ Preconditions.checkState(keyboard.isPresent());
SparseArray<Double> result = new SparseArray<Double>(eventStatistics.size());
- JapaneseKeyboard japaneseKeyboard = this.japaneseKeyboard.get();
+ Keyboard keyboard = this.keyboard.get();
for (int i = 0; i < eventStatistics.size(); ++i) {
int sourceId = eventStatistics.keyAt(i);
- int keyCode = japaneseKeyboard.getKeyCode(sourceId);
+ int keyCode = keyboard.getKeyCode(sourceId);
// Special key or non-existent-key.
// Don't produce probable key events.
if (keyCode <= 0) {
diff --git a/src/android/src/com/google/android/inputmethod/japanese/keyboard/Row.java b/src/android/src/com/google/android/inputmethod/japanese/keyboard/Row.java
index 611d807..08a1bd2 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/keyboard/Row.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/keyboard/Row.java
@@ -29,6 +29,8 @@
package org.mozc.android.inputmethod.japanese.keyboard;
+import com.google.common.base.Preconditions;
+
import java.util.Collections;
import java.util.List;
@@ -50,7 +52,7 @@
private final int verticalGap;
public Row(List<? extends Key> keyList, int height, int verticalGap) {
- this.keyList = Collections.unmodifiableList(keyList);
+ this.keyList = Collections.unmodifiableList(Preconditions.checkNotNull(keyList));
this.height = height;
this.verticalGap = verticalGap;
}
diff --git a/src/android/src/com/google/android/inputmethod/japanese/model/JapaneseSoftwareKeyboardModel.java b/src/android/src/com/google/android/inputmethod/japanese/model/JapaneseSoftwareKeyboardModel.java
index df2a0ae..57cc82e 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/model/JapaneseSoftwareKeyboardModel.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/model/JapaneseSoftwareKeyboardModel.java
@@ -29,8 +29,9 @@
package org.mozc.android.inputmethod.japanese.model;
-import org.mozc.android.inputmethod.japanese.JapaneseKeyboard.KeyboardSpecification;
import org.mozc.android.inputmethod.japanese.MozcLog;
+import org.mozc.android.inputmethod.japanese.MozcUtil;
+import org.mozc.android.inputmethod.japanese.keyboard.Keyboard.KeyboardSpecification;
import org.mozc.android.inputmethod.japanese.preference.ClientSidePreference.InputStyle;
import org.mozc.android.inputmethod.japanese.preference.ClientSidePreference.KeyboardLayout;
import com.google.common.base.Optional;
@@ -50,22 +51,19 @@
* <li>{@code qwertyLayoutForAlphabet}
* </ul>
*
- * We have two {@code KeyboardLayout}, which are {@code TWELVE_KEY} and {@code QWERTY},
- * and one experimental layout, {@code GODAN}.
- *
* For {@code TWLEVE_KEY} layout, we have three {@code InputStyle}, which are {@code TOGGLE},
* {@code FLICK} and {@code TOGGLE_FLICK}.
* Also, users can use {@code QWERTY} style layout for alphabet mode by setting
* {@code qwertyLayoutForAlphabet} {@code true}.
*
- * {@code TWLEVE_KEY} layout has mainly three {@code KeyboardMode}, which are {@code KANA},
- * {@code ALPHABET} and {@code KANA_NUMBER}. If a user uses {@code QWERTY} style layout for
- * alphabet mode, s/he can use {@code ALPHABET_NUMBER} mode, which is {@code QWERTY} style number
- * key layout, as well in addition to the three {@code KeyboardMode}.
+ * {@code TWLEVE_KEY} layout has two {@code KeyboardMode}, which are {@code KANA}, {@code ALPHABET}.
*
- * For {@code QWERTY} layout, we have four {@code KeyboardMode}, which are {@code KANA},
- * {@code ALPHABET}, {@code KANA_NUMBER} and {@code ALPHABET_NUMBER}. The parameters,
- * {@code InputStyle} and {@code qwertyLayoutForAlphabet}, are simply ignored.
+ * On {@code SymbolInputView}, we have a special {@code KeyboardMode}, which is
+ * {@code SYMBOL_NUMBER}. It is NOT used on normal view.
+ *
+ * For {@code QWERTY} layout, we have two {@code KeyboardMode}, which are {@code KANA},
+ * {@code ALPHABET}. The parameters, {@code InputStyle} and {@code qwertyLayoutForAlphabet}, are
+ * simply ignored.
*
* This class manages the "default mode" of software keyboard depending on {@code inputType}.
* It is expected that the {@code inputType} is given by system via
@@ -79,7 +77,7 @@
* Keyboard mode that indicates supported character types.
*/
public enum KeyboardMode {
- KANA, ALPHABET, KANA_NUMBER, ALPHABET_NUMBER,
+ KANA, ALPHABET, ALPHABET_NUMBER, NUMBER, SYMBOL_NUMBER,
}
private KeyboardLayout keyboardLayout = KeyboardLayout.TWELVE_KEYS;
@@ -160,24 +158,24 @@
}
}
- private static Optional<KeyboardMode> getPreferredKeyboardMode(
+ public static Optional<KeyboardMode> getPreferredKeyboardMode(
int inputType, KeyboardLayout layout) {
- Preconditions.checkNotNull(layout);
- switch (inputType & InputType.TYPE_MASK_CLASS) {
- case InputType.TYPE_CLASS_DATETIME:
- case InputType.TYPE_CLASS_PHONE:
- case InputType.TYPE_CLASS_NUMBER:
- return layout == KeyboardLayout.TWELVE_KEYS
- ? Optional.of(KeyboardMode.KANA_NUMBER)
- : Optional.of(KeyboardMode.ALPHABET_NUMBER);
- case InputType.TYPE_CLASS_TEXT:
- switch (inputType & InputType.TYPE_MASK_VARIATION) {
- case InputType.TYPE_TEXT_VARIATION_PASSWORD:
- case InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD:
- case InputType.TYPE_TEXT_VARIATION_WEB_EMAIL_ADDRESS:
- case InputType.TYPE_TEXT_VARIATION_WEB_PASSWORD:
- return Optional.of(KeyboardMode.ALPHABET);
- }
+ if (MozcUtil.isNumberKeyboardPreferred(inputType)) {
+ switch (Preconditions.checkNotNull(layout)) {
+ case GODAN:
+ case QWERTY:
+ case TWELVE_KEYS:
+ return Optional.of(KeyboardMode.NUMBER);
+ }
+ }
+ if ((inputType & InputType.TYPE_MASK_CLASS) == InputType.TYPE_CLASS_TEXT) {
+ switch (inputType & InputType.TYPE_MASK_VARIATION) {
+ case InputType.TYPE_TEXT_VARIATION_PASSWORD:
+ case InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD:
+ case InputType.TYPE_TEXT_VARIATION_WEB_EMAIL_ADDRESS:
+ case InputType.TYPE_TEXT_VARIATION_WEB_PASSWORD:
+ return Optional.of(KeyboardMode.ALPHABET);
+ }
}
// KeyboardMode recommended strongly is not found here, so just return null.
return Optional.<KeyboardMode>absent();
@@ -218,9 +216,7 @@
}
private static KeyboardSpecification getTwelveKeysKeyboardSpecification(
- KeyboardMode keyboardMode,
- InputStyle inputStyle,
- boolean qwertyLayoutForAlphabet) {
+ KeyboardMode keyboardMode, InputStyle inputStyle, boolean qwertyLayoutForAlphabet) {
switch (keyboardMode) {
case KANA: {
switch (inputStyle) {
@@ -252,14 +248,10 @@
}
break;
}
- case KANA_NUMBER: {
- switch (inputStyle) {
- case TOGGLE: return KeyboardSpecification.TWELVE_KEY_TOGGLE_NUMBER;
- case FLICK: return KeyboardSpecification.TWELVE_KEY_FLICK_NUMBER;
- case TOGGLE_FLICK: return KeyboardSpecification.TWELVE_KEY_TOGGLE_FLICK_NUMBER;
- }
- break;
- }
+ case NUMBER:
+ return KeyboardSpecification.NUMBER;
+ case SYMBOL_NUMBER:
+ return KeyboardSpecification.SYMBOL_NUMBER;
}
throw new IllegalArgumentException(
"Unknown keyboard state: "
@@ -269,9 +261,10 @@
private static KeyboardSpecification getQwertyKeyboardSpecification(KeyboardMode keyboardMode) {
switch (keyboardMode) {
case KANA: return KeyboardSpecification.QWERTY_KANA;
- case KANA_NUMBER: return KeyboardSpecification.QWERTY_KANA_NUMBER;
case ALPHABET: return KeyboardSpecification.QWERTY_ALPHABET;
case ALPHABET_NUMBER: return KeyboardSpecification.QWERTY_ALPHABET_NUMBER;
+ case NUMBER: return KeyboardSpecification.NUMBER;
+ case SYMBOL_NUMBER: return KeyboardSpecification.SYMBOL_NUMBER;
}
throw new IllegalArgumentException("Unknown keyboard mode: " + keyboardMode);
}
@@ -281,10 +274,10 @@
case KANA: return KeyboardSpecification.GODAN_KANA;
case ALPHABET: return KeyboardSpecification.QWERTY_ALPHABET;
case ALPHABET_NUMBER: return KeyboardSpecification.QWERTY_ALPHABET_NUMBER;
- default:
- // KANA_NUMBER must be never used.
- throw new IllegalArgumentException("Unknown keyboard mode: " + keyboardMode);
+ case NUMBER: return KeyboardSpecification.NUMBER;
+ case SYMBOL_NUMBER: return KeyboardSpecification.SYMBOL_NUMBER;
}
+ throw new IllegalArgumentException("Unknown keyboard mode: " + keyboardMode);
}
}
diff --git a/src/android/src/com/google/android/inputmethod/japanese/model/SymbolCandidateStorage.java b/src/android/src/com/google/android/inputmethod/japanese/model/SymbolCandidateStorage.java
index 4c1ce91..e98504b 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/model/SymbolCandidateStorage.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/model/SymbolCandidateStorage.java
@@ -226,6 +226,10 @@
/** @return the {@link CandidateList} instance for the given {@code minorCategory}. */
public CandidateList getCandidateList(SymbolMinorCategory minorCategory) {
switch (minorCategory) {
+ // NUMBER major category candidates.
+ case NUMBER:
+ return CandidateList.getDefaultInstance();
+
// SYMBOL major category candidates.
case SYMBOL_HISTORY:
return toCandidateList(symbolHistoryStorage.getAllHistory(SymbolMajorCategory.SYMBOL));
diff --git a/src/android/src/com/google/android/inputmethod/japanese/model/SymbolMajorCategory.java b/src/android/src/com/google/android/inputmethod/japanese/model/SymbolMajorCategory.java
index 7f7ef36..2a5dc18 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/model/SymbolMajorCategory.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/model/SymbolMajorCategory.java
@@ -30,18 +30,29 @@
package org.mozc.android.inputmethod.japanese.model;
import org.mozc.android.inputmethod.japanese.resources.R;
+import org.mozc.android.inputmethod.japanese.ui.CandidateLayoutRenderer;
+import org.mozc.android.inputmethod.japanese.ui.CandidateLayoutRenderer.DescriptionLayoutPolicy;
import com.google.common.base.Preconditions;
import java.util.Arrays;
+import java.util.Collections;
import java.util.List;
/**
* Symbol's major category to which the minor categories belong.
*/
public enum SymbolMajorCategory {
+ NUMBER(
+ R.id.category_selector_major_number,
+ R.raw.symbol__major__number,
+ R.dimen.symbol_major_number_height,
+ Collections.singletonList(SymbolMinorCategory.NUMBER),
+ R.dimen.symbol_view_symbol_min_column_width,
+ DescriptionLayoutPolicy.GONE), // DescriptionLayoutPolicy is not effective for NUMBER.
SYMBOL(
R.id.category_selector_major_symbol,
R.raw.symbol__major__symbol,
+ R.dimen.symbol_major_symbol_height,
Arrays.asList(
SymbolMinorCategory.SYMBOL_HISTORY,
SymbolMinorCategory.SYMBOL_GENERAL,
@@ -50,10 +61,12 @@
SymbolMinorCategory.SYMBOL_ARROW,
SymbolMinorCategory.SYMBOL_MATH
),
- R.dimen.symbol_view_symbol_min_column_width),
+ R.dimen.symbol_view_symbol_min_column_width,
+ DescriptionLayoutPolicy.OVERLAY),
EMOTICON(
R.id.category_selector_major_emoticon,
R.raw.symbol__major__emoticon,
+ R.dimen.symbol_major_emoticon_height,
Arrays.asList(
SymbolMinorCategory.EMOTICON_HISTORY,
SymbolMinorCategory.EMOTICON_SMILE,
@@ -62,10 +75,12 @@
SymbolMinorCategory.EMOTICON_SADNESS,
SymbolMinorCategory.EMOTICON_DISPLEASURE
),
- R.dimen.symbol_view_emoticon_min_column_width),
+ R.dimen.symbol_view_emoticon_min_column_width,
+ DescriptionLayoutPolicy.OVERLAY),
EMOJI(
R.id.category_selector_major_emoji,
R.raw.symbol__major__emoji,
+ R.dimen.symbol_major_emoji_height,
Arrays.asList(
SymbolMinorCategory.EMOJI_HISTORY,
SymbolMinorCategory.EMOJI_FACE,
@@ -74,14 +89,17 @@
SymbolMinorCategory.EMOJI_CITY,
SymbolMinorCategory.EMOJI_NATURE
),
- R.dimen.symbol_view_emoji_min_column_width)
+ R.dimen.symbol_view_emoji_min_column_width,
+ DescriptionLayoutPolicy.GONE) // Description is not show in the light of UX
;
// All fields are invariant so access directly.
public final int buttonResourceId;
public final int buttonImageResourceId;
+ public final int maxImageHeightResourceId;
public final List<SymbolMinorCategory> minorCategories;
public final int minColumnWidthResourceId;
+ public final DescriptionLayoutPolicy layoutPolicy;
/**
* @param buttonResourceId the resource id (R.id.xxxx) of corresponding selector button.
@@ -95,14 +113,18 @@
private SymbolMajorCategory(
int buttonResourceId,
int buttonImageResourceId,
+ int maxImageHeightResourceId,
List<SymbolMinorCategory> minorCategories,
- int minColumnWidthResourceId) {
+ int minColumnWidthResourceId,
+ CandidateLayoutRenderer.DescriptionLayoutPolicy layoutPolicy) {
// We just store resource id instead of real bitmap/integer
// because we cannot obtain them here (Context instance is needed).
this.buttonResourceId = buttonResourceId;
this.buttonImageResourceId = buttonImageResourceId;
+ this.maxImageHeightResourceId = maxImageHeightResourceId;
this.minorCategories = Preconditions.checkNotNull(minorCategories);
this.minColumnWidthResourceId = minColumnWidthResourceId;
+ this.layoutPolicy = layoutPolicy;
}
/**
@@ -116,7 +138,7 @@
}
public SymbolMinorCategory getMinorCategoryByRelativeIndex(SymbolMinorCategory minorCategory,
- int relativeIndex) {
+ int relativeIndex) {
int index = minorCategories.indexOf(Preconditions.checkNotNull(minorCategory));
int newIndex = (index + relativeIndex + minorCategories.size())
% minorCategories.size();
diff --git a/src/android/src/com/google/android/inputmethod/japanese/model/SymbolMinorCategory.java b/src/android/src/com/google/android/inputmethod/japanese/model/SymbolMinorCategory.java
index 3eff2bb..9335aa7 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/model/SymbolMinorCategory.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/model/SymbolMinorCategory.java
@@ -35,32 +35,59 @@
* Symbol's minor category to which the candidates belong.
*/
public enum SymbolMinorCategory {
- SYMBOL_HISTORY(R.string.symbol_minor_symbol_history_title),
- SYMBOL_GENERAL(R.string.symbol_minor_symbol_general_title),
- SYMBOL_HALF(R.string.symbol_minor_symbol_half_title),
- SYMBOL_PARENTHESIS(R.string.symbol_minor_symbol_parenthesis_title),
- SYMBOL_ARROW(R.string.symbol_minor_symbol_arrow_title),
- SYMBOL_MATH(R.string.symbol_minor_symbol_math_title),
- EMOTICON_HISTORY(R.string.symbol_minor_emoticon_history_title),
- EMOTICON_SMILE(R.string.symbol_minor_emoticon_smile_title),
- EMOTICON_SWEAT(R.string.symbol_minor_emoticon_sweat_title),
- EMOTICON_SURPRISE(R.string.symbol_minor_emoticon_surprise_title),
- EMOTICON_SADNESS(R.string.symbol_minor_emoticon_sadness_title),
- EMOTICON_DISPLEASURE(R.string.symbol_minor_emoticon_displeasure_title),
- EMOJI_HISTORY(R.string.symbol_minor_emoji_history_title),
- EMOJI_FACE(R.string.symbol_minor_emoji_face_title),
- EMOJI_FOOD(R.string.symbol_minor_emoji_food_title),
- EMOJI_ACTIVITY(R.string.symbol_minor_emoji_activity_title),
- EMOJI_CITY(R.string.symbol_minor_emoji_city_title),
- EMOJI_NATURE(R.string.symbol_minor_emoji_nature_title)
+ NUMBER(SymbolMinorCategory.INVALID_RESOURCE_ID, SymbolMinorCategory.INVALID_RESOURCE_ID,
+ SymbolMinorCategory.INVALID_RESOURCE_ID),
+ SYMBOL_HISTORY(R.raw.symbol__minor__history, R.dimen.symbol_minor_default_height,
+ R.string.cd_symbol_window_minor_history),
+ SYMBOL_GENERAL(R.raw.symbol__minor__general, R.dimen.symbol_minor_default_height,
+ R.string.cd_symbol_window_minor_symbol_general),
+ SYMBOL_HALF(R.raw.symbol__minor__fullhalf, R.dimen.symbol_minor_default_height,
+ R.string.cd_symbol_window_minor_symbol_half),
+ SYMBOL_PARENTHESIS(R.raw.symbol__minor__parenthesis, R.dimen.symbol_minor_default_height,
+ R.string.cd_symbol_window_minor_symbol_parenthesis),
+ SYMBOL_ARROW(R.raw.symbol__minor__arrow, R.dimen.symbol_minor_default_height,
+ R.string.cd_symbol_window_minor_symbol_arrow),
+ SYMBOL_MATH(R.raw.symbol__minor__math, R.dimen.symbol_minor_default_height,
+ R.string.cd_symbol_window_minor_symbol_math),
+ EMOTICON_HISTORY(R.raw.symbol__minor__history, R.dimen.symbol_minor_default_height,
+ R.string.cd_symbol_window_minor_history),
+ EMOTICON_SMILE(R.raw.symbol__minor__smile, R.dimen.symbol_minor_emoticon_height,
+ R.string.cd_symbol_window_minor_emoticon_smile),
+ EMOTICON_SWEAT(R.raw.symbol__minor__sweat, R.dimen.symbol_minor_emoticon_height,
+ R.string.cd_symbol_window_minor_emoticon_sweat),
+ EMOTICON_SURPRISE(R.raw.symbol__minor__surprise, R.dimen.symbol_minor_emoticon_height,
+ R.string.cd_symbol_window_minor_emoticon_surprise),
+ EMOTICON_SADNESS(R.raw.symbol__minor__sadness, R.dimen.symbol_minor_emoticon_height,
+ R.string.cd_symbol_window_minor_emoticon_sadness),
+ EMOTICON_DISPLEASURE(R.raw.symbol__minor__displeasure, R.dimen.symbol_minor_emoticon_height,
+ R.string.cd_symbol_window_minor_emoticon_displeasure),
+ EMOJI_HISTORY(R.raw.symbol__minor__history, R.dimen.symbol_minor_default_height,
+ R.string.cd_symbol_window_minor_history),
+ EMOJI_FACE(R.raw.symbol__minor__face, R.dimen.symbol_minor_default_height,
+ R.string.cd_symbol_window_minor_emoji_face),
+ EMOJI_FOOD(R.raw.symbol__minor__food, R.dimen.symbol_minor_default_height,
+ R.string.cd_symbol_window_minor_emoji_food),
+ EMOJI_ACTIVITY(R.raw.symbol__minor__activity, R.dimen.symbol_minor_default_height,
+ R.string.cd_symbol_window_minor_emoji_activity),
+ EMOJI_CITY(R.raw.symbol__minor__city, R.dimen.symbol_minor_default_height,
+ R.string.cd_symbol_window_minor_emoji_city),
+ EMOJI_NATURE(R.raw.symbol__minor__nature, R.dimen.symbol_minor_default_height,
+ R.string.cd_symbol_window_minor_emoji_nature)
;
- public final int textResourceId;
+ public static final int INVALID_RESOURCE_ID = 0;
+ public final int drawableResourceId;
+ public final int maxImageHeightResourceId;
+ public final int contentDescriptionResourceId;
/**
- * @param textResourceId the resource id of the corresponding text title.
+ * @param drawableResourceId the resource id of the corresponding drawable.
+ * @param contentDescriptionResourceId the resource id of the corresponding content description.
*/
- SymbolMinorCategory(int textResourceId) {
- this.textResourceId = textResourceId;
+ SymbolMinorCategory(int drawableResourceId, int maxImageHeightResourceId,
+ int contentDescriptionResourceId) {
+ this.drawableResourceId = drawableResourceId;
+ this.maxImageHeightResourceId = maxImageHeightResourceId;
+ this.contentDescriptionResourceId = contentDescriptionResourceId;
}
}
\ No newline at end of file
diff --git a/src/android/src/com/google/android/inputmethod/japanese/preference/ClientSidePreference.java b/src/android/src/com/google/android/inputmethod/japanese/preference/ClientSidePreference.java
index 7f47fa7..250326f 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/preference/ClientSidePreference.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/preference/ClientSidePreference.java
@@ -31,12 +31,14 @@
import org.mozc.android.inputmethod.japanese.ViewManagerInterface.LayoutAdjustment;
import org.mozc.android.inputmethod.japanese.emoji.EmojiProviderType;
+import org.mozc.android.inputmethod.japanese.resources.R;
import org.mozc.android.inputmethod.japanese.view.SkinType;
import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Preconditions;
import android.content.SharedPreferences;
import android.content.res.Configuration;
+import android.content.res.Resources;
/**
* This class expresses the client-side preferences which corresponds to current
@@ -87,7 +89,6 @@
public enum HardwareKeyMap {
DEFAULT,
JAPANESE109A,
- TWELVEKEY,
}
private final boolean isHapticFeedbackEnabled;
@@ -103,6 +104,7 @@
private final EmojiProviderType emojiProviderType;
private final HardwareKeyMap hardwareKeyMap;
private final SkinType skinType;
+ private final boolean isMicrophoneButtonEnabled;
private final LayoutAdjustment layoutAdjustment;
/** Percentage of keyboard height */
@@ -110,14 +112,15 @@
/**
* If you want to use this method,
- * consider using {@link #ClientSidePreference(SharedPreferences, int)} instead.
+ * consider using {@link #ClientSidePreference(SharedPreferences, Resources, int)} instead.
*/
@VisibleForTesting public ClientSidePreference(
boolean isHapticFeedbackEnabled, long hapticFeedbackDuration, boolean isSoundFeedbackEnabled,
int soundFeedbackVolume, boolean isPopupFeedbackEnabled, KeyboardLayout keyboardLayout,
InputStyle inputStyle, boolean qwertyLayoutForAlphabet, boolean fullscreenMode,
int flickSensitivity, EmojiProviderType emojiProviderType, HardwareKeyMap hardwareKeyMap,
- SkinType skinType, LayoutAdjustment layoutAdjustment, int keyboardHeightRatio) {
+ SkinType skinType, boolean isMicrophoneButtonEnabled, LayoutAdjustment layoutAdjustment,
+ int keyboardHeightRatio) {
this.isHapticFeedbackEnabled = isHapticFeedbackEnabled;
this.hapticFeedbackDuration = hapticFeedbackDuration;
this.isSoundFeedbackEnabled = isSoundFeedbackEnabled;
@@ -131,11 +134,13 @@
this.emojiProviderType = Preconditions.checkNotNull(emojiProviderType);
this.hardwareKeyMap = Preconditions.checkNotNull(hardwareKeyMap);
this.skinType = Preconditions.checkNotNull(skinType);
+ this.isMicrophoneButtonEnabled = isMicrophoneButtonEnabled;
this.layoutAdjustment = Preconditions.checkNotNull(layoutAdjustment);
this.keyboardHeightRatio = keyboardHeightRatio;
}
- public ClientSidePreference(SharedPreferences sharedPreferences, int deviceOrientation) {
+ public ClientSidePreference(
+ SharedPreferences sharedPreferences, Resources resources, int deviceOrientation) {
Preconditions.checkNotNull(sharedPreferences);
isHapticFeedbackEnabled =
@@ -148,6 +153,8 @@
sharedPreferences.getInt(PreferenceUtil.PREF_SOUND_FEEDBACK_VOLUME_KEY, 50);
isPopupFeedbackEnabled =
sharedPreferences.getBoolean(PreferenceUtil.PREF_POPUP_FEEDBACK_KEY, true);
+ isMicrophoneButtonEnabled =
+ sharedPreferences.getBoolean(PreferenceUtil.PREF_VOICE_INPUT_KEY, true);
String keyboardLayoutKey;
String inputStyleKey;
@@ -197,9 +204,11 @@
EmojiProviderType.NONE);
hardwareKeyMap = PreferenceUtil.getEnum(
- sharedPreferences, PreferenceUtil.PREF_HARDWARE_KEYMAP, HardwareKeyMap.class, null);
+ sharedPreferences, PreferenceUtil.PREF_HARDWARE_KEYMAP, HardwareKeyMap.class,
+ HardwareKeyMap.DEFAULT);
skinType = PreferenceUtil.getEnum(
- sharedPreferences, PreferenceUtil.PREF_SKIN_TYPE, SkinType.class, SkinType.BLUE_LIGHTGRAY);
+ sharedPreferences, resources.getString(R.string.pref_skin_type_key),
+ SkinType.class, SkinType.valueOf(resources.getString(R.string.pref_skin_type_default)));
layoutAdjustment = PreferenceUtil.getEnum(
sharedPreferences, layoutAdjustmentKey, LayoutAdjustment.class, LayoutAdjustment.FILL);
keyboardHeightRatio = sharedPreferences.getInt(keyboardHeightRatioKey, 100);
@@ -257,6 +266,10 @@
return skinType;
}
+ public boolean isMicrophoneButtonEnabled() {
+ return isMicrophoneButtonEnabled;
+ }
+
public LayoutAdjustment getLayoutAdjustment() {
return layoutAdjustment;
}
diff --git a/src/android/src/com/google/android/inputmethod/japanese/preference/KeyboardLayoutPreference.java b/src/android/src/com/google/android/inputmethod/japanese/preference/KeyboardLayoutPreference.java
index 3b6db3b..f17a3d1 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/preference/KeyboardLayoutPreference.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/preference/KeyboardLayoutPreference.java
@@ -30,9 +30,12 @@
package org.mozc.android.inputmethod.japanese.preference;
import org.mozc.android.inputmethod.japanese.MozcLog;
+import org.mozc.android.inputmethod.japanese.keyboard.Keyboard.KeyboardSpecification;
import org.mozc.android.inputmethod.japanese.preference.ClientSidePreference.KeyboardLayout;
import org.mozc.android.inputmethod.japanese.resources.R;
+import org.mozc.android.inputmethod.japanese.view.Skin;
import org.mozc.android.inputmethod.japanese.view.SkinType;
+import com.google.common.base.Preconditions;
import android.content.Context;
import android.content.SharedPreferences;
@@ -67,13 +70,13 @@
static class Item {
final KeyboardLayout keyboardLayout;
- final int keyboardResourceId;
+ final KeyboardSpecification specification;
final int titleResId;
final int descriptionResId;
- Item(KeyboardLayout keyboardLayout, int keyboardResourceId,
+ Item(KeyboardLayout keyboardLayout, KeyboardSpecification specification,
int titleResId, int descriptionResId) {
this.keyboardLayout = keyboardLayout;
- this.keyboardResourceId = keyboardResourceId;
+ this.specification = specification;
this.titleResId = titleResId;
this.descriptionResId = descriptionResId;
}
@@ -87,7 +90,7 @@
for (Item item : itemList) {
drawableMap.put(
item.keyboardLayout,
- new KeyboardPreviewDrawable(resources, item.keyboardLayout, item.keyboardResourceId));
+ new KeyboardPreviewDrawable(resources, item.keyboardLayout, item.specification));
}
}
@@ -136,9 +139,10 @@
return convertView;
}
- void setSkinType(SkinType skinType) {
+ void setSkin(Skin skin) {
+ Preconditions.checkNotNull(skin);
for (KeyboardPreviewDrawable drawable : drawableMap.values()) {
- drawable.setSkinType(skinType);
+ drawable.setSkin(skin);
}
}
}
@@ -175,17 +179,17 @@
static final List<Item> itemList = Collections.unmodifiableList(Arrays.asList(
new Item(
KeyboardLayout.TWELVE_KEYS,
- R.xml.kbd_12keys_flick_kana,
+ KeyboardSpecification.TWELVE_KEY_TOGGLE_FLICK_KANA,
R.string.pref_keyboard_layout_title_12keys,
R.string.pref_keyboard_layout_description_12keys),
new Item(
KeyboardLayout.QWERTY,
- R.xml.kbd_qwerty_kana,
+ KeyboardSpecification.QWERTY_KANA,
R.string.pref_keyboard_layout_title_qwerty,
R.string.pref_keyboard_layout_description_qwerty),
new Item(
KeyboardLayout.GODAN,
- R.xml.kbd_godan_kana,
+ KeyboardSpecification.GODAN_KANA,
R.string.pref_keyboard_layout_title_godan,
R.string.pref_keyboard_layout_description_godan)));
@@ -195,8 +199,8 @@
new OnSharedPreferenceChangeListener() {
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
- if (key.equals(PreferenceUtil.PREF_SKIN_TYPE)) {
- updateSkinType();
+ if (key.equals(getContext().getResources().getString(R.string.pref_skin_type_key))) {
+ updateSkin();
}
}
};
@@ -288,7 +292,7 @@
gallery.setOnItemClickListener(galleryEventListener);
gallery.setSelection(getActiveIndex());
- updateSkinType();
+ updateSkin();
}
private static void updateAllItemBackground(AdapterView<?> gallery, int activeIndex) {
@@ -311,7 +315,7 @@
@Override
protected void onAttachedToHierarchy(PreferenceManager preferenceManager) {
super.onAttachedToHierarchy(preferenceManager);
- updateSkinType();
+ updateSkin();
getSharedPreferences().registerOnSharedPreferenceChangeListener(
sharedPreferenceChangeListener);
}
@@ -323,10 +327,12 @@
super.onPrepareForRemoval();
}
- void updateSkinType() {
+ void updateSkin() {
+ Resources resources = getContext().getResources();
SkinType skinType = PreferenceUtil.getEnum(
getSharedPreferences(),
- PreferenceUtil.PREF_SKIN_TYPE, SkinType.class, SkinType.ORANGE_LIGHTGRAY);
- imageAdapter.setSkinType(skinType);
+ resources.getString(R.string.pref_skin_type_key),
+ SkinType.class, SkinType.valueOf(resources.getString(R.string.pref_skin_type_default)));
+ imageAdapter.setSkin(skinType.getSkin(resources));
}
}
diff --git a/src/android/src/com/google/android/inputmethod/japanese/preference/KeyboardPreviewDrawable.java b/src/android/src/com/google/android/inputmethod/japanese/preference/KeyboardPreviewDrawable.java
index 94c5f87..6c113c5 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/preference/KeyboardPreviewDrawable.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/preference/KeyboardPreviewDrawable.java
@@ -34,14 +34,14 @@
import org.mozc.android.inputmethod.japanese.keyboard.BackgroundDrawableFactory;
import org.mozc.android.inputmethod.japanese.keyboard.KeyState.MetaState;
import org.mozc.android.inputmethod.japanese.keyboard.Keyboard;
+import org.mozc.android.inputmethod.japanese.keyboard.Keyboard.KeyboardSpecification;
import org.mozc.android.inputmethod.japanese.keyboard.KeyboardParser;
import org.mozc.android.inputmethod.japanese.keyboard.KeyboardViewBackgroundSurface;
import org.mozc.android.inputmethod.japanese.preference.ClientSidePreference.KeyboardLayout;
import org.mozc.android.inputmethod.japanese.resources.R;
import org.mozc.android.inputmethod.japanese.view.DrawableCache;
-import org.mozc.android.inputmethod.japanese.view.MozcDrawableFactory;
-import org.mozc.android.inputmethod.japanese.view.SkinType;
-import com.google.common.base.Optional;
+import org.mozc.android.inputmethod.japanese.view.Skin;
+import com.google.common.base.Preconditions;
import android.content.res.Resources;
import android.graphics.Bitmap;
@@ -51,8 +51,6 @@
import android.graphics.Paint;
import android.graphics.PixelFormat;
import android.graphics.Rect;
-import android.graphics.Shader.TileMode;
-import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import org.xmlpull.v1.XmlPullParserException;
@@ -63,6 +61,8 @@
import java.util.Map;
import java.util.WeakHashMap;
+import javax.annotation.Nullable;
+
/**
* A Drawable to render keyboard preview.
*
@@ -118,7 +118,7 @@
private final Map<KeyboardLayout, Bitmap> map =
new EnumMap<KeyboardLayout, Bitmap>(KeyboardLayout.class);
- private SkinType skinType = null;
+ private Skin skin = Skin.getFallbackInstance();
private final WeakHashMap<CacheReferenceKey, Object> referenceMap =
new WeakHashMap<CacheReferenceKey, Object>();
@@ -129,12 +129,13 @@
return INSTANCE;
}
- Bitmap get(KeyboardLayout keyboardLayout, int width, int height, SkinType skinType) {
- if (keyboardLayout == null || width <= 0 || height <= 0 || skinType == null) {
+ @Nullable Bitmap get(KeyboardLayout keyboardLayout, int width, int height, Skin skin) {
+ Preconditions.checkNotNull(skin);
+ if (keyboardLayout == null || width <= 0 || height <= 0) {
return null;
}
- if (skinType != this.skinType) {
+ if (!skin.equals(this.skin)) {
return null;
}
@@ -149,14 +150,15 @@
return result;
}
- void put(KeyboardLayout keyboardLayout, SkinType skinType, Bitmap bitmap) {
- if (keyboardLayout == null || skinType == null || bitmap == null) {
+ void put(@Nullable KeyboardLayout keyboardLayout, Skin skin, @Nullable Bitmap bitmap) {
+ Preconditions.checkNotNull(skin);
+ if (keyboardLayout == null || bitmap == null) {
return;
}
- if (skinType != this.skinType) {
+ if (!skin.equals(this.skin)) {
clear();
- this.skinType = skinType;
+ this.skin = skin;
}
Bitmap oldBitmap = map.put(keyboardLayout, bitmap);
@@ -187,23 +189,23 @@
}
map.clear();
- skinType = null;
+ skin = Skin.getFallbackInstance();
}
}
private final Resources resources;
private final KeyboardLayout keyboardLayout;
- private final int keyboardResourceId;
+ private final KeyboardSpecification specification;
private final Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
- private SkinType skinType = SkinType.BLUE_LIGHTGRAY;
+ private Skin skin = Skin.getFallbackInstance();
private boolean enabled = true;
KeyboardPreviewDrawable(
- Resources resources, KeyboardLayout keyboardLayout, int keyboardResourceId) {
+ Resources resources, KeyboardLayout keyboardLayout, KeyboardSpecification specification) {
this.resources = resources;
this.keyboardLayout = keyboardLayout;
- this.keyboardResourceId = keyboardResourceId;
+ this.specification = specification;
}
@Override
@@ -215,12 +217,13 @@
// Look up cache.
BitmapCache cache = BitmapCache.getInstance();
- Bitmap bitmap = cache.get(keyboardLayout, bounds.width(), bounds.height(), skinType);
+ Bitmap bitmap = cache.get(keyboardLayout, bounds.width(), bounds.height(), skin);
if (bitmap == null) {
bitmap = createBitmap(
- resources, keyboardResourceId, bounds.width(), bounds.height(), skinType);
+ resources, specification, bounds.width(), bounds.height(),
+ resources.getDimensionPixelSize(R.dimen.pref_inputstyle_reference_width), skin);
if (bitmap != null) {
- cache.put(keyboardLayout, skinType, bitmap);
+ cache.put(keyboardLayout, skin, bitmap);
}
}
@@ -234,48 +237,48 @@
}
}
+ /**
+ * @param width width of returned {@code Bitmap}
+ * @param height height of returned {@code Bitmap}
+ * @param virtualWidth virtual width of keyboard. This value is used when rendering.
+ * virtualHeight is internally calculated based on given arguments keeping aspect ratio.
+ */
+ @Nullable
private static Bitmap createBitmap(
- Resources resources, int resourceId, int width, int height, SkinType skinType) {
- Keyboard keyboard = getParsedKeyboard(resources, resourceId, width, height);
+ Resources resources, KeyboardSpecification specification, int width, int height,
+ int virtualWidth, Skin skin) {
+ Preconditions.checkNotNull(skin);
+ // Scaling is required because some icons are draw with specified fixed size.
+ float scale = width / (float) virtualWidth;
+ int virtualHeight = (int) (height / scale);
+ Keyboard keyboard = getParsedKeyboard(resources, specification, virtualWidth, virtualHeight);
if (keyboard == null) {
return null;
}
Bitmap bitmap = MozcUtil.createBitmap(width, height, Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
- DrawableCache drawableCache = new DrawableCache(new MozcDrawableFactory(resources));
- drawableCache.setSkinType(skinType);
+ canvas.scale(scale, scale);
+ DrawableCache drawableCache = new DrawableCache(resources);
+ drawableCache.setSkin(skin);
// Fill background.
{
- Optional<Drawable> optionalKeyboardBackground =
- drawableCache.getDrawable(skinType.windowBackgroundResourceId);
- if (!optionalKeyboardBackground.isPresent()) {
- // Default black drawing.
- Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
- paint.setColor(0xFF000000);
- canvas.drawRect(0, 0, bitmap.getWidth(), bitmap.getHeight(), paint);
- } else {
- Drawable keyboardBackground = optionalKeyboardBackground.get();
- if (keyboardBackground instanceof BitmapDrawable) {
- // If the background is bitmap resource, set repeat mode.
- BitmapDrawable.class.cast(keyboardBackground).setTileModeXY(
- TileMode.REPEAT, TileMode.REPEAT);
- }
- keyboardBackground.setBounds(0, 0, bitmap.getWidth(), bitmap.getHeight());
- keyboardBackground.draw(canvas);
- }
+ Drawable keyboardBackground =
+ skin.windowBackgroundDrawable.getConstantState().newDrawable();
+ keyboardBackground.setBounds(0, 0, virtualWidth, virtualHeight);
+ keyboardBackground.draw(canvas);
}
// Draw keyboard layout.
{
BackgroundDrawableFactory backgroundDrawableFactory =
- new BackgroundDrawableFactory(resources.getDisplayMetrics().density);
- backgroundDrawableFactory.setSkinType(skinType);
+ new BackgroundDrawableFactory(resources);
+ backgroundDrawableFactory.setSkin(skin);
KeyboardViewBackgroundSurface backgroundSurface =
new KeyboardViewBackgroundSurface(backgroundDrawableFactory, drawableCache);
backgroundSurface.requestUpdateKeyboard(keyboard, Collections.<MetaState>emptySet());
- backgroundSurface.requestUpdateSize(bitmap.getWidth(), bitmap.getHeight());
+ backgroundSurface.requestUpdateSize(virtualWidth, virtualHeight);
backgroundSurface.update();
backgroundSurface.draw(canvas);
backgroundSurface.reset(); // Release the background bitmap and its canvas.
@@ -285,10 +288,11 @@
}
/** Create a Keyboard instance which fits the current bitmap. */
+ @Nullable
private static Keyboard getParsedKeyboard(
- Resources resources, int resourceId, int width, int height) {
+ Resources resources, KeyboardSpecification specification, int width, int height) {
KeyboardParser parser = new KeyboardParser(
- resources, resources.getXml(resourceId), width, height);
+ resources, width, height, specification);
try {
return parser.parseKeyboard();
} catch (XmlPullParserException e) {
@@ -300,8 +304,8 @@
return null;
}
- void setSkinType(SkinType skinType) {
- this.skinType = skinType;
+ void setSkin(Skin skin) {
+ this.skin = skin;
invalidateSelf();
}
diff --git a/src/android/src/com/google/android/inputmethod/japanese/preference/MiniBrowserActivity.java b/src/android/src/com/google/android/inputmethod/japanese/preference/MiniBrowserActivity.java
index 6ee4c0e..304add1 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/preference/MiniBrowserActivity.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/preference/MiniBrowserActivity.java
@@ -80,24 +80,32 @@
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
- Preconditions.checkNotNull(view);
- Preconditions.checkNotNull(url);
+ try {
+ Preconditions.checkNotNull(view);
+ Preconditions.checkNotNull(url);
- // Use temporary matcher intentionally.
- // Regex engine is rather heavy to instantiate so use it as less as possible.
- if (!Pattern.matches(restrictionPattern, url)) {
- // If the URL's doesn't match restriction pattern,
- // delegate the operation to the default browser.
- Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
- if (!packageManager.queryIntentActivities(browserIntent, 0).isEmpty()) {
- context.startActivity(browserIntent);
+ // Use temporary matcher intentionally.
+ // Regex engine is rather heavy to instantiate so use it as less as possible.
+ if (!Pattern.matches(restrictionPattern, url)) {
+ // If the URL's doesn't match restriction pattern,
+ // delegate the operation to the default browser.
+ Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
+ if (!packageManager.queryIntentActivities(browserIntent, 0).isEmpty()) {
+ context.startActivity(browserIntent);
+ }
+ // If no default browser is available, do nothing.
+ return true;
}
- // If no default browser is available, do nothing.
+ // Prevent from invoking default browser.
+ // In some special environment default browser is not installed.
+ return false;
+ } catch (Throwable e) {
+ // This method might be called from native layer.
+ // Therefore throwing something from here causes native crash.
+ // To prevent from native crash, catches all here.
+ // At least SecurityException must be caught here for Android-TV.
return true;
}
- // Prevent from invoking default browser.
- // In some special environment default browser is not installed.
- return false;
}
}
@@ -116,6 +124,15 @@
}
@Override
+ protected void onPause() {
+ // Clear cache in order to show appropriate website even if system locale is changed.
+ if (this.webView.isPresent()) {
+ this.webView.get().clearCache(true);
+ }
+ super.onPause();
+ }
+
+ @Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
Preconditions.checkNotNull(event);
diff --git a/src/android/src/com/google/android/inputmethod/japanese/preference/MozcBasePreferenceActivity.java b/src/android/src/com/google/android/inputmethod/japanese/preference/MozcBasePreferenceActivity.java
index 2593853..75160c6 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/preference/MozcBasePreferenceActivity.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/preference/MozcBasePreferenceActivity.java
@@ -37,6 +37,7 @@
import org.mozc.android.inputmethod.japanese.preference.KeyboardPreviewDrawable.BitmapCache;
import org.mozc.android.inputmethod.japanese.preference.KeyboardPreviewDrawable.CacheReferenceKey;
import org.mozc.android.inputmethod.japanese.resources.R;
+import org.mozc.android.inputmethod.japanese.util.LauncherIconManagerFactory;
import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Optional;
@@ -155,12 +156,13 @@
@VisibleForTesting
void onPostResumeInternal(ApplicationInitializer initializer) {
Context context = getApplicationContext();
- boolean omitWelcomeActivity = false;
Optional<Intent> forwardIntent = initializer.initialize(
- omitWelcomeActivity,
+ MozcUtil.isSystemApplication(context),
MozcUtil.isDevChannel(context),
DependencyFactory.getDependency(getApplicationContext()).isWelcomeActivityPreferrable(),
- MozcUtil.getAbiIndependentVersionCode(context));
+ MozcUtil.getAbiIndependentVersionCode(context),
+ LauncherIconManagerFactory.getDefaultInstance(),
+ PreferenceUtil.getDefaultPreferenceManagerStatic());
if (forwardIntent.isPresent()) {
startActivity(forwardIntent.get());
} else {
diff --git a/src/android/src/com/google/android/inputmethod/japanese/preference/MozcFragmentPreferenceActivity.java b/src/android/src/com/google/android/inputmethod/japanese/preference/MozcFragmentPreferenceActivity.java
index b403565..873ae27 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/preference/MozcFragmentPreferenceActivity.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/preference/MozcFragmentPreferenceActivity.java
@@ -29,12 +29,46 @@
package org.mozc.android.inputmethod.japanese.preference;
+import org.mozc.android.inputmethod.japanese.util.LauncherIconManagerFactory;
+
+import android.content.SharedPreferences;
+import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
+import android.preference.PreferenceManager;
+
/**
* Main Activity class for the fragment based preference UI on Android with API Level >= 11.
*
*/
public class MozcFragmentPreferenceActivity extends MozcFragmentBasePreferenceActivity {
+
public MozcFragmentPreferenceActivity() {
super(PreferencePage.FLAT);
}
+
+ private final OnSharedPreferenceChangeListener sharedPreferenceChangeListener =
+ new OnSharedPreferenceChangeListener() {
+ @Override
+ public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
+ if (PreferenceUtil.PREF_LAUNCHER_ICON_VISIBILITY_KEY.equals(key)) {
+ LauncherIconManagerFactory.getDefaultInstance()
+ .updateLauncherIconVisibility(MozcFragmentPreferenceActivity.this);
+ }
+ }
+ };
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+ PreferenceManager
+ .getDefaultSharedPreferences(this)
+ .registerOnSharedPreferenceChangeListener(sharedPreferenceChangeListener);
+ }
+
+ @Override
+ protected void onPause() {
+ PreferenceManager
+ .getDefaultSharedPreferences(this)
+ .unregisterOnSharedPreferenceChangeListener(sharedPreferenceChangeListener);
+ super.onPause();
+ }
}
diff --git a/src/android/src/com/google/android/inputmethod/japanese/preference/PreferenceUtil.java b/src/android/src/com/google/android/inputmethod/japanese/preference/PreferenceUtil.java
index 324c3ca..169d671 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/preference/PreferenceUtil.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/preference/PreferenceUtil.java
@@ -33,6 +33,7 @@
import org.mozc.android.inputmethod.japanese.MozcUtil;
import org.mozc.android.inputmethod.japanese.preference.ClientSidePreference.KeyboardLayout;
import org.mozc.android.inputmethod.japanese.resources.R;
+import com.google.common.base.Optional;
import com.google.common.base.Preconditions;
import android.content.Context;
@@ -45,6 +46,9 @@
import android.preference.PreferenceManager;
import android.util.DisplayMetrics;
+import java.util.HashSet;
+import java.util.Set;
+
/**
* Utilities for Mozc preferences.
*
@@ -56,7 +60,14 @@
public Preference findPreference(CharSequence key);
}
- private static class PreferenceManagerInterfaceImpl implements PreferenceManagerInterface {
+ /** Simple {@code PreferenceManager} wrapper for testing purpose.
+ * This interface wraps static method so no constructor is required.
+ */
+ public interface PreferenceManagerStaticInterface {
+ public void setDefaultValues(Context context, int id, boolean readAgain);
+ }
+
+ static class PreferenceManagerInterfaceImpl implements PreferenceManagerInterface {
private final PreferenceManager preferenceManager;
PreferenceManagerInterfaceImpl(PreferenceManager preferenceManager) {
@@ -69,6 +80,24 @@
}
}
+ private static Optional<PreferenceManagerStaticInterface> defaultPreferenceManagerStatic =
+ Optional.absent();
+
+ public static PreferenceManagerStaticInterface getDefaultPreferenceManagerStatic() {
+ // As construction cost of defaultPrereferenceManagerStatic is cheap and it is invariant,
+ // no lock mechanism is employed here.
+ if (!defaultPreferenceManagerStatic.isPresent()) {
+ defaultPreferenceManagerStatic = Optional.<PreferenceManagerStaticInterface>of(
+ new PreferenceManagerStaticInterface() {
+ @Override
+ public void setDefaultValues(Context context, int id, boolean readAgain) {
+ PreferenceManager.setDefaultValues(context, id, readAgain);
+ }
+ });
+ }
+ return defaultPreferenceManagerStatic.get();
+ }
+
static class CurrentKeyboardLayoutPreferenceChangeListener implements OnPreferenceChangeListener {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
@@ -133,10 +162,10 @@
"pref_portrait_fullscreen_key";
public static final String PREF_LANDSCAPE_FULLSCREEN_KEY =
"pref_landscape_fullscreen_key";
- public static final String PREF_SKIN_TYPE = "pref_skin_type_key";
- public static final String PREF_HARDWARE_KEYMAP = "pref_hardware_keymap";
// Keys for generic preferences.
+ public static final String PREF_HARDWARE_KEYMAP = "pref_hardware_keymap";
+ public static final String PREF_VOICE_INPUT_KEY = "pref_voice_input_key";
public static final String PREF_HAPTIC_FEEDBACK_KEY = "pref_haptic_feedback_key";
public static final String PREF_HAPTIC_FEEDBACK_DURATION_KEY =
"pref_haptic_feedback_duration_key";
@@ -159,6 +188,10 @@
public static final String PREF_OTHER_INCOGNITO_MODE_KEY = "pref_other_anonimous_mode_key";
public static final String PREF_OTHER_USAGE_STATS_KEY = "pref_other_usage_stats_key";
public static final String PREF_ABOUT_VERSION = "pref_about_version";
+ public static final String PREF_LAUNCHER_ICON_VISIBILITY_KEY = "pref_launcher_icon_visibility";
+ // Application lifecycle
+ public static final String PREF_LAST_LAUNCH_ABI_INDEPENDENT_VERSION_CODE =
+ "pref_last_launch_abi_independent_version_code";
private static final OnPreferenceChangeListener
CURRENT_KEYBOARD_LAYOUT_PREFERENCE_CHANGE_LISTENER =
@@ -168,8 +201,8 @@
private PreferenceUtil() {
}
- static boolean isLandscapeKeyboardSettingActive(SharedPreferences sharedPreferences,
- int deviceOrientation) {
+ public static boolean isLandscapeKeyboardSettingActive(
+ SharedPreferences sharedPreferences, int deviceOrientation) {
Preconditions.checkNotNull(sharedPreferences);
if (sharedPreferences.getBoolean(PREF_USE_PORTRAIT_KEYBOARD_SETTINGS_FOR_LANDSCAPE_KEY, true)) {
// Always use portrait configuration.
@@ -340,4 +373,25 @@
SharedPreferences sharedPreference, String key, Class<T> type, T defaultValue) {
return getEnum(sharedPreference, key, type, defaultValue, defaultValue);
}
+
+ public static void setDefaultValues(PreferenceManagerStaticInterface preferenceManager,
+ Context context, boolean isDebug, boolean useUsageStats) {
+ Preconditions.checkNotNull(preferenceManager);
+ Preconditions.checkNotNull(context);
+ Set<Integer> preferenceResources = new HashSet<Integer>();
+ // Collect all the preferences resource ids from possible preference pages,
+ // removing duplication.
+ for (PreferencePage page : PreferencePage.values()) {
+ for (int id : PreferencePage.getResourceIdList(page, isDebug, useUsageStats)) {
+ preferenceResources.add(id);
+ }
+ }
+ for (int id : preferenceResources) {
+ // 'true' here means the preferences which have not set yet are *always* set here.
+ // This doesn't mean *Reset all the preferences*.
+ // (if 'false' the process will be done once on the first launch
+ // so even if new preferences are added their default values will not be set here)
+ preferenceManager.setDefaultValues(context, id, true);
+ }
+ }
}
diff --git a/src/android/src/com/google/android/inputmethod/japanese/session/LocalSessionHandler.java b/src/android/src/com/google/android/inputmethod/japanese/session/LocalSessionHandler.java
index ccd1a3b..4cb0c15 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/session/LocalSessionHandler.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/session/LocalSessionHandler.java
@@ -32,6 +32,7 @@
import org.mozc.android.inputmethod.japanese.MozcLog;
import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Command;
import org.mozc.android.inputmethod.japanese.util.ZipFileUtil;
+import com.google.common.base.Preconditions;
import com.google.protobuf.InvalidProtocolBufferException;
import android.content.Context;
@@ -50,6 +51,7 @@
*
*/
class LocalSessionHandler implements SessionHandler {
+
private static final String USER_PROFILE_DIRECTORY_NAME = ".mozc";
// The file name of the system dictionary and connection data file in the apk.
// This is determined in build.xml.
@@ -60,7 +62,7 @@
@Override
public void initialize(Context context) {
try {
- ApplicationInfo info = context.getApplicationInfo();
+ ApplicationInfo info = Preconditions.checkNotNull(context).getApplicationInfo();
// Ensure the user profile directory exists.
File userProfileDirectory = new File(info.dataDir, USER_PROFILE_DIRECTORY_NAME);
@@ -104,7 +106,7 @@
@Override
public Command evalCommand(Command command) {
- byte[] inBytes = command.toByteArray();
+ byte[] inBytes = Preconditions.checkNotNull(command).toByteArray();
byte[] outBytes = null;
outBytes = MozcJNI.evalCommand(inBytes);
try {
diff --git a/src/android/src/com/google/android/inputmethod/japanese/session/MozcCommandDebugger.java b/src/android/src/com/google/android/inputmethod/japanese/session/MozcCommandDebugger.java
index 802b1ce..d56dd8f 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/session/MozcCommandDebugger.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/session/MozcCommandDebugger.java
@@ -31,6 +31,7 @@
import org.mozc.android.inputmethod.japanese.MozcLog;
import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Command;
+import com.google.common.base.Preconditions;
/**
* This class logs only input/output protocol buffer Command for MozcJNI.
@@ -44,11 +45,11 @@
static void inLog(Command inCommand) {
MozcLog.v("<evaluate>");
- MozcLog.v(inCommand.getInput().toString());
+ MozcLog.v(Preconditions.checkNotNull(inCommand).getInput().toString());
}
static void outLog(Command outCommand) {
- MozcLog.v(outCommand.getOutput().toString());
+ MozcLog.v(Preconditions.checkNotNull(outCommand).getOutput().toString());
MozcLog.v("</evaluate>");
}
}
diff --git a/src/android/src/com/google/android/inputmethod/japanese/session/MozcJNI.java b/src/android/src/com/google/android/inputmethod/japanese/session/MozcJNI.java
index 307326e..1e29c1f 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/session/MozcJNI.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/session/MozcJNI.java
@@ -30,6 +30,7 @@
package org.mozc.android.inputmethod.japanese.session;
import org.mozc.android.inputmethod.japanese.MozcLog;
+import com.google.common.base.Preconditions;
import java.nio.Buffer;
@@ -53,6 +54,11 @@
static void load(
String userProfileDirectoryPath, Buffer dictionaryBuffer, Buffer connectionDataBuffer,
String expectedVersion) {
+ Preconditions.checkNotNull(userProfileDirectoryPath);
+ Preconditions.checkNotNull(dictionaryBuffer);
+ Preconditions.checkNotNull(connectionDataBuffer);
+ Preconditions.checkNotNull(expectedVersion);
+
if (isLoaded) {
return;
}
diff --git a/src/android/src/com/google/android/inputmethod/japanese/session/SessionExecutor.java b/src/android/src/com/google/android/inputmethod/japanese/session/SessionExecutor.java
index bfee8be..07b3c29 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/session/SessionExecutor.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/session/SessionExecutor.java
@@ -31,6 +31,7 @@
import org.mozc.android.inputmethod.japanese.KeycodeConverter.KeyEventInterface;
import org.mozc.android.inputmethod.japanese.MozcLog;
+import org.mozc.android.inputmethod.japanese.MozcUtil;
import org.mozc.android.inputmethod.japanese.preference.ClientSidePreference;
import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands;
import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Capability;
@@ -60,6 +61,7 @@
import android.content.Context;
import android.content.SharedPreferences;
import android.content.res.Configuration;
+import android.content.res.Resources;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Looper;
@@ -83,27 +85,29 @@
*
*/
public class SessionExecutor {
+
// At the moment we call mozc server via JNI interface directly,
// while other platforms, e.g. Win/Mac/Linux etc, use IPC.
// In order to keep the call order correctly, we call it from the single worker thread.
// Note that we use well-known double check lazy initialization,
// so that we can inject instances via reflections for testing purposes.
- @VisibleForTesting static volatile SessionExecutor instance;
+ @VisibleForTesting static volatile Optional<SessionExecutor> instance = Optional.absent();
+
private static SessionExecutor getInstanceInternal(
- SessionHandlerFactory factory, Context applicationContext) {
- SessionExecutor result = instance;
- if (result == null) {
+ Optional<SessionHandlerFactory> factory, Context applicationContext) {
+ Optional<SessionExecutor> result = instance;
+ if (!result.isPresent()) {
synchronized (SessionExecutor.class) {
result = instance;
- if (result == null) {
- result = instance = new SessionExecutor();
- if (factory != null) {
- result.reset(factory, applicationContext);
+ if (!result.isPresent()) {
+ result = instance = Optional.of(new SessionExecutor());
+ if (factory.isPresent()) {
+ result.get().reset(factory.get(), applicationContext);
}
}
}
}
- return result;
+ return result.get();
}
/**
@@ -112,10 +116,11 @@
* @param executor the new instance to replace the old one.
* @return the old instance.
*/
- public static SessionExecutor setInstanceForTest(SessionExecutor executor) {
+ @VisibleForTesting public static Optional<SessionExecutor> setInstanceForTest(
+ Optional<SessionExecutor> executor) {
synchronized (SessionExecutor.class) {
- SessionExecutor old = instance;
- instance = executor;
+ Optional<SessionExecutor> old = instance;
+ instance = Preconditions.checkNotNull(executor);
return old;
}
}
@@ -126,7 +131,8 @@
* by client in appropriate timing.
*/
public static SessionExecutor getInstance(Context applicationContext) {
- return getInstanceInternal(null, applicationContext);
+ return getInstanceInternal(
+ Optional.<SessionHandlerFactory>absent(), Preconditions.checkNotNull(applicationContext));
}
/**
@@ -135,81 +141,84 @@
*/
public static SessionExecutor getInstanceInitializedIfNecessary(
SessionHandlerFactory factory, Context applicationContext) {
- return getInstanceInternal(factory, applicationContext);
+ return getInstanceInternal(
+ Optional.of(factory), Preconditions.checkNotNull(applicationContext));
}
- private static volatile HandlerThread sessionHandlerThread;
+ private static volatile Optional<HandlerThread> sessionHandlerThread = Optional.absent();
private static HandlerThread getHandlerThread() {
- HandlerThread result = sessionHandlerThread;
- if (result == null) {
+ Optional<HandlerThread> result = sessionHandlerThread;
+ if (!result.isPresent()) {
synchronized (SessionExecutor.class) {
result = sessionHandlerThread;
- if (result == null) {
- result = new HandlerThread("Session worker thread");
- result.setDaemon(true);
- result.start();
+ if (!result.isPresent()) {
+ result = Optional.of(new HandlerThread("Session worker thread"));
+ result.get().setDaemon(true);
+ result.get().start();
sessionHandlerThread = result;
}
}
}
- return result;
+ return result.get();
}
/**
* An interface to accept the result of asynchronous evaluation.
*/
public interface EvaluationCallback {
- void onCompleted(Command command, KeyEventInterface triggeringKeyEvent);
+ void onCompleted(Optional<Command> command, Optional<KeyEventInterface> triggeringKeyEvent);
}
- // Context class during each evaluation. Package private for testing purpose.
- static class AsynchronousEvaluationContext {
+ @VisibleForTesting static class AsynchronousEvaluationContext {
+
// For asynchronous evaluation, we set the sessionId in the callback running on the worker
// thread. So, this class has Input.Builer as an argument for an evaluation, while
// SynchronousEvaluationContext has Input because it is not necessary to be set sessionId.
final long timeStamp;
final Input.Builder inputBuilder;
- volatile Command outCommand;
- final KeyEventInterface triggeringKeyEvent;
- final EvaluationCallback callback;
- final Handler callbackHandler;
+ volatile Optional<Command> outCommand = Optional.absent();
+ final Optional<KeyEventInterface> triggeringKeyEvent;
+ final Optional<EvaluationCallback> callback;
+ final Optional<Handler> callbackHandler;
AsynchronousEvaluationContext(long timeStamp,
Input.Builder inputBuilder,
- KeyEventInterface triggeringKeyEvent,
- EvaluationCallback callback,
- Handler callbackHandler) {
+ Optional<KeyEventInterface> triggeringKeyEvent,
+ Optional<EvaluationCallback> callback,
+ Optional<Handler> callbackHandler) {
this.timeStamp = timeStamp;
- this.inputBuilder = inputBuilder;
- this.triggeringKeyEvent = triggeringKeyEvent;
- this.callback = callback;
- this.callbackHandler = callbackHandler;
+ this.inputBuilder = Preconditions.checkNotNull(inputBuilder);
+ this.triggeringKeyEvent = Preconditions.checkNotNull(triggeringKeyEvent);
+ this.callback = Preconditions.checkNotNull(callback);
+ this.callbackHandler = Preconditions.checkNotNull(callbackHandler);
}
}
- static class SynchronousEvaluationContext {
+ @VisibleForTesting static class SynchronousEvaluationContext {
+
final Input input;
- volatile Command outCommand;
+ volatile Optional<Command> outCommand = Optional.absent();
final CountDownLatch evaluationSynchronizer;
SynchronousEvaluationContext(Input input, CountDownLatch evaluationSynchronizer) {
- this.input = input;
- this.evaluationSynchronizer = evaluationSynchronizer;
+ this.input = Preconditions.checkNotNull(input);
+ this.evaluationSynchronizer = Preconditions.checkNotNull(evaluationSynchronizer);
}
}
- // Context class just lines handler queue.
- static class KeyEventCallBackContext {
+ /** Context class just lines handler queue. */
+ @VisibleForTesting static class KeyEventCallbackContext {
+
final KeyEventInterface triggeringKeyEvent;
final EvaluationCallback callback;
final Handler callbackHandler;
- KeyEventCallBackContext(KeyEventInterface triggeringKeyEvent,
+ KeyEventCallbackContext(KeyEventInterface triggeringKeyEvent,
EvaluationCallback callback,
Handler callbackHandler) {
- this.triggeringKeyEvent = triggeringKeyEvent;
- this.callback = callback;
- this.callbackHandler = callbackHandler;
+ this.triggeringKeyEvent = Preconditions.checkNotNull(triggeringKeyEvent);
+ this.callback = Preconditions.checkNotNull(callback);
+ this.callbackHandler = Preconditions.checkNotNull(callbackHandler);
}
}
@@ -222,9 +231,8 @@
* the UI thread if necessary.
* All evaluations should be done with this class in order to keep evaluation in the incoming
* order.
- * Package private for testing purpose.
*/
- static class ExecutorMainCallback implements Handler.Callback {
+ @VisibleForTesting static class ExecutorMainCallback implements Handler.Callback {
/**
* Initializes the currently connected sesion handler.
@@ -292,20 +300,19 @@
// Mozc session's ID.
// Set on CREATE_SESSION and will not be updated.
@VisibleForTesting long sessionId = INVALID_SESSION_ID;
- @VisibleForTesting Request.Builder request;
+ @VisibleForTesting Optional<Request.Builder> request = Optional.absent();
// The logging for debugging is disabled by default.
boolean isLogging = false;
- ExecutorMainCallback(SessionHandler sessionHandler) {
- if (sessionHandler == null) {
- throw new NullPointerException("sessionHandler is null.");
- }
- this.sessionHandler = sessionHandler;
+ @VisibleForTesting ExecutorMainCallback(SessionHandler sessionHandler) {
+ this.sessionHandler = Preconditions.checkNotNull(sessionHandler);
}
@Override
public boolean handleMessage(Message message) {
+ Preconditions.checkNotNull(message);
+
// Dispatch the message.
switch (message.what) {
case INITIALIZE_SESSION_HANDLER:
@@ -322,12 +329,11 @@
case EVALUATE_SYNCHRONOUSLY:
evaluateSynchronously(SynchronousEvaluationContext.class.cast(message.obj));
break;
- case UPDATE_REQUEST: {
+ case UPDATE_REQUEST:
updateRequest(Input.Builder.class.cast(message.obj));
break;
- }
case PASS_TO_CALLBACK:
- passToCallBack(KeyEventCallBackContext.class.cast(message.obj));
+ passToCallBack(KeyEventCallbackContext.class.cast(message.obj));
break;
default:
// We don't process unknown messages.
@@ -353,7 +359,7 @@
return outCommand;
}
- void ensureSession() {
+ @VisibleForTesting void ensureSession() {
if (sessionId != INVALID_SESSION_ID) {
return;
}
@@ -370,15 +376,13 @@
// with ignoring its result.
// Set mobile dedicated fields, which will not be changed.
// Other fields may be set when the input view is changed.
- request = Request.newBuilder()
- .setMixedConversion(true)
- .setZeroQuerySuggestion(true)
- .setUpdateInputModeFromSurroundingText(false)
- .setAutoPartialSuggestion(true);
+ Request.Builder builder = Request.newBuilder();
+ MozcUtil.setSoftwareKeyboardRequest(builder);
+ request = Optional.of(builder);
evaluate(Input.newBuilder()
.setId(sessionId)
.setType(CommandType.SET_REQUEST)
- .setRequest(request)
+ .setRequest(request.get())
.build());
}
@@ -393,7 +397,7 @@
.build();
evaluate(input);
sessionId = INVALID_SESSION_ID;
- request = null;
+ request = Optional.<Request.Builder>absent();
}
/**
@@ -407,7 +411,7 @@
* result). Squashing will happen when an output consists from only overwritable fields and
* then another output, which will overwrite the UI change caused by the older output, comes.
*/
- static boolean isSquashableOutput(Output output) {
+ @VisibleForTesting static boolean isSquashableOutput(Output output) {
// - If the output contains a result, it is not squashable because it is necessary
// to commit the string to the client application.
// - If it has deletion_range, it is not squashable either because it is necessary
@@ -429,22 +433,22 @@
* @return {@code true} if the given {@code inputBuilder} needs to be set session id.
* Otherwise {@code false}.
*/
- static boolean isSessionIdRequired(InputOrBuilder input) {
+ @VisibleForTesting static boolean isSessionIdRequired(InputOrBuilder input) {
return !SESSION_INDEPENDENT_COMMAND_TYPE_SET.contains(input.getType());
}
- void evaluateAsynchronously(AsynchronousEvaluationContext context,
- Handler sessionExecutorHandler) {
+ @VisibleForTesting void evaluateAsynchronously(AsynchronousEvaluationContext context,
+ Handler sessionExecutorHandler) {
// Before the evaluation, we remove all pending squashable result callbacks for performance
// reason of less powerful devices.
Input.Builder inputBuilder = context.inputBuilder;
- Handler callbackHandler = context.callbackHandler;
- if (callbackHandler != null &&
- inputBuilder.getCommand().getType() != SessionCommand.CommandType.EXPAND_SUGGESTION) {
+ Optional<Handler> callbackHandler = context.callbackHandler;
+ if (callbackHandler.isPresent()
+ && inputBuilder.getCommand().getType() != SessionCommand.CommandType.EXPAND_SUGGESTION) {
// Do not squash by EXPAND_SUGGESTION request, because the result of EXPAND_SUGGESTION
// won't affect the inputConnection in MozcService, as the result should update
// only candidates conceptually.
- callbackHandler.removeMessages(CallbackHandler.SQUASHABLE_OUTPUT);
+ callbackHandler.get().removeMessages(CallbackHandler.SQUASHABLE_OUTPUT);
}
if (inputBuilder.hasKey() &&
@@ -463,51 +467,50 @@
ensureSession();
inputBuilder.setId(sessionId);
}
- context.outCommand = evaluate(inputBuilder.build());
+ context.outCommand = Optional.of(evaluate(inputBuilder.build()));
// Invoke callback handler if necessary.
- if (callbackHandler != null) {
+ if (callbackHandler.isPresent()) {
// For performance reason of, especially, less powerful devices, we want to skip
// rendering whose effect will be overwritten by following (pending) rendering.
// We annotate if the output can be overwritten or not here, so that we can remove
// only those messages in later evaluation.
- Output output = context.outCommand.getOutput();
- Message message = callbackHandler.obtainMessage(
+ Output output = context.outCommand.get().getOutput();
+ Message message = callbackHandler.get().obtainMessage(
isSquashableOutput(output) ? CallbackHandler.SQUASHABLE_OUTPUT
: CallbackHandler.UNSQUASHABLE_OUTPUT,
context);
- callbackHandler.sendMessage(message);
+ callbackHandler.get().sendMessage(message);
}
}
- void evaluateSynchronously(SynchronousEvaluationContext context) {
+ @VisibleForTesting void evaluateSynchronously(SynchronousEvaluationContext context) {
Input input = context.input;
- if (isSessionIdRequired(input)) {
- // We expect only non-session-id-related input for synchronous evaluation.
- throw new IllegalArgumentException(
- "session id is required in evaluateSynchronously, but we don't expect it: " + input);
- }
+ Preconditions.checkArgument(
+ !isSessionIdRequired(input),
+ "We expect only non-session-id-related input for synchronous evaluation: " + input);
- context.outCommand = evaluate(input);
+ context.outCommand = Optional.of(evaluate(input));
// The client thread is waiting for the evaluation by evaluationSynchronizer,
// so notify the thread via the lock.
context.evaluationSynchronizer.countDown();
}
- void updateRequest(Input.Builder inputBuilder) {
+ @VisibleForTesting void updateRequest(Input.Builder inputBuilder) {
ensureSession();
- request.mergeFrom(inputBuilder.getRequest());
+ Preconditions.checkState(request.isPresent());
+ request.get().mergeFrom(inputBuilder.getRequest());
Input input = inputBuilder
.setId(sessionId)
.setType(CommandType.SET_REQUEST)
- .setRequest(request)
+ .setRequest(request.get())
.build();
// Do not render the result because the result does not have preedit.
evaluate(input);
}
- void passToCallBack(KeyEventCallBackContext context) {
+ @VisibleForTesting void passToCallBack(KeyEventCallbackContext context) {
Handler callbackHandler = context.callbackHandler;
Message message = callbackHandler.obtainMessage(CallbackHandler.UNSQUASHABLE_OUTPUT, context);
callbackHandler.sendMessage(message);
@@ -517,7 +520,7 @@
/**
* A handler to process callback for asynchronous evaluation on the UI thread.
*/
- static class CallbackHandler extends Handler {
+ @VisibleForTesting static class CallbackHandler extends Handler {
/**
* The message with this {@code what} cannot be overwritten by following evaluation.
*/
@@ -536,30 +539,28 @@
@Override
public void handleMessage(Message message) {
- if (message.obj.getClass() == KeyEventCallBackContext.class) {
- KeyEventCallBackContext keyEventContext = KeyEventCallBackContext.class.cast(message.obj);
- keyEventContext.callback.onCompleted(null, keyEventContext.triggeringKeyEvent);
+ if (Preconditions.checkNotNull(message).obj.getClass() == KeyEventCallbackContext.class) {
+ KeyEventCallbackContext keyEventContext = KeyEventCallbackContext.class.cast(message.obj);
+ keyEventContext.callback.onCompleted(
+ Optional.<Command>absent(), Optional.of(keyEventContext.triggeringKeyEvent));
return;
}
- AsynchronousEvaluationContext context =
- AsynchronousEvaluationContext.class.cast(message.obj);
+ AsynchronousEvaluationContext context = AsynchronousEvaluationContext.class.cast(message.obj);
// Note that this method should be run on the UI thread, where removePendingEvaluations runs,
// so we don't need to take a lock here.
if (context.timeStamp - cancelTimeStamp > 0) {
- context.callback.onCompleted(context.outCommand, context.triggeringKeyEvent);
+ Preconditions.checkState(context.callback.isPresent());
+ context.callback.get().onCompleted(context.outCommand, context.triggeringKeyEvent);
}
}
}
- @VisibleForTesting Handler handler;
- private ExecutorMainCallback mainCallback;
+ @VisibleForTesting Optional<Handler> handler = Optional.absent();
+ private Optional<ExecutorMainCallback> mainCallback = Optional.absent();
private final CallbackHandler callbackHandler;
// Note that theoretically the constructor should be private in order to keep this singleton,
- // but we use protected for testing purpose.
- protected SessionExecutor() {
- handler = null;
- mainCallback = null;
+ @VisibleForTesting protected SessionExecutor() {
callbackHandler = new CallbackHandler(Looper.getMainLooper());
}
@@ -583,7 +584,8 @@
*/
@VisibleForTesting
public void waitForAllQueuesForEmpty() {
- waitForQueueForEmpty(handler);
+ Preconditions.checkState(handler.isPresent());
+ waitForQueueForEmpty(handler.get());
waitForQueueForEmpty(callbackHandler);
}
@@ -591,19 +593,21 @@
* Resets the instance by setting {@code SessionHandler} created by the given {@code factory}.
*/
public void reset(SessionHandlerFactory factory, Context applicationContext) {
+ Preconditions.checkNotNull(factory);
+ Preconditions.checkNotNull(applicationContext);
HandlerThread thread = getHandlerThread();
- mainCallback = new ExecutorMainCallback(factory.create());
- handler = new Handler(thread.getLooper(), mainCallback);
- handler.sendMessage(handler.obtainMessage(ExecutorMainCallback.INITIALIZE_SESSION_HANDLER,
- applicationContext));
+ mainCallback = Optional.of(new ExecutorMainCallback(factory.create()));
+ handler = Optional.of(new Handler(thread.getLooper(), mainCallback.get()));
+ handler.get().sendMessage(handler.get().obtainMessage(
+ ExecutorMainCallback.INITIALIZE_SESSION_HANDLER, applicationContext));
}
/**
* @param isLogging Set {@code true} if logging of evaluations is needed.
*/
public void setLogging(boolean isLogging) {
- if (mainCallback != null) {
- mainCallback.isLogging = isLogging;
+ if (mainCallback.isPresent()) {
+ mainCallback.get().isLogging = isLogging;
}
}
@@ -612,18 +616,19 @@
*/
public void removePendingEvaluations() {
callbackHandler.cancelTimeStamp = System.nanoTime();
- if (handler != null) {
- handler.removeMessages(ExecutorMainCallback.EVALUATE_ASYNCHRONOUSLY);
- handler.removeMessages(ExecutorMainCallback.EVALUATE_KEYEVENT_ASYNCHRONOUSLY);
- handler.removeMessages(ExecutorMainCallback.EVALUATE_SYNCHRONOUSLY);
- handler.removeMessages(ExecutorMainCallback.UPDATE_REQUEST);
+ if (handler.isPresent()) {
+ handler.get().removeMessages(ExecutorMainCallback.EVALUATE_ASYNCHRONOUSLY);
+ handler.get().removeMessages(ExecutorMainCallback.EVALUATE_KEYEVENT_ASYNCHRONOUSLY);
+ handler.get().removeMessages(ExecutorMainCallback.EVALUATE_SYNCHRONOUSLY);
+ handler.get().removeMessages(ExecutorMainCallback.UPDATE_REQUEST);
}
callbackHandler.removeMessages(CallbackHandler.UNSQUASHABLE_OUTPUT);
callbackHandler.removeMessages(CallbackHandler.SQUASHABLE_OUTPUT);
}
public void deleteSession() {
- handler.sendMessage(handler.obtainMessage(ExecutorMainCallback.DELETE_SESSION));
+ Preconditions.checkState(handler.isPresent());
+ handler.get().sendMessage(handler.get().obtainMessage(ExecutorMainCallback.DELETE_SESSION));
}
/**
@@ -634,71 +639,84 @@
* This method returns immediately, i.e., even after this method's invocation,
* it shouldn't be assumed that the evaluation is done.
*
- * Note that this method is exposed as package private for testing purpose.
- *
* @param inputBuilder the input data
* @param triggeringKeyEvent a key event which triggers this evaluation
* @param callback a callback handler if needed
*/
- void evaluateAsynchronously(Input.Builder inputBuilder, KeyEventInterface triggeringKeyEvent,
- EvaluationCallback callback) {
+ @VisibleForTesting void evaluateAsynchronously(
+ Input.Builder inputBuilder, Optional<KeyEventInterface> triggeringKeyEvent,
+ Optional<EvaluationCallback> callback) {
+ Preconditions.checkState(handler.isPresent());
AsynchronousEvaluationContext context = new AsynchronousEvaluationContext(
- System.nanoTime(), inputBuilder, triggeringKeyEvent,
- callback, callback == null ? null : callbackHandler);
- int type = (triggeringKeyEvent != null)
+ System.nanoTime(), Preconditions.checkNotNull(inputBuilder),
+ Preconditions.checkNotNull(triggeringKeyEvent), Preconditions.checkNotNull(callback),
+ callback.isPresent() ? Optional.<Handler>of(callbackHandler) : Optional.<Handler>absent());
+ int type = (triggeringKeyEvent.isPresent())
? ExecutorMainCallback.EVALUATE_KEYEVENT_ASYNCHRONOUSLY
: ExecutorMainCallback.EVALUATE_ASYNCHRONOUSLY;
- handler.sendMessage(handler.obtainMessage(type, context));
+ handler.get().sendMessage(handler.get().obtainMessage(type, context));
}
/**
* Sends {@code SEND_KEY} command to the server asynchronously.
*/
public void sendKey(ProtoCommands.KeyEvent mozcKeyEvent, KeyEventInterface triggeringKeyEvent,
- List<? extends TouchEvent> touchEventList, EvaluationCallback callback) {
+ List<TouchEvent> touchEventList, EvaluationCallback callback) {
+ Preconditions.checkNotNull(mozcKeyEvent);
+ Preconditions.checkNotNull(triggeringKeyEvent);
+ Preconditions.checkNotNull(touchEventList);
+ Preconditions.checkNotNull(callback);
+
Input.Builder inputBuilder = Input.newBuilder()
.setType(CommandType.SEND_KEY)
.setKey(mozcKeyEvent)
.addAllTouchEvents(touchEventList);
- evaluateAsynchronously(inputBuilder, triggeringKeyEvent, callback);
+ evaluateAsynchronously(inputBuilder, Optional.of(triggeringKeyEvent), Optional.of(callback));
}
/**
* Sends {@code SUBMIT} command to the server asynchronously.
*/
public void submit(EvaluationCallback callback) {
+ Preconditions.checkNotNull(callback);
Input.Builder inputBuilder = Input.newBuilder()
.setType(CommandType.SEND_COMMAND)
.setCommand(SessionCommand.newBuilder()
.setType(SessionCommand.CommandType.SUBMIT));
- evaluateAsynchronously(inputBuilder, null, callback);
+ evaluateAsynchronously(
+ inputBuilder, Optional.<KeyEventInterface>absent(), Optional.of(callback));
}
/**
* Sends {@code SWITCH_INPUT_MODE} command to the server asynchronously.
*/
- public void switchInputMode(KeyEventInterface triggeringKeyEvent, CompositionMode mode,
+ public void switchInputMode(Optional<KeyEventInterface> triggeringKeyEvent, CompositionMode mode,
EvaluationCallback callback) {
+ Preconditions.checkNotNull(triggeringKeyEvent);
+ Preconditions.checkNotNull(mode);
+ Preconditions.checkNotNull(callback);
Input.Builder inputBuilder = Input.newBuilder()
.setType(CommandType.SEND_COMMAND)
.setCommand(SessionCommand.newBuilder()
.setType(SessionCommand.CommandType.SWITCH_INPUT_MODE)
.setCompositionMode(mode));
- evaluateAsynchronously(inputBuilder, triggeringKeyEvent, callback);
+ evaluateAsynchronously(inputBuilder, triggeringKeyEvent, Optional.of(callback));
}
/**
* Sends {@code SUBMIT_CANDIDATE} command to the server asynchronously.
*/
public void submitCandidate(int candidateId, Optional<Integer> rowIndex,
- EvaluationCallback callback) {
+ EvaluationCallback callback) {
Preconditions.checkNotNull(rowIndex);
+ Preconditions.checkNotNull(callback);
Input.Builder inputBuilder = Input.newBuilder()
.setType(CommandType.SEND_COMMAND)
.setCommand(SessionCommand.newBuilder()
.setType(SessionCommand.CommandType.SUBMIT_CANDIDATE)
.setId(candidateId));
- evaluateAsynchronously(inputBuilder, null, callback);
+ evaluateAsynchronously(
+ inputBuilder, Optional.<KeyEventInterface>absent(), Optional.of(callback));
if (rowIndex.isPresent()) {
candidateSubmissionStatsEvent(rowIndex.get());
@@ -753,45 +771,78 @@
.setType(CommandType.SEND_COMMAND)
.setCommand(SessionCommand.newBuilder()
.setType(SessionCommand.CommandType.RESET_CONTEXT));
- evaluateAsynchronously(inputBuilder, null, null);
+ evaluateAsynchronously(
+ inputBuilder, Optional.<KeyEventInterface>absent(), Optional.<EvaluationCallback>absent());
}
/**
* Sends {@code MOVE_CURSOR} command to the server asynchronously.
*/
public void moveCursor(int cursorPosition, EvaluationCallback callback) {
+ Preconditions.checkNotNull(callback);
Input.Builder inputBuilder = Input.newBuilder()
.setType(CommandType.SEND_COMMAND)
.setCommand(SessionCommand.newBuilder()
.setType(ProtoCommands.SessionCommand.CommandType.MOVE_CURSOR)
.setCursorPosition(cursorPosition));
- evaluateAsynchronously(inputBuilder, null, callback);
+ evaluateAsynchronously(
+ inputBuilder, Optional.<KeyEventInterface>absent(), Optional.of(callback));
+ }
+
+ /**
+ * Sends {@code CONVERT_NEXT_PAGE} command to the server asynchronously.
+ */
+ public void pageDown(EvaluationCallback callback) {
+ Preconditions.checkNotNull(callback);
+ Input.Builder inputBuilder = Input.newBuilder()
+ .setType(CommandType.SEND_COMMAND)
+ .setCommand(SessionCommand.newBuilder()
+ .setType(SessionCommand.CommandType.CONVERT_NEXT_PAGE));
+ evaluateAsynchronously(
+ inputBuilder, Optional.<KeyEventInterface>absent(), Optional.of(callback));
+ }
+
+ /**
+ * Sends {@code CONVERT_PREV_PAGE} command to the server asynchronously.
+ */
+ public void pageUp(EvaluationCallback callback) {
+ Preconditions.checkNotNull(callback);
+ Input.Builder inputBuilder = Input.newBuilder()
+ .setType(CommandType.SEND_COMMAND)
+ .setCommand(SessionCommand.newBuilder()
+ .setType(SessionCommand.CommandType.CONVERT_PREV_PAGE));
+ evaluateAsynchronously(
+ inputBuilder, Optional.<KeyEventInterface>absent(), Optional.of(callback));
}
/**
* Sends {@code SWITCH_INPUT_FIELD_TYPE} command to the server asynchronously.
*/
public void switchInputFieldType(InputFieldType inputFieldType) {
+ Preconditions.checkNotNull(inputFieldType);
Input.Builder inputBuilder = Input.newBuilder()
.setType(CommandType.SEND_COMMAND)
.setCommand(SessionCommand.newBuilder()
.setType(ProtoCommands.SessionCommand.CommandType.SWITCH_INPUT_FIELD_TYPE))
.setContext(ProtoCommands.Context.newBuilder()
.setInputFieldType(inputFieldType));
- evaluateAsynchronously(inputBuilder, null, null);
+ evaluateAsynchronously(
+ inputBuilder, Optional.<KeyEventInterface>absent(), Optional.<EvaluationCallback>absent());
}
/**
* Sends {@code UNDO_OR_REWIND} command to the server asynchronously.
*/
- public void undoOrRewind(List<? extends TouchEvent> touchEventList,
- EvaluationCallback callback) {
+ public void undoOrRewind(List<TouchEvent> touchEventList, EvaluationCallback callback) {
+ Preconditions.checkNotNull(touchEventList);
+ Preconditions.checkNotNull(callback);
Input.Builder inputBuilder = Input.newBuilder()
.setType(CommandType.SEND_COMMAND)
.setCommand(SessionCommand.newBuilder()
.setType(SessionCommand.CommandType.UNDO_OR_REWIND))
.addAllTouchEvents(touchEventList);
- evaluateAsynchronously(inputBuilder, null, callback);
+ evaluateAsynchronously(
+ inputBuilder, Optional.<KeyEventInterface>absent(), Optional.of(callback));
}
/**
@@ -799,28 +850,36 @@
* to the server asynchronously.
*/
public void insertToStorage(StorageType type, String key, List<ByteString> values) {
+ Preconditions.checkNotNull(type);
+ Preconditions.checkNotNull(key);
+ Preconditions.checkNotNull(values);
Input.Builder inputBuilder = Input.newBuilder()
.setType(CommandType.INSERT_TO_STORAGE)
.setStorageEntry(GenericStorageEntry.newBuilder()
.setType(type)
.setKey(key)
.addAllValue(values));
- evaluateAsynchronously(inputBuilder, null, null);
+ evaluateAsynchronously(
+ inputBuilder, Optional.<KeyEventInterface>absent(), Optional.<EvaluationCallback>absent());
}
public void expandSuggestion(EvaluationCallback callback) {
+ Preconditions.checkNotNull(callback);
Input.Builder inputBuilder = Input.newBuilder()
.setType(CommandType.SEND_COMMAND)
.setCommand(
SessionCommand.newBuilder().setType(SessionCommand.CommandType.EXPAND_SUGGESTION));
- evaluateAsynchronously(inputBuilder, null, callback);
+ evaluateAsynchronously(
+ inputBuilder, Optional.<KeyEventInterface>absent(), Optional.of(callback));
}
- public void preferenceUsageStatsEvent(SharedPreferences sharedPreferences) {
+ public void preferenceUsageStatsEvent(SharedPreferences sharedPreferences, Resources resources) {
Preconditions.checkNotNull(sharedPreferences);
+ Preconditions.checkNotNull(resources);
ClientSidePreference landscapePreference =
- new ClientSidePreference(sharedPreferences, Configuration.ORIENTATION_LANDSCAPE);
+ new ClientSidePreference(
+ sharedPreferences, resources, Configuration.ORIENTATION_LANDSCAPE);
evaluateAsynchronously(
Input.newBuilder()
.setType(CommandType.SEND_COMMAND)
@@ -828,10 +887,11 @@
.setType(SessionCommand.CommandType.USAGE_STATS_EVENT)
.setUsageStatsEvent(UsageStatsEvent.SOFTWARE_KEYBOARD_LAYOUT_LANDSCAPE)
.setUsageStatsEventIntValue(landscapePreference.getKeyboardLayout().getId())),
- null, null);
+ Optional.<KeyEventInterface>absent(), Optional.<EvaluationCallback>absent());
ClientSidePreference portraitPreference =
- new ClientSidePreference(sharedPreferences, Configuration.ORIENTATION_PORTRAIT);
+ new ClientSidePreference(
+ sharedPreferences, resources, Configuration.ORIENTATION_PORTRAIT);
evaluateAsynchronously(
Input.newBuilder()
.setType(CommandType.SEND_COMMAND)
@@ -839,10 +899,10 @@
.setType(SessionCommand.CommandType.USAGE_STATS_EVENT)
.setUsageStatsEvent(UsageStatsEvent.SOFTWARE_KEYBOARD_LAYOUT_PORTRAIT)
.setUsageStatsEventIntValue(portraitPreference.getKeyboardLayout().getId())),
- null, null);
+ Optional.<KeyEventInterface>absent(), Optional.<EvaluationCallback>absent());
}
- public void touchEventUsageStatsEvent(List<? extends TouchEvent> touchEventList) {
+ public void touchEventUsageStatsEvent(List<TouchEvent> touchEventList) {
if (Preconditions.checkNotNull(touchEventList).isEmpty()) {
return;
}
@@ -852,26 +912,27 @@
.setCommand(SessionCommand.newBuilder()
.setType(SessionCommand.CommandType.USAGE_STATS_EVENT))
.addAllTouchEvents(touchEventList);
- evaluateAsynchronously(inputBuilder, null, null);
+ evaluateAsynchronously(
+ inputBuilder, Optional.<KeyEventInterface>absent(), Optional.<EvaluationCallback>absent());
}
public void syncData() {
Input.Builder inputBuilder = Input.newBuilder()
.setType(CommandType.SYNC_DATA);
- evaluateAsynchronously(inputBuilder, null, null);
+ evaluateAsynchronously(
+ inputBuilder, Optional.<KeyEventInterface>absent(), Optional.<EvaluationCallback>absent());
}
/**
* Evaluates the input on the JNI worker thread, and wait that the evaluation is done.
* This method blocks (typically <30ms).
- *
- * Note that this method is exposed as package private for testing purpose.
*/
- Output evaluateSynchronously(Input input) {
+ @VisibleForTesting Output evaluateSynchronously(Input input) {
+ Preconditions.checkState(handler.isPresent());
CountDownLatch evaluationSynchronizer = new CountDownLatch(1);
SynchronousEvaluationContext context =
new SynchronousEvaluationContext(input, evaluationSynchronizer);
- handler.sendMessage(handler.obtainMessage(
+ handler.get().sendMessage(handler.get().obtainMessage(
ExecutorMainCallback.EVALUATE_SYNCHRONOUSLY, context));
try {
@@ -880,7 +941,7 @@
MozcLog.w("Session thread is interrupted during evaluation.");
}
- return context.outCommand.getOutput();
+ return context.outCommand.get().getOutput();
}
/**
@@ -895,19 +956,22 @@
* Sets the given {@code config} to the server.
*/
public void setConfig(Config config) {
+ Preconditions.checkNotNull(config);
// Ignore output.
evaluateAsynchronously(
- Input.newBuilder().setType(Input.CommandType.SET_CONFIG).setConfig(config), null, null);
+ Input.newBuilder().setType(Input.CommandType.SET_CONFIG).setConfig(config),
+ Optional.<KeyEventInterface>absent(), Optional.<EvaluationCallback>absent());
}
/**
* Sets the given {@code config} to the server as imposed config.
*/
public void setImposedConfig(Config config) {
+ Preconditions.checkNotNull(config);
// Ignore output.
evaluateAsynchronously(
Input.newBuilder().setType(Input.CommandType.SET_IMPOSED_CONFIG).setConfig(config),
- null, null);
+ Optional.<KeyEventInterface>absent(), Optional.<EvaluationCallback>absent());
}
/**
@@ -939,6 +1003,7 @@
* @param storageType the storage to be cleared
*/
public void clearStorage(StorageType storageType) {
+ Preconditions.checkNotNull(storageType);
evaluateSynchronously(
Input.newBuilder()
.setType(CommandType.CLEAR_STORAGE)
@@ -950,6 +1015,7 @@
* Reads stored values of the given {@code type} from the server, and returns it.
*/
public List<ByteString> readAllFromStorage(StorageType type) {
+ Preconditions.checkNotNull(type);
Input input = Input.newBuilder()
.setType(CommandType.READ_ALL_FROM_STORAGE)
.setStorageEntry(GenericStorageEntry.newBuilder()
@@ -965,13 +1031,15 @@
public void reload() {
// Ignore output.
evaluateAsynchronously(
- Input.newBuilder().setType(Input.CommandType.RELOAD), null, null);
+ Input.newBuilder().setType(Input.CommandType.RELOAD), Optional.<KeyEventInterface>absent(),
+ Optional.<EvaluationCallback>absent());
}
/**
* Sends SEND_USER_DICTIONARY_COMMAND to edit user dictionaries.
*/
public UserDictionaryCommandStatus sendUserDictionaryCommand(UserDictionaryCommand command) {
+ Preconditions.checkNotNull(command);
Output output = evaluateSynchronously(Input.newBuilder()
.setType(CommandType.SEND_USER_DICTIONARY_COMMAND)
.setUserDictionaryCommand(command)
@@ -982,26 +1050,34 @@
/**
* Sends an UPDATE_REQUEST command to the evaluation thread.
*/
- public void updateRequest(Request update, List<? extends TouchEvent> touchEventList) {
+ public void updateRequest(Request update, List<TouchEvent> touchEventList) {
+ Preconditions.checkNotNull(update);
+ Preconditions.checkNotNull(touchEventList);
+ Preconditions.checkState(handler.isPresent());
Input.Builder inputBuilder = Input.newBuilder()
.setRequest(update)
.addAllTouchEvents(touchEventList);
- handler.sendMessage(handler.obtainMessage(ExecutorMainCallback.UPDATE_REQUEST, inputBuilder));
+ handler.get().sendMessage(
+ handler.get().obtainMessage(ExecutorMainCallback.UPDATE_REQUEST, inputBuilder));
}
public void sendKeyEvent(KeyEventInterface triggeringKeyEvent, EvaluationCallback callback) {
- KeyEventCallBackContext context = new KeyEventCallBackContext(
- triggeringKeyEvent, callback, callbackHandler);
- handler.sendMessage(handler.obtainMessage(ExecutorMainCallback.PASS_TO_CALLBACK, context));
+ Preconditions.checkNotNull(triggeringKeyEvent);
+ Preconditions.checkNotNull(callback);
+ Preconditions.checkState(handler.isPresent());
+ KeyEventCallbackContext context =
+ new KeyEventCallbackContext(triggeringKeyEvent, callback, callbackHandler);
+ handler.get().sendMessage(
+ handler.get().obtainMessage(ExecutorMainCallback.PASS_TO_CALLBACK, context));
}
public void sendUsageStatsEvent(UsageStatsEvent event) {
evaluateAsynchronously(
Input.newBuilder()
- .setType(CommandType.SEND_COMMAND)
- .setCommand(SessionCommand.newBuilder()
- .setType(SessionCommand.CommandType.USAGE_STATS_EVENT)
- .setUsageStatsEvent(event)),
- null, null);
+ .setType(CommandType.SEND_COMMAND)
+ .setCommand(SessionCommand.newBuilder()
+ .setType(SessionCommand.CommandType.USAGE_STATS_EVENT)
+ .setUsageStatsEvent(event)),
+ Optional.<KeyEventInterface>absent(), Optional.<EvaluationCallback>absent());
}
}
diff --git a/src/android/src/com/google/android/inputmethod/japanese/session/SessionHandlerFactory.java b/src/android/src/com/google/android/inputmethod/japanese/session/SessionHandlerFactory.java
index 6911632..e352752 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/session/SessionHandlerFactory.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/session/SessionHandlerFactory.java
@@ -31,6 +31,8 @@
import org.mozc.android.inputmethod.japanese.MozcLog;
import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Optional;
+import com.google.common.base.Preconditions;
import android.content.Context;
import android.content.SharedPreferences;
@@ -48,6 +50,7 @@
*
*/
public class SessionHandlerFactory {
+
@VisibleForTesting static final String PREF_TWEAK_USE_SOCKET_SESSION_HANDLER_KEY =
"pref_tweak_use_socket_session_handler";
@VisibleForTesting static final String PREF_TWEAK_SOCKET_SESSION_HANDLER_ADDRESS_KEY =
@@ -55,25 +58,26 @@
@VisibleForTesting static final String PREF_TWEAK_SOCKET_SESSION_HANDLER_PORT_KEY =
"pref_tweak_socket_session_handler_port";
- private final SharedPreferences sharedPreferences;
+ private final Optional<SharedPreferences> sharedPreferences;
public SessionHandlerFactory(Context context) {
- this(context == null ? null : PreferenceManager.getDefaultSharedPreferences(context));
+ this(Optional.of(
+ PreferenceManager.getDefaultSharedPreferences(Preconditions.checkNotNull(context))));
}
/**
* @param sharedPreferences the preferences. The type to be created is based on the preference.
*/
- public SessionHandlerFactory(SharedPreferences sharedPreferences) {
- this.sharedPreferences = sharedPreferences;
+ public SessionHandlerFactory(Optional<SharedPreferences> sharedPreferences) {
+ this.sharedPreferences = Preconditions.checkNotNull(sharedPreferences);
}
/**
* Creates a session handler.
*/
public SessionHandler create() {
- if (sharedPreferences != null &&
- sharedPreferences.getBoolean(PREF_TWEAK_USE_SOCKET_SESSION_HANDLER_KEY, false)) {
+ if (sharedPreferences.isPresent()
+ && sharedPreferences.get().getBoolean(PREF_TWEAK_USE_SOCKET_SESSION_HANDLER_KEY, false)) {
try {
MozcLog.i("Trying to connect to Mozc server via network");
// If PREF_TWEAK_USE_SOCKET_SESSION_HANDLER_KEY is enabled,
@@ -81,10 +85,10 @@
// "10.0.2.2" is the host PC's address in emulator environment.
// 8000 is the server's default port.
int port =
- Integer.parseInt(sharedPreferences.getString(
+ Integer.parseInt(sharedPreferences.get().getString(
PREF_TWEAK_SOCKET_SESSION_HANDLER_PORT_KEY, "8000"));
InetAddress hostAddress =
- InetAddress.getByName(sharedPreferences.getString(
+ InetAddress.getByName(sharedPreferences.get().getString(
PREF_TWEAK_SOCKET_SESSION_HANDLER_ADDRESS_KEY, "10.0.2.2"));
SocketSessionHandler socketSessionHandler = new SocketSessionHandler(hostAddress, port);
if (socketSessionHandler.isReachable()) {
diff --git a/src/android/src/com/google/android/inputmethod/japanese/session/SocketSessionHandler.java b/src/android/src/com/google/android/inputmethod/japanese/session/SocketSessionHandler.java
index 2546393..6d2e5dc 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/session/SocketSessionHandler.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/session/SocketSessionHandler.java
@@ -32,6 +32,7 @@
import org.mozc.android.inputmethod.japanese.MozcUtil;
import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Command;
import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Output;
+import com.google.common.base.Preconditions;
import android.content.Context;
@@ -58,7 +59,7 @@
private final InetAddress host;
private final int port;
SocketSessionHandler(InetAddress host, int port) {
- this.host = host;
+ this.host = Preconditions.checkNotNull(host);
this.port = port;
}
@@ -69,6 +70,8 @@
@Override
public Command evalCommand(Command command) {
+ Preconditions.checkNotNull(command);
+
// We should be in a worker thread so below invocation is not needed. Just in case.
MozcUtil.relaxMainthreadStrictMode();
try {
diff --git a/src/android/src/com/google/android/inputmethod/japanese/ui/CandidateLayoutRenderer.java b/src/android/src/com/google/android/inputmethod/japanese/ui/CandidateLayoutRenderer.java
index 18f3860..a29ee1e 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/ui/CandidateLayoutRenderer.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/ui/CandidateLayoutRenderer.java
@@ -29,12 +29,12 @@
package org.mozc.android.inputmethod.japanese.ui;
-import org.mozc.android.inputmethod.japanese.emoji.EmojiProviderType;
import org.mozc.android.inputmethod.japanese.protobuf.ProtoCandidates.CandidateList;
import org.mozc.android.inputmethod.japanese.protobuf.ProtoCandidates.CandidateWord;
import org.mozc.android.inputmethod.japanese.ui.CandidateLayout.Row;
import org.mozc.android.inputmethod.japanese.ui.CandidateLayout.Span;
import org.mozc.android.inputmethod.japanese.view.CarrierEmojiRenderHelper;
+import org.mozc.android.inputmethod.japanese.view.Skin;
import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Optional;
import com.google.common.base.Preconditions;
@@ -42,17 +42,18 @@
import android.annotation.SuppressLint;
import android.graphics.Canvas;
import android.graphics.Color;
+import android.graphics.Paint;
import android.graphics.Paint.Align;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
+import android.os.Build;
import android.text.Layout;
import android.text.Layout.Alignment;
import android.text.StaticLayout;
import android.text.TextPaint;
-import android.util.FloatMath;
-import android.view.View;
import java.util.List;
+import java.util.Locale;
/**
* Renders the {@link CandidateLayout} instance to the {@link Canvas}.
@@ -102,6 +103,11 @@
* won't be overlapped).
*/
EXCLUSIVE,
+
+ /**
+ * Like View.GONE, the descriptor is not shown and doesn't occupy any are.
+ */
+ GONE,
}
private static final int[] STATE_EMPTY = {};
@@ -110,9 +116,14 @@
// Should not edit its contents.
private static final int[] STATE_FOCUSED = { android.R.attr.state_focused };
- private final CarrierEmojiRenderHelper carrierEmojiRenderHelper;
+ /** Locale field for {@link Paint#setTextLocale(Locale)}. */
+ private static final Optional<Locale> TEXT_LOCALE = (Build.VERSION.SDK_INT >= 17)
+ ? Optional.of(Locale.JAPAN) : Optional.<Locale>absent();
+
private final TextPaint valuePaint = createTextPaint(true, Color.BLACK, Align.LEFT);
+ private final TextPaint focusedValuePaint = createTextPaint(true, Color.BLACK, Align.LEFT);
private final TextPaint descriptionPaint = createTextPaint(true, Color.GRAY, Align.RIGHT);
+ private final Paint separatorPaint = new Paint();
/**
* The cache of Rect instance for the clip used in drawCandidateList method to reduce the
@@ -130,18 +141,21 @@
private ValueScalingPolicy valueScalingPolicy = ValueScalingPolicy.UNIFORM;
private DescriptionLayoutPolicy descriptionLayoutPolicy = DescriptionLayoutPolicy.OVERLAY;
- private Optional<Drawable> spanBackgroundDrawable;
+ private Optional<Drawable> spanBackgroundDrawable = Optional.absent();
@VisibleForTesting int focusedIndex = -1;
- public CandidateLayoutRenderer(View targetView) {
- carrierEmojiRenderHelper = new CarrierEmojiRenderHelper(Preconditions.checkNotNull(targetView));
+ public CandidateLayoutRenderer() {
}
+ @SuppressLint("NewApi")
private static TextPaint createTextPaint(boolean antiAlias, int color, Align align) {
TextPaint textPaint = new TextPaint();
textPaint.setAntiAlias(antiAlias);
textPaint.setColor(color);
textPaint.setTextAlign(Preconditions.checkNotNull(align));
+ if (TEXT_LOCALE.isPresent()) {
+ textPaint.setTextLocale(TEXT_LOCALE.get());
+ }
return textPaint;
}
@@ -151,10 +165,16 @@
return (index == focusedIndex) || (index == pressedCandidateIndex);
}
+ public void setSkin(Skin skin) {
+ Preconditions.checkNotNull(skin);
+ valuePaint.setColor(skin.candidateValueTextColor);
+ focusedValuePaint.setColor(skin.candidateValueFocusedTextColor);
+ descriptionPaint.setColor(skin.candidateDescriptionTextColor);
+ }
+
public void setValueTextSize(float valueTextSize) {
this.valueTextSize = valueTextSize;
this.valuePaint.setTextSize(valueTextSize);
- this.carrierEmojiRenderHelper.setCandidateTextSize(valueTextSize);
}
public void setValueHorizontalPadding(float valueHorizontalPadding) {
@@ -182,11 +202,6 @@
this.descriptionLayoutPolicy = Preconditions.checkNotNull(descriptionLayoutPolicy);
}
- public void setEmojiProviderType(EmojiProviderType emojiProviderType) {
- this.carrierEmojiRenderHelper.setEmojiProviderType(
- Preconditions.checkNotNull(emojiProviderType));
- }
-
public void setSpanBackgroundDrawable(Optional<Drawable> drawable) {
this.spanBackgroundDrawable = Preconditions.checkNotNull(drawable);
}
@@ -196,31 +211,22 @@
focusedIndex = (candidateList.isPresent() && candidateList.get().hasFocusedIndex())
? candidateList.get().getFocusedIndex()
: -1;
- carrierEmojiRenderHelper.setCandidateList(candidateList);
}
- /**
- * In order to support emoji rendering, the client of this class must invoke this method
- * in its onAttachedToWindow method.
- */
- public void onAttachedToWindow() {
- carrierEmojiRenderHelper.onAttachedToWindow();
+ public void setSeparatorWidth(float separatorWidth) {
+ separatorPaint.setStrokeWidth(separatorWidth);
}
- /**
- * In order to support emoji rendering, the client of this class must invoke this method
- * in its onDeachedFromWindow method.
- */
- @SuppressLint("MissingSuperCall")
- public void onDetachedFromWindow() {
- carrierEmojiRenderHelper.onDetachedFromWindow();
+ public void setSeparatorColor(int color) {
+ separatorPaint.setColor(color);
}
/**
* Renders the {@code candidateLayout} to the given {@code canvas}.
*/
public void drawCandidateLayout(
- Canvas canvas, CandidateLayout candidateLayout, int pressedCandidateIndex) {
+ Canvas canvas, CandidateLayout candidateLayout, int pressedCandidateIndex,
+ CarrierEmojiRenderHelper carrierEmojiRenderHelper) {
Preconditions.checkNotNull(canvas);
Preconditions.checkNotNull(candidateLayout);
@@ -237,6 +243,10 @@
continue;
}
+ float separatorMargin = row.getHeight() * 0.2f;
+ float separatorTop = row.getTop() + separatorMargin;
+ float separatorBottom = row.getTop() + row.getHeight() - separatorMargin;
+
for (Span span : row.getSpanList()) {
if (span.getLeft() > clipBounds.right) {
break;
@@ -244,16 +254,23 @@
if (span.getRight() < clipBounds.left) {
continue;
}
-
- if (span.getCandidateWord().isPresent()) {
- drawSpan(canvas, row, span,
- isFocused(span.getCandidateWord().get(), focusedIndex, pressedCandidateIndex));
+ // Even if span.getCandidateWord() is absent, draw the span in order to draw the background.
+ drawSpan(canvas, row, span,
+ span.getCandidateWord().isPresent()
+ && isFocused(span.getCandidateWord().get(),
+ focusedIndex, pressedCandidateIndex),
+ carrierEmojiRenderHelper);
+ if (span.getLeft() != 0f) {
+ float separatorX = span.getLeft();
+ canvas.drawLine(separatorX, separatorTop, separatorX, separatorBottom, separatorPaint);
}
}
}
}
- @VisibleForTesting void drawSpan(Canvas canvas, Row row, Span span, boolean isFocused) {
+ @VisibleForTesting void drawSpan(
+ Canvas canvas, Row row, Span span, boolean isFocused,
+ CarrierEmojiRenderHelper carrierEmojiRenderHelper) {
drawSpanBackground(
Preconditions.checkNotNull(canvas), Preconditions.checkNotNull(row), span, isFocused);
if (!span.getCandidateWord().isPresent()) {
@@ -261,15 +278,9 @@
}
if (carrierEmojiRenderHelper.isRenderableEmoji(span.getCandidateWord().get().getValue())) {
- drawCarrierEmoji(canvas, row, span);
- if (descriptionLayoutPolicy == DescriptionLayoutPolicy.OVERLAY) {
- // Hack: This is a quick hack to keep the current behavior (especially on SymbolInputView).
- // TODO(hidehiko): Remove this hack from here, instead, do not attach the description
- // to the candidate.
- return;
- }
+ drawCarrierEmoji(canvas, row, span, carrierEmojiRenderHelper);
} else {
- drawText(canvas, row, span);
+ drawText(canvas, row, span, isFocused);
}
drawDescription(canvas, row, span);
@@ -289,7 +300,8 @@
spanBackgroundDrawable.draw(canvas);
}
- private void drawCarrierEmoji(Canvas canvas, Row row, Span span) {
+ private void drawCarrierEmoji(
+ Canvas canvas, Row row, Span span, CarrierEmojiRenderHelper carrierEmojiRenderHelper) {
Preconditions.checkState(span.getCandidateWord().isPresent());
float descriptionWidth = (descriptionLayoutPolicy == DescriptionLayoutPolicy.EXCLUSIVE)
@@ -300,7 +312,7 @@
carrierEmojiRenderHelper.drawEmoji(canvas, span.getCandidateWord().get(), centerX, centerY);
}
- private void drawText(Canvas canvas, Row row, Span span) {
+ private void drawText(Canvas canvas, Row row, Span span, boolean isFocused) {
Preconditions.checkState(span.getCandidateWord().isPresent());
String valueText = span.getCandidateWord().get().getValue();
@@ -308,25 +320,26 @@
// No value is available.
return;
}
-
- if (!span.getCachedLayout().isPresent()) {
+ // Calculate layout or get cached one.
+ // If isFocused is true, special paint should be applied.
+ // The resulting drawing is so special that it will not re reused.
+ // Therefore if isFocused is true cache is not used and always calculate the layout.
+ // In this case calculated layout is not cached.
+ Layout layout;
+ if (!isFocused && span.getCachedLayout().isPresent()) {
+ layout = span.getCachedLayout().get();
+ } else {
// Set the scaling of the text.
float descriptionWidth = (descriptionLayoutPolicy == DescriptionLayoutPolicy.EXCLUSIVE)
? span.getDescriptionWidth() : 0;
+ // Ensure that StaticLayout instance has positive width.
float displayValueWidth =
- span.getWidth() - valueHorizontalPadding * 2 - descriptionWidth;
+ Math.max(1f, span.getWidth() - valueHorizontalPadding * 2 - descriptionWidth);
float textScale = Math.min(1f, displayValueWidth / span.getValueWidth());
- TextPaint valuePaint = this.valuePaint;
+ TextPaint textPaint = isFocused ? this.focusedValuePaint : this.valuePaint;
if (valueScalingPolicy == ValueScalingPolicy.HORIZONTAL) {
- valuePaint.setTextSize(valueTextSize);
- valuePaint.setTextScaleX(textScale);
- // The scaled rendered text sometimes exceeds the available width for some reasons.
- // In this case, the candidate word is unexpectedly rendered in two lines.
- // To avoid this situation, textScale is gradually reduced to fit the available width.
- for (int i = 0; valuePaint.measureText(valueText) > displayValueWidth && i < 10; ++i) {
- textScale *= 0.97;
- valuePaint.setTextScaleX(textScale);
- }
+ textPaint.setTextSize(valueTextSize);
+ textPaint.setTextScaleX(textScale);
} else {
// Calculate the max limit of the "text size", in which we can render the candidate text
// inside the given span.
@@ -334,19 +347,25 @@
// Adjustment by font size can keep aspect ratio,
// which is important for Emoticon especially.
// Calculate the width with the default text size.
- valuePaint.setTextSize(valueTextSize * textScale);
+ textPaint.setTextSize(valueTextSize * textScale);
}
-
- // Layout the text. In order to avoid unexpected line breaking, we include the horizontal
- // padding (on both sides) into the width for the layout. It should be safe,
- // because the Alignment is ALIGN_CENTER, so that having the padding should have
- // no bad effect.
- span.setCachedLayout(new StaticLayout(
- valueText, new TextPaint(valuePaint),
- (int) FloatMath.ceil(span.getWidth() - descriptionWidth),
- Alignment.ALIGN_CENTER, 1, 0, false));
+ // Layout's width is theoretically `span.getWidth() - descriptionWidth`.
+ // However because of the spec of Paint#setTextScaleX() and Paint#setTextSize(),
+ // Paint#measureText() might return larger width than what both above methods expect it to be.
+ // As a workaround, if theoretical width is smaller than the result of Paint#measureText(),
+ // employ the width returned by Paint#measureText().
+ // This workaround is to avoid from unexpected line-break.
+ // NOTE: Canvas#scale() cannot be used here because we have to use StaticLayout to draw
+ // Emoji and StaticLayout requires width in its constructor.
+ layout = new StaticLayout(
+ valueText, new TextPaint(textPaint),
+ (int) Math.ceil(Math.max(span.getWidth() - descriptionWidth,
+ textPaint.measureText(valueText))),
+ Alignment.ALIGN_CENTER, 1, 0, false);
+ if (!isFocused) {
+ span.setCachedLayout(layout);
+ }
}
- Layout layout = span.getCachedLayout().get();
// Actually render the image to the canvas.
int saveCount = canvas.save();
@@ -360,19 +379,25 @@
private void drawDescription(Canvas canvas, Row row, Span span) {
List<String> descriptionList = span.getSplitDescriptionList();
- if (span.getDescriptionWidth() <= 0 || descriptionList.isEmpty()) {
- // No description available.
+ if (span.getDescriptionWidth() <= 0 || descriptionList.isEmpty()
+ || descriptionLayoutPolicy == DescriptionLayoutPolicy.GONE) {
+ // No description available or the layout policy is GONE.
return;
}
// Set the x-orientation scale based on the description's width to fit the span's region.
TextPaint descriptionPaint = this.descriptionPaint;
descriptionPaint.setTextSize(descriptionTextSize);
+ float centerOrRight;
if (descriptionLayoutPolicy == DescriptionLayoutPolicy.OVERLAY) {
float displayWidth = span.getWidth() - descriptionHorizontalPadding * 2;
descriptionPaint.setTextScaleX(Math.min(1f, displayWidth / span.getDescriptionWidth()));
+ descriptionPaint.setTextAlign(Align.CENTER);
+ centerOrRight = (span.getLeft() + span.getRight()) / 2f;
} else {
descriptionPaint.setTextScaleX(1f);
+ descriptionPaint.setTextAlign(Align.RIGHT);
+ centerOrRight = span.getRight() - descriptionHorizontalPadding;
}
// Render first "N" description lines based on the layout height.
@@ -383,9 +408,8 @@
float top = row.getTop() + row.getHeight()
- descriptionVerticalPadding - descriptionTextSize * (numDescriptionLines - 1);
- float right = span.getRight() - descriptionHorizontalPadding;
for (String description : descriptionList.subList(0, numDescriptionLines)) {
- canvas.drawText(description, right, top, descriptionPaint);
+ canvas.drawText(description, centerOrRight, top, descriptionPaint);
top += descriptionTextSize;
}
}
diff --git a/src/android/src/com/google/android/inputmethod/japanese/ui/ConversionCandidateLayouter.java b/src/android/src/com/google/android/inputmethod/japanese/ui/ConversionCandidateLayouter.java
index 6c527c7..6580820 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/ui/ConversionCandidateLayouter.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/ui/ConversionCandidateLayouter.java
@@ -33,11 +33,10 @@
import org.mozc.android.inputmethod.japanese.protobuf.ProtoCandidates.CandidateWord;
import org.mozc.android.inputmethod.japanese.ui.CandidateLayout.Row;
import org.mozc.android.inputmethod.japanese.ui.CandidateLayout.Span;
+import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Optional;
import com.google.common.base.Preconditions;
-import android.util.FloatMath;
-
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
@@ -84,7 +83,7 @@
Preconditions.checkNotNull(span);
float compressedValueWidth =
compressValueWidth(span.getValueWidth(), compressionRatio, horizontalPadding, minWidth);
- return (int) FloatMath.ceil((compressedValueWidth + span.getDescriptionWidth()) / chunkWidth);
+ return (int) Math.ceil((compressedValueWidth + span.getDescriptionWidth()) / chunkWidth);
}
static float compressValueWidth(
@@ -196,7 +195,7 @@
}
public int getRowHeight() {
- return (int) FloatMath.ceil(valueHeight + valueVerticalPadding * 2);
+ return (int) Math.ceil(valueHeight + valueVerticalPadding * 2);
}
@Override
@@ -252,6 +251,7 @@
*
* The order of the candidates will be kept.
*/
+ @VisibleForTesting
static List<Row> buildRowList(
CandidateList candidateList, SpanFactory spanFactory,
int numChunks, ChunkMetrics chunkMetrics, boolean enableSpan) {
@@ -297,6 +297,7 @@
* The size of the buffer must be equal to or greater than {@code spanList.size()}.
* Its elements needn't be initialized.
*/
+ @VisibleForTesting
static void layoutSpanList(
List<Span> spanList, int pageWidth,
int numChunks, ChunkMetrics chunkMetrics, int[] numAllocatedChunks) {
@@ -317,10 +318,9 @@
}
}
- // Then assign remaining chunks to each span as even as possible by round-robin
- // from tail to head to keep the backward compatibility.
- for (int index = spanList.size() - 1; numRemainingChunks > 0;
- --numRemainingChunks, index = (index + spanList.size() - 1) % spanList.size()) {
+ // Then assign remaining chunks to each span as even as possible by round-robin.
+ for (int index = 0; numRemainingChunks > 0;
+ --numRemainingChunks, index = (index + 1) % spanList.size()) {
++numAllocatedChunks[index];
}
@@ -344,6 +344,7 @@
}
/** Sets top, width and height to the each row. */
+ @VisibleForTesting
static void layoutRowList(List<Row> rowList, int pageWidth, int rowHeight) {
int top = 0;
for (Row row : Preconditions.checkNotNull(rowList)) {
diff --git a/src/android/src/com/google/android/inputmethod/japanese/ui/FloatingCandidateLayoutRenderer.java b/src/android/src/com/google/android/inputmethod/japanese/ui/FloatingCandidateLayoutRenderer.java
new file mode 100644
index 0000000..1376ce2
--- /dev/null
+++ b/src/android/src/com/google/android/inputmethod/japanese/ui/FloatingCandidateLayoutRenderer.java
@@ -0,0 +1,500 @@
+// Copyright 2010-2014, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package org.mozc.android.inputmethod.japanese.ui;
+
+import org.mozc.android.inputmethod.japanese.MozcUtil;
+import org.mozc.android.inputmethod.japanese.ViewEventListener;
+import org.mozc.android.inputmethod.japanese.protobuf.ProtoCandidates.Candidates;
+import org.mozc.android.inputmethod.japanese.protobuf.ProtoCandidates.Candidates.Candidate;
+import org.mozc.android.inputmethod.japanese.protobuf.ProtoCandidates.Category;
+import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Command;
+import org.mozc.android.inputmethod.japanese.resources.R;
+import com.google.common.base.Optional;
+import com.google.common.base.Preconditions;
+
+import android.content.res.Resources;
+import android.graphics.Canvas;
+import android.graphics.Paint;
+import android.graphics.Paint.Align;
+import android.graphics.Paint.FontMetrics;
+import android.graphics.Rect;
+import android.graphics.RectF;
+import android.os.Build;
+import android.view.MotionEvent;
+
+import java.util.Locale;
+
+/**
+ * Layouts floating candidate window and draw it's contents on canvas.
+ *
+ * The point of origin of layout is NOT a left-top corner of candidate list BUT the left-top corner
+ * of the candidate column and the right-top corner of the shortcut column.
+ *
+ * TODO(hsumita): Rewrite using LinearLayout or something.
+ */
+public class FloatingCandidateLayoutRenderer {
+
+ private static class WindowRects {
+
+ public final Rect window;
+ public final Optional<Rect> focus;
+ public final Optional<Rect> pageIndicator;
+ public final Optional<RectF> scrollIndicator;
+
+ WindowRects(Rect window, Optional<Rect> focus, Optional<Rect> pageIndicator,
+ Optional<RectF> scrollIndicator) {
+ this.window = Preconditions.checkNotNull(window);
+ this.focus = Preconditions.checkNotNull(focus);
+ this.pageIndicator = Preconditions.checkNotNull(pageIndicator);
+ this.scrollIndicator = Preconditions.checkNotNull(scrollIndicator);
+ }
+ }
+
+ /** Locale field for {@link Paint#setTextLocale(Locale)}. */
+ private static final Optional<Locale> TEXT_LOCALE = (Build.VERSION.SDK_INT >= 17)
+ ? Optional.of(Locale.JAPAN) : Optional.<Locale>absent();
+
+ private static final String FOOTER_TEXT_FORMAT = "%d / %d";
+
+ private final Paint candidatePaint;
+ private final Paint focusedCandidatePaint;
+ private final Paint descriptionPaint;
+ private final Paint shortcutPaint;
+ private final Paint footerPaint;
+ private final Paint separatorPaint;
+ private final Paint windowBackgroundPaint;
+ private final Paint focuseBackgroundPaint;
+ private final Paint scrollIndicatorPaint;
+
+ private final int windowMinimumWidth;
+ private final int windowHorizontalPadding;
+ private final float windowRoundRectRadius;
+ private final int candidateHeight;
+ private final int candidateOffsetY;
+ private final int candidateDescriptionMinimumPadding;
+ private final int footerHeight;
+ private final float footerTextCenterToBaseLineOffset;
+ private final int horizontalSeparatorPadding;
+ private final int shortcutWidth;
+ private final float shortcutCenterX;
+ private final int scrollIndicatorWidth;
+ private final int scrollIndicatorRadius;
+
+ private Optional<WindowRects> windowRects = Optional.absent();
+ private Optional<ViewEventListener> viewEventListener = Optional.absent();
+ private Optional<Candidates> candidates = Optional.absent();
+ private Optional<Integer> maxWidth = Optional.absent();
+ /** Focused candidate index, or tapped candidate index if exists. */
+ private Optional<Integer> focusedOrTappedCandidateIndexOnPage = Optional.absent();
+ /** TappedInfo for the current touch operation. Set on TOUCH_DOWN, reset on TOUCH_UP. */
+ private Optional<Integer> tappingCandidateIndex = Optional.absent();
+ private int totalCandidatesCount;
+ private int maxCandidateWidth;
+ private int maxDescriptionWidth;
+
+ public FloatingCandidateLayoutRenderer(Resources res) {
+ Preconditions.checkNotNull(res);
+
+ candidatePaint = new Paint();
+ candidatePaint.setColor(res.getColor(R.color.floating_candidate_text));
+ candidatePaint.setTextSize(res.getDimension(R.dimen.floating_candidate_text_size));
+ candidatePaint.setAntiAlias(true);
+ if (TEXT_LOCALE.isPresent()) {
+ candidatePaint.setTextLocale(TEXT_LOCALE.get());
+ }
+
+ focusedCandidatePaint = new Paint(candidatePaint);
+ focusedCandidatePaint.setColor(res.getColor(R.color.floating_candidate_focused_text));
+
+ descriptionPaint = new Paint(candidatePaint);
+ descriptionPaint.setTextSize(
+ res.getDimension(R.dimen.floating_candidate_description_text_size));
+ descriptionPaint.setColor(res.getColor(R.color.floating_candidate_description_text));
+
+ shortcutPaint = new Paint(candidatePaint);
+ shortcutPaint.setTextSize(res.getDimension(R.dimen.floating_candidate_shortcut_text_size));
+ shortcutPaint.setColor(res.getColor(R.color.floating_candidate_shortcut_text));
+
+ scrollIndicatorPaint = new Paint();
+ scrollIndicatorPaint.setColor(res.getColor(R.color.floating_candidate_scroll_indicator));
+
+ footerPaint = new Paint(candidatePaint);
+ footerPaint.setTextSize(res.getDimension(R.dimen.floating_candidate_footer_text_size));
+ footerPaint.setColor(res.getColor(R.color.floating_candidate_footer_text));
+
+ separatorPaint = new Paint();
+ separatorPaint.setStrokeWidth(
+ res.getDimension(R.dimen.floating_candidate_separator_width));
+ separatorPaint.setColor(res.getColor(R.color.floating_candidate_footer_separator));
+
+ windowBackgroundPaint = new Paint();
+ windowBackgroundPaint.setColor(res.getColor(R.color.floating_candidate_window_background));
+ windowBackgroundPaint.setShadowLayer(
+ res.getDimension(R.dimen.floating_candidate_window_shadow_radius),
+ 0, res.getDimension(R.dimen.floating_candidate_window_shadow_offset_y),
+ res.getColor(R.color.floating_candidate_shadow));
+
+ focuseBackgroundPaint = new Paint();
+ focuseBackgroundPaint.setColor(res.getColor(R.color.floating_candidate_focus_background));
+
+ float candidateVerticalPadding =
+ res.getDimension(R.dimen.floating_candidate_candidate_vertical_padding);
+ FontMetrics candidateMetrics = candidatePaint.getFontMetrics();
+ candidateHeight = (int) Math.ceil(
+ candidateMetrics.descent - candidateMetrics.ascent + candidateVerticalPadding * 2);
+ candidateOffsetY = (int) Math.ceil(-candidateMetrics.ascent + candidateVerticalPadding);
+
+ windowMinimumWidth = res.getDimensionPixelSize(R.dimen.floating_candidate_window_minimum_width);
+ windowHorizontalPadding =
+ res.getDimensionPixelOffset(R.dimen.floating_candidate_window_horizontal_padding);
+ windowRoundRectRadius = res.getDimension(R.dimen.floating_candidate_window_round_rect_radius);
+ candidateDescriptionMinimumPadding =
+ res.getDimensionPixelSize(R.dimen.floating_candidate_candidate_description_minimum_padding);
+ horizontalSeparatorPadding =
+ res.getDimensionPixelSize(R.dimen.floating_candidate_separator_horizontal_padding);
+
+ scrollIndicatorWidth =
+ res.getDimensionPixelSize(R.dimen.floating_candidate_scroll_indicator_width);
+ scrollIndicatorRadius =
+ res.getDimensionPixelSize(R.dimen.floating_candidate_scroll_indicator_radius);
+
+ FontMetrics footerMetrics = footerPaint.getFontMetrics();
+ float footerTextHeight = -footerMetrics.ascent + footerMetrics.descent;
+ footerHeight = Math.round(footerTextHeight * 2f);
+ footerTextCenterToBaseLineOffset = (-footerMetrics.ascent - footerMetrics.descent) / 2f;
+
+ float shortcutCharacterWidth = shortcutPaint.measureText("m");
+ float shortcutCandidatePadding =
+ res.getDimensionPixelSize(R.dimen.floating_candidate_shortcut_candidate_padding);
+ shortcutWidth = Math.round(shortcutCharacterWidth + shortcutCandidatePadding);
+ shortcutCenterX = -shortcutCharacterWidth / 2f - shortcutCandidatePadding;
+
+ updateLayout();
+ }
+
+ /** Handle touch event and invoke some actions. */
+ public void onTouchEvent(MotionEvent event) {
+ if (!candidates.isPresent() || !viewEventListener.isPresent()) {
+ return;
+ }
+ ViewEventListener listener = viewEventListener.get();
+
+ Optional<Integer> optionalCandidateIndex = getTappingCandidate(event);
+
+ if (event.getActionMasked() == MotionEvent.ACTION_DOWN) {
+ tappingCandidateIndex = optionalCandidateIndex;
+ updateLayout();
+ return;
+ }
+ if (event.getActionMasked() != MotionEvent.ACTION_UP) {
+ return;
+ }
+
+ if (!optionalCandidateIndex.isPresent() || !tappingCandidateIndex.isPresent()
+ || !optionalCandidateIndex.equals(tappingCandidateIndex)) {
+ tappingCandidateIndex = Optional.absent();
+ updateLayout();
+ return;
+ }
+ int candidateIndex = optionalCandidateIndex.get();
+ tappingCandidateIndex = Optional.absent();
+
+ listener.onConversionCandidateSelected(
+ candidates.get().getCandidate(candidateIndex).getId(),
+ Optional.<Integer>absent());
+ }
+
+ /** Sets the max width of this window. */
+ public void setMaxWidth(int maxWidth) {
+ if (maxWidth > 0) {
+ this.maxWidth = Optional.of(maxWidth);
+ } else {
+ this.maxWidth = Optional.absent();
+ }
+ updateLayout();
+ }
+
+ /** Sets candidates. */
+ public void setCandidates(Command outCommand) {
+ Preconditions.checkNotNull(outCommand);
+ if (outCommand.getOutput().getCandidates().getCandidateCount() == 0) {
+ candidates = Optional.<Candidates>absent();
+ totalCandidatesCount = 0;
+ } else {
+ candidates = Optional.of(outCommand.getOutput().getCandidates());
+ totalCandidatesCount = outCommand.getOutput().getAllCandidateWords().getCandidatesCount();
+ }
+ updateLayout();
+ }
+
+ /** Sets a view event listener to handle touch events. */
+ public void setViewEventListener(ViewEventListener listener) {
+ viewEventListener = Optional.of(listener);
+ }
+
+ /**
+ * Gets the rectangle of this window.
+ * Defensive-copied value is returned so caller-side can modify it.
+ */
+ public Optional<Rect> getWindowRect() {
+ if (windowRects.isPresent()) {
+ return Optional.of(new Rect(windowRects.get().window));
+ } else {
+ return Optional.absent();
+ }
+ }
+
+ /** Draws this candidate window. */
+ public void draw(Canvas canvas) {
+ Preconditions.checkNotNull(canvas);
+ Preconditions.checkState(candidates.isPresent());
+ Preconditions.checkState(windowRects.isPresent());
+
+ Candidates candidatesData = candidates.get();
+ WindowRects rects = windowRects.get();
+
+ canvas.drawRoundRect(
+ new RectF(rects.window), windowRoundRectRadius, windowRoundRectRadius,
+ windowBackgroundPaint);
+
+ if (rects.focus.isPresent()) {
+ canvas.drawRect(rects.focus.get(), focuseBackgroundPaint);
+ }
+
+ // Candidates, descriptions and shortcuts.
+ int focusedIndex = focusedOrTappedCandidateIndexOnPage.or(-1);
+ for (int i = 0; i < candidatesData.getCandidateCount(); ++i) {
+ Candidate candidate = candidatesData.getCandidate(i);
+ int offsetY = getCandidateRowOffsetY(i) + candidateOffsetY;
+ Paint paint = (i == focusedIndex) ? focusedCandidatePaint : candidatePaint;
+ drawTextWithLimit(canvas, candidate.getValue(), paint, 0, offsetY, maxCandidateWidth);
+ if (candidate.getAnnotation().hasDescription()) {
+ drawTextWithAlignAndLimit(
+ canvas, candidate.getAnnotation().getDescription(), descriptionPaint,
+ rects.window.right - windowHorizontalPadding, offsetY,
+ Align.RIGHT, maxDescriptionWidth);
+ }
+ if (candidate.getAnnotation().hasShortcut()) {
+ drawTextWithAlign(
+ canvas, candidate.getAnnotation().getShortcut(), shortcutPaint,
+ shortcutCenterX, offsetY, Align.CENTER);
+ }
+ }
+
+ // Footer. Don't show if suggestion mode.
+ if (rects.pageIndicator.isPresent()) {
+ Rect indicatorRect = rects.pageIndicator.get();
+ drawHorizontalSeparator(
+ canvas, separatorPaint, rects.window.left, rects.window.right, indicatorRect.top);
+ drawPageIndicator(canvas, footerPaint, indicatorRect);
+ }
+
+ // Scroll indicator
+ if (rects.scrollIndicator.isPresent()) {
+ canvas.drawRoundRect(
+ rects.scrollIndicator.get(), scrollIndicatorRadius, scrollIndicatorRadius,
+ scrollIndicatorPaint);
+ }
+ }
+
+ private void drawPageIndicator(Canvas canvas, Paint paint, Rect rect) {
+ drawTextWithAlign(
+ canvas, String.format(FOOTER_TEXT_FORMAT,
+ candidates.get().getFocusedIndex() + 1, totalCandidatesCount),
+ paint, rect.exactCenterX(), rect.exactCenterY() + footerTextCenterToBaseLineOffset,
+ Align.CENTER);
+ }
+
+ private void drawHorizontalSeparator(Canvas canvas, Paint paint, int startX, int endX, int y) {
+ canvas.drawLine(
+ Math.min(startX, endX) + horizontalSeparatorPadding, y,
+ Math.max(startX, endX) - horizontalSeparatorPadding, y, paint);
+ }
+
+ /**
+ * Draws {@code text} into {@code canvas} with the text align and the limitation of text width.
+ * <p>
+ * If measured width of {@code text} is wider than maxWidth, the {@code text} is drawn with
+ * horizontal compression in order to fit {@code maxWidth}.
+ */
+ private void drawTextWithAlignAndLimit(
+ Canvas canvas, String text, Paint paint, float x, float y, Align align, float maxWidth) {
+ float textWidth = paint.measureText(text);
+
+ int saveCount = canvas.save(Canvas.MATRIX_SAVE_FLAG);
+ Align originalAlign = paint.getTextAlign();
+ try {
+ canvas.translate(x, y);
+ if (textWidth > maxWidth) {
+ // Use Canvas#scale() instead of Paint#setTextScaleX() for accurate scaling.
+ canvas.scale(maxWidth / textWidth, 1.0f);
+ }
+ paint.setTextAlign(align);
+ canvas.drawText(text, 0, 0, paint);
+ } finally {
+ canvas.restoreToCount(saveCount);
+ paint.setTextAlign(originalAlign);
+ }
+ }
+
+ /** See {@link #drawTextWithAlignAndLimit}. */
+ private void drawTextWithAlign(
+ Canvas canvas, String text, Paint paint, float x, float y, Align align) {
+ drawTextWithAlignAndLimit(canvas, text, paint, x, y, align, Float.MAX_VALUE);
+ }
+
+ /** See {@link #drawTextWithAlignAndLimit}. */
+ private void drawTextWithLimit(
+ Canvas canvas, String text, Paint paint, float x, float y, float maxWidth) {
+ drawTextWithAlignAndLimit(canvas, text, paint, x, y, paint.getTextAlign(), maxWidth);
+ }
+
+ private Optional<Integer> getTappingCandidate(MotionEvent event) {
+ if (!windowRects.isPresent()) {
+ return Optional.absent();
+ }
+
+ WindowRects rects = windowRects.get();
+ int x = Math.round(event.getX());
+ int y = Math.round(event.getY());
+
+ if (!rects.window.contains(x, y)) {
+ return Optional.absent();
+ }
+
+ int candidateIndex = y / candidateHeight;
+ if (candidateIndex < candidates.get().getCandidateCount()) {
+ return Optional.of(candidateIndex);
+ } else {
+ return Optional.absent();
+ }
+ }
+
+ private void updateLayout() {
+ if (!candidates.isPresent() || !maxWidth.isPresent()) {
+ windowRects = Optional.absent();
+ return;
+ }
+
+ Candidates candidatesData = candidates.get();
+ int candidateNumberOnPage = candidatesData.getCandidateCount();
+ boolean hasShortcut = candidatesData.getCandidateCount() > 0
+ && !candidatesData.getCandidate(0).getAnnotation().getShortcut().isEmpty();
+ int leftEdgePosition = hasShortcut
+ ? -windowHorizontalPadding - shortcutWidth : -windowHorizontalPadding;
+
+ // Candidates and descriptions
+ maxCandidateWidth = 0;
+ maxDescriptionWidth = 0;
+ for (int i = 0; i < candidateNumberOnPage; ++i) {
+ Candidate candidate = candidatesData.getCandidate(i);
+ maxCandidateWidth = Math.max(
+ maxCandidateWidth, Math.round(candidatePaint.measureText(candidate.getValue())));
+ maxDescriptionWidth = Math.max(
+ maxDescriptionWidth,
+ Math.round(descriptionPaint.measureText(candidate.getAnnotation().getDescription())));
+ }
+ int fixedWidth =
+ -leftEdgePosition + candidateDescriptionMinimumPadding + windowHorizontalPadding;
+ int flexibleWidth = maxCandidateWidth + maxDescriptionWidth;
+ if (fixedWidth + flexibleWidth > maxWidth.get()) {
+ int availableWidth = maxWidth.get() - fixedWidth;
+ float shrinkRate = MozcUtil.clamp((float) availableWidth / flexibleWidth, 0f, 1f);
+ maxDescriptionWidth = Math.round(maxDescriptionWidth * shrinkRate);
+ maxCandidateWidth = availableWidth - maxDescriptionWidth;
+ }
+ int rightEdgePosition = Math.max(
+ Math.min(windowMinimumWidth, maxWidth.get()) + leftEdgePosition,
+ maxCandidateWidth + candidateDescriptionMinimumPadding + maxDescriptionWidth
+ + windowHorizontalPadding);
+
+ // Footer
+ int horizontalSeparatorY = candidateHeight * candidateNumberOnPage;
+ int bottomEdgePosition;
+ Optional<Rect> pageIndicatorRect;
+ if (candidatesData.getCategory() != Category.SUGGESTION) {
+ bottomEdgePosition = horizontalSeparatorY + footerHeight;
+ pageIndicatorRect = Optional.of(
+ new Rect(leftEdgePosition, horizontalSeparatorY, rightEdgePosition, bottomEdgePosition));
+ } else {
+ bottomEdgePosition = horizontalSeparatorY;
+ pageIndicatorRect = Optional.absent();
+ }
+
+ // Focus
+ Optional<Rect> focusRect = Optional.absent();
+ focusedOrTappedCandidateIndexOnPage = getTappedOrFocusedIndexOnPage();
+ if (focusedOrTappedCandidateIndexOnPage.isPresent()) {
+ int offsetY = candidateHeight * focusedOrTappedCandidateIndexOnPage.get();
+ focusRect = Optional.of(new Rect(
+ leftEdgePosition, offsetY, rightEdgePosition, offsetY + candidateHeight));
+ } else {
+ focusRect = Optional.absent();
+ }
+
+ // Scroll indicator
+ Optional<RectF> scrollIndicatorRect;
+ if (totalCandidatesCount > candidatesData.getPageSize()) {
+ int currentPageIndex = getCurrentPageNumber() - 1;
+ float scrollIndicatorHeight =
+ (float) bottomEdgePosition * candidatesData.getPageSize() / totalCandidatesCount;
+ float scrollIndicatorOffset = scrollIndicatorHeight * currentPageIndex;
+ scrollIndicatorRect = Optional.of(new RectF(
+ rightEdgePosition - scrollIndicatorWidth, scrollIndicatorOffset, rightEdgePosition,
+ Math.min(bottomEdgePosition, scrollIndicatorOffset + scrollIndicatorHeight)));
+ } else {
+ scrollIndicatorRect = Optional.absent();
+ }
+
+ // Window
+ Rect windowRect = new Rect(leftEdgePosition, 0, rightEdgePosition, bottomEdgePosition);
+
+ windowRects = Optional.of(
+ new WindowRects(windowRect, focusRect, pageIndicatorRect, scrollIndicatorRect));
+ }
+
+ private Optional<Integer> getTappedOrFocusedIndexOnPage() {
+ if (tappingCandidateIndex.isPresent()) {
+ return tappingCandidateIndex;
+ } else if (candidates.isPresent() && candidates.get().hasFocusedIndex()) {
+ return Optional.of(candidates.get().getFocusedIndex() % candidates.get().getPageSize());
+ }
+ return Optional.absent();
+ }
+
+ private int getCandidateRowOffsetY(int index) {
+ return index * candidateHeight;
+ }
+
+ private int getCurrentPageNumber() {
+ return (int) Math.ceil(
+ (float) (candidates.get().getFocusedIndex() + 1) / candidates.get().getPageSize());
+ }
+}
diff --git a/src/android/src/com/google/android/inputmethod/japanese/ui/FloatingModeIndicator.java b/src/android/src/com/google/android/inputmethod/japanese/ui/FloatingModeIndicator.java
new file mode 100644
index 0000000..70037e5
--- /dev/null
+++ b/src/android/src/com/google/android/inputmethod/japanese/ui/FloatingModeIndicator.java
@@ -0,0 +1,247 @@
+// Copyright 2010-2014, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package org.mozc.android.inputmethod.japanese.ui;
+
+import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Command;
+import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.CompositionMode;
+import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Input;
+import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.SessionCommand;
+import org.mozc.android.inputmethod.japanese.resources.R;
+import org.mozc.android.inputmethod.japanese.view.MozcImageView;
+import org.mozc.android.inputmethod.japanese.view.Skin;
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Preconditions;
+
+import android.annotation.TargetApi;
+import android.content.Context;
+import android.content.res.Resources;
+import android.graphics.Rect;
+import android.graphics.drawable.Drawable;
+import android.os.Handler;
+import android.os.Looper;
+import android.os.Message;
+import android.view.View;
+import android.view.animation.AlphaAnimation;
+import android.view.animation.Animation;
+import android.view.animation.Animation.AnimationListener;
+import android.view.animation.AnimationSet;
+import android.view.animation.DecelerateInterpolator;
+import android.view.animation.ScaleAnimation;
+import android.view.inputmethod.CursorAnchorInfo;
+
+/**
+ * Draws mode indicator for floating candidate window.
+ */
+@TargetApi(21)
+public class FloatingModeIndicator {
+
+ /** The message to hide the mode indicator. */
+ @VisibleForTesting static final int HIDE_MODE_INDICATOR = 0;
+
+ private class OutAnimationListener implements AnimationListener {
+ @Override
+ public void onAnimationEnd(Animation animation) {
+ if (!isVisible) {
+ popup.getContentView().setVisibility(View.GONE);
+ }
+ }
+
+ @Override
+ public void onAnimationRepeat(Animation animation) {
+ }
+
+ @Override
+ public void onAnimationStart(Animation animation) {
+ }
+ }
+
+ private class ModeIndicatorMessageCallback implements Handler.Callback {
+ @Override
+ public boolean handleMessage(Message msg) {
+ if (msg.what == HIDE_MODE_INDICATOR) {
+ hide();
+ }
+ return true;
+ }
+ }
+
+ @VisibleForTesting final Handler handler;
+ @VisibleForTesting final PopUpLayouter<MozcImageView> popup;
+ private final View parentView;
+ private final Drawable kanaIndicatorDrawable;
+ private final Drawable abcIndicatorDrawable;
+
+ private final int indicatorSize;
+ private final int verticalMargin;
+ private final Rect drawRect;
+ private final Animation inAnimation;
+ private final Animation outAnimation;
+ private final int displayTime;
+
+ private CursorAnchorInfo cursorAnchorInfo = new CursorAnchorInfo.Builder().build();
+ /** True if the mode indicator is shown and is not hiding. */
+ private boolean isVisible = false;
+ private boolean hasComposition = false;
+
+ public FloatingModeIndicator(View parent) {
+ parentView = Preconditions.checkNotNull(parent);
+ handler = new Handler(Looper.getMainLooper(), new ModeIndicatorMessageCallback());
+
+ Context context = parent.getContext();
+ Resources resources = context.getResources();
+ Skin skin = Skin.getFallbackInstance();
+ kanaIndicatorDrawable =
+ skin.getDrawable(resources, R.raw.floating_mode_indicator__kana_normal);
+ abcIndicatorDrawable =
+ skin.getDrawable(resources, R.raw.floating_mode_indicator__alphabet_normal);
+ indicatorSize =
+ resources.getDimensionPixelSize(R.dimen.floating_mode_indicator_size);
+ verticalMargin =
+ resources.getDimensionPixelSize(R.dimen.floating_mode_indicator_vertical_margin);
+ displayTime = resources.getInteger(R.integer.floating_mode_indicator_display_time);
+
+ MozcImageView contentView = new MozcImageView(context);
+ contentView.setVisibility(View.GONE);
+ contentView.setImageDrawable(kanaIndicatorDrawable);
+ popup = new PopUpLayouter<MozcImageView>(parentView, contentView);
+
+ inAnimation = createInAnimation(resources, indicatorSize / 2f, verticalMargin);
+ outAnimation = createOutAnimation(resources, indicatorSize / 2f, verticalMargin);
+ drawRect = new Rect(0, 0, indicatorSize, indicatorSize);
+ }
+
+ public void setCursorAnchorInfo(CursorAnchorInfo cursorAnchorInfo) {
+ this.cursorAnchorInfo = Preconditions.checkNotNull(cursorAnchorInfo);
+ }
+
+ private void updateDrawRect() {
+ float[] cursorPosition = new float[] {
+ cursorAnchorInfo.getInsertionMarkerHorizontal(),
+ cursorAnchorInfo.getInsertionMarkerBottom()
+ };
+ cursorAnchorInfo.getMatrix().mapPoints(cursorPosition);
+ int location[] = new int[2];
+ parentView.getLocationOnScreen(location);
+ int left = Math.round(cursorPosition[0] - indicatorSize / 2) - location[0];
+ int top = Math.round(cursorPosition[1] + verticalMargin) - location[1];
+ // TODO(hsumita): Put the indicator over the cursor if there is no enough space below.
+ // Note: We always have enough space below thanks to the narrow frame at this time.
+ drawRect.offsetTo(left, top);
+ popup.setBounds(drawRect);
+ }
+
+ /**
+ * Updates the state of the mode indicator according to the {@code command}.
+ * <p>
+ * This method hides the indicator if there is a composition text.
+ */
+ public void setCommand(Command command) {
+ Preconditions.checkNotNull(command);
+ Input input = command.getInput();
+ if (input.getType() == Input.CommandType.SEND_COMMAND
+ && input.getCommand().getType() == SessionCommand.CommandType.SWITCH_INPUT_MODE) {
+ // Simply ignores SWITCH_INPUT_MODE since the command doesn't have a composition text.
+ return;
+ }
+
+ hasComposition = command.getOutput().getPreedit().getSegmentCount() > 0;
+ if (hasComposition) {
+ hide();
+ }
+ }
+
+ /** Shows the mode indicator according to the current composition mode. */
+ public void setCompositionMode(CompositionMode mode) {
+ Preconditions.checkNotNull(mode);
+ MozcImageView contentView = popup.getContentView();
+ contentView.setImageDrawable(mode == CompositionMode.HIRAGANA
+ ? kanaIndicatorDrawable : abcIndicatorDrawable);
+ if (!hasComposition) {
+ show();
+ }
+ }
+
+ /**
+ * Shows the mode indicator with animation.
+ * <p>
+ * This method issues hide command with delay.
+ */
+ private void show() {
+ resetAnimation();
+ updateDrawRect();
+ if (!isVisible) {
+ isVisible = true;
+ View contentView = popup.getContentView();
+ contentView.setVisibility(View.VISIBLE);
+ contentView.startAnimation(inAnimation);
+ }
+ handler.sendMessageDelayed(handler.obtainMessage(HIDE_MODE_INDICATOR), displayTime);
+ }
+
+ /** Hides the mode indicator with animation. */
+ public void hide() {
+ if (!isVisible) {
+ return;
+ }
+ isVisible = false;
+ resetAnimation();
+ popup.getContentView().startAnimation(outAnimation);
+ }
+
+ private Animation createInAnimation(Resources resources, float pivotX, float pivotY) {
+ AnimationSet animationSet = new AnimationSet(true);
+ animationSet.setDuration(resources.getInteger(R.integer.floating_mode_indicator_in_duration));
+ animationSet.setInterpolator(new DecelerateInterpolator());
+ animationSet.addAnimation(new ScaleAnimation(0f, 1f, 0f, 1f, pivotX, pivotY));
+ animationSet.addAnimation(new AlphaAnimation(0f, 1f));
+ return animationSet;
+ }
+
+ private Animation createOutAnimation(Resources resources, float pivotX, float pivotY) {
+ AnimationSet animationSet = new AnimationSet(true);
+ animationSet.setDuration(resources.getInteger(R.integer.floating_mode_indicator_out_duration));
+ animationSet.setInterpolator(new DecelerateInterpolator());
+ animationSet.setAnimationListener(new OutAnimationListener());
+ animationSet.addAnimation(new ScaleAnimation(1f, 0f, 1f, 0f, pivotX, pivotY));
+ animationSet.addAnimation(new AlphaAnimation(1f, 0f));
+ return animationSet;
+ }
+
+ /** Resets all ongoing and scheduled animations. */
+ private void resetAnimation() {
+ popup.getContentView().clearAnimation();
+ handler.removeMessages(HIDE_MODE_INDICATOR);
+ Preconditions.checkState(!handler.hasMessages(HIDE_MODE_INDICATOR));
+ }
+
+ @VisibleForTesting boolean isVisible() {
+ return isVisible;
+ }
+}
diff --git a/src/android/src/com/google/android/inputmethod/japanese/ui/InputFrameFoldButtonView.java b/src/android/src/com/google/android/inputmethod/japanese/ui/InputFrameFoldButtonView.java
new file mode 100644
index 0000000..337892f
--- /dev/null
+++ b/src/android/src/com/google/android/inputmethod/japanese/ui/InputFrameFoldButtonView.java
@@ -0,0 +1,123 @@
+// Copyright 2010-2014, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package org.mozc.android.inputmethod.japanese.ui;
+
+import org.mozc.android.inputmethod.japanese.resources.R;
+import org.mozc.android.inputmethod.japanese.view.DummyDrawable;
+import org.mozc.android.inputmethod.japanese.view.Skin;
+import com.google.common.base.Preconditions;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.drawable.Drawable;
+import android.util.AttributeSet;
+import android.widget.ToggleButton;
+
+/**
+ * View class for the button to expand/fold conversion candidate view.
+ *
+ */
+public class InputFrameFoldButtonView extends ToggleButton {
+
+ private static final int[] STATE_EMPTY = {};
+ private static final int[] STATE_CHECKED = { android.R.attr.state_checked };
+
+ private Drawable arrowDrawable = DummyDrawable.getInstance();
+ private Drawable backgroundDefaultDrawable = DummyDrawable.getInstance();
+ private Drawable backgroundScrolledDrawable = DummyDrawable.getInstance();
+ private boolean showBackgroundForScrolled = false;
+
+ public InputFrameFoldButtonView(Context context) {
+ super(context);
+ }
+
+ public InputFrameFoldButtonView(Context context, AttributeSet attributeSet) {
+ super(context, attributeSet);
+ }
+
+ public InputFrameFoldButtonView(Context context, AttributeSet attributeSet, int defStyle) {
+ super(context, attributeSet, defStyle);
+ }
+
+ @Override
+ protected void onFinishInflate() {
+ super.onFinishInflate();
+ setBackgroundColor(Color.TRANSPARENT);
+ }
+
+ @Override
+ protected void onSizeChanged(int width, int height, int oldWidth, int oldHeight) {
+ super.onSizeChanged(width, height, oldWidth, oldHeight);
+ backgroundDefaultDrawable.setBounds(0, 0, width, height);
+ backgroundScrolledDrawable.setBounds(0, 0, width, height);
+ arrowDrawable.setBounds(0, 0, width, height);
+ }
+
+ @Override
+ protected void drawableStateChanged() {
+ super.drawableStateChanged();
+ arrowDrawable.setState(isChecked() ? STATE_CHECKED : STATE_EMPTY);
+ invalidate();
+ }
+
+ @Override
+ protected void onDraw(Canvas canvas) {
+ Drawable background =
+ showBackgroundForScrolled ? backgroundScrolledDrawable : backgroundDefaultDrawable;
+ background.draw(canvas);
+ arrowDrawable.draw(canvas);
+ }
+
+ public void setSkin(Skin skin) {
+ Preconditions.checkNotNull(skin);
+ Resources resources = getResources();
+ arrowDrawable = skin.getDrawable(resources, R.raw.keyboard__fold__tab)
+ .getConstantState().newDrawable();
+ arrowDrawable.setBounds(0, 0, getWidth(), getHeight());
+ backgroundDefaultDrawable =
+ skin.getDrawable(resources, R.raw.keyboard_fold_tab_background_default)
+ .getConstantState().newDrawable();
+ backgroundDefaultDrawable.setBounds(0, 0, getWidth(), getHeight());
+ backgroundScrolledDrawable =
+ skin.getDrawable(resources, R.raw.keyboard_fold_tab_background_scrolled)
+ .getConstantState().newDrawable();
+ backgroundScrolledDrawable.setBounds(0, 0, getWidth(), getHeight());
+ invalidate();
+ }
+
+ public void showBackgroundForScrolled(boolean showBackgroundForScrolled) {
+ if (this.showBackgroundForScrolled != showBackgroundForScrolled) {
+ this.showBackgroundForScrolled = showBackgroundForScrolled;
+ invalidate();
+ }
+ }
+}
diff --git a/src/android/src/com/google/android/inputmethod/japanese/ui/MenuDialog.java b/src/android/src/com/google/android/inputmethod/japanese/ui/MenuDialog.java
index 43f5f46..7e5d385 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/ui/MenuDialog.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/ui/MenuDialog.java
@@ -76,9 +76,6 @@
/** Invoked when "Launch Preference Activity" item is selected. */
public void onLaunchPreferenceActivitySelected(Context context);
- /** Invoked when "Voice input" item is selected. */
- public void onLaunchVoiceInputActivitySelected(Context context);
-
/** Invoked when "Launch Mushroom" item is selected. */
public void onShowMushroomSelectionDialogSelected(Context context);
}
@@ -130,9 +127,6 @@
case R.string.menu_item_preferences:
listener.get().onLaunchPreferenceActivitySelected(context);
break;
- case R.string.menu_item_voice_input:
- listener.get().onLaunchVoiceInputActivitySelected(context);
- break;
case R.string.menu_item_mushroom:
listener.get().onShowMushroomSelectionDialogSelected(context);
break;
@@ -145,8 +139,7 @@
private final Optional<AlertDialog> dialog;
private final MenuDialogListenerHandler listenerHandler;
- public MenuDialog(
- Context context, Optional<MenuDialogListener> listener, boolean isVoiceInputEnabled) {
+ public MenuDialog(Context context, Optional<MenuDialogListener> listener) {
Preconditions.checkNotNull(context);
Preconditions.checkNotNull(listener);
@@ -154,7 +147,7 @@
String appName = resources.getString(R.string.app_name);
// R.string.menu_item_* resources needs to be formatted.
- List<Integer> menuItemIds = getEnabledMenuIds(context, isVoiceInputEnabled);
+ List<Integer> menuItemIds = getEnabledMenuIds(context);
int menuNum = menuItemIds.size();
String[] menuTextList = new String[menuNum];
int[] indexToIdTable = new int[menuNum];
@@ -202,7 +195,7 @@
}
@VisibleForTesting
- static List<Integer> getEnabledMenuIds(Context context, boolean isVoiceInputEnabled) {
+ static List<Integer> getEnabledMenuIds(Context context) {
// "Mushroom" item is enabled only when Mushroom-aware applications are available.
PackageManager packageManager = Preconditions.checkNotNull(context).getPackageManager();
boolean isMushroomEnabled = !MushroomUtil.getMushroomApplicationList(packageManager).isEmpty();
@@ -210,9 +203,6 @@
List<Integer> menuItemIds = Lists.newArrayListWithCapacity(4);
menuItemIds.add(R.string.menu_item_input_method);
menuItemIds.add(R.string.menu_item_preferences);
- if (isVoiceInputEnabled) {
- menuItemIds.add(R.string.menu_item_voice_input);
- }
if (isMushroomEnabled) {
menuItemIds.add(R.string.menu_item_mushroom);
}
diff --git a/src/android/src/com/google/android/inputmethod/japanese/ui/PopUpLayouter.java b/src/android/src/com/google/android/inputmethod/japanese/ui/PopUpLayouter.java
new file mode 100644
index 0000000..8a6d6d4
--- /dev/null
+++ b/src/android/src/com/google/android/inputmethod/japanese/ui/PopUpLayouter.java
@@ -0,0 +1,120 @@
+// Copyright 2010-2014, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package org.mozc.android.inputmethod.japanese.ui;
+
+import org.mozc.android.inputmethod.japanese.MozcUtil;
+import com.google.common.base.Preconditions;
+
+import android.graphics.Rect;
+import android.view.Gravity;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.ViewGroup.MarginLayoutParams;
+import android.widget.FrameLayout;
+
+/**
+ * A pop-up view layouter.
+ * <p>
+ * This class registers given popup View as a direct child of root View.
+ * This makes the popup be able to appear to anywhere in the screen.
+ * To control the position a Bounds should be specified. It will be converted into a LayoutParams
+ * internally.
+ */
+public class PopUpLayouter<T extends View> {
+
+ private final View parent;
+ private final T contentView;
+
+ private boolean isRegistered = false;
+
+ public PopUpLayouter(View parent, T popUpView) {
+ this.parent = Preconditions.checkNotNull(parent);
+ this.contentView = Preconditions.checkNotNull(popUpView);
+ }
+
+ private void registerToViewHierarchyIfNecessary() {
+ if (isRegistered) {
+ return;
+ }
+
+ View rootView = parent.getRootView();
+ if (rootView != null) {
+ FrameLayout screenContent =
+ FrameLayout.class.cast(rootView.findViewById(android.R.id.content));
+ if (screenContent != null) {
+ screenContent.addView(
+ contentView, new FrameLayout.LayoutParams(0, 0, Gravity.LEFT | Gravity.TOP));
+ isRegistered = true;
+ }
+ }
+ }
+
+ public T getContentView() {
+ return contentView;
+ }
+
+ public void setBounds(Rect rect) {
+ Preconditions.checkNotNull(rect);
+ setBounds(rect.left, rect.top, rect.right, rect.bottom);
+ }
+
+ public void setBounds(int left, int top, int right, int bottom) {
+ registerToViewHierarchyIfNecessary();
+
+ int width = right - left;
+ int height = bottom - top;
+
+ ViewGroup.LayoutParams layoutParams = contentView.getLayoutParams();
+ if (layoutParams != null) {
+ layoutParams.width = width;
+ layoutParams.height = height;
+ if (MarginLayoutParams.class.isInstance(layoutParams)) {
+ int x = left;
+ int y = top;
+
+ int[] location = new int[2];
+ parent.getLocationInWindow(location);
+ x += location[0];
+ y += location[1];
+
+ MarginLayoutParams marginLayoutParams = MarginLayoutParams.class.cast(layoutParams);
+ // Clip XY.
+ View rootView = View.class.cast(contentView.getParent());
+ if (rootView != null) {
+ x = MozcUtil.clamp(x, 0, rootView.getWidth() - width);
+ y = MozcUtil.clamp(y, 0, rootView.getHeight() - height);
+ }
+
+ marginLayoutParams.setMargins(x, y, 0, 0);
+ }
+ contentView.setLayoutParams(layoutParams);
+ }
+ }
+}
diff --git a/src/android/src/com/google/android/inputmethod/japanese/ui/ScrollGuideView.java b/src/android/src/com/google/android/inputmethod/japanese/ui/ScrollGuideView.java
index 5aff03c..a5635a3 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/ui/ScrollGuideView.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/ui/ScrollGuideView.java
@@ -31,7 +31,7 @@
import org.mozc.android.inputmethod.japanese.resources.R;
import org.mozc.android.inputmethod.japanese.view.RectKeyDrawable;
-import org.mozc.android.inputmethod.japanese.view.SkinType;
+import org.mozc.android.inputmethod.japanese.view.Skin;
import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Optional;
import com.google.common.base.Preconditions;
@@ -51,8 +51,8 @@
private final int scrollBarMinimumHeight = getScrollBarMinimumHeight(getResources());
private Optional<SnapScroller> snapScroller = Optional.absent();
- private SkinType skinType = SkinType.BLUE_LIGHTGRAY;
- @VisibleForTesting Drawable scrollBarDrawable = createScrollBarDrawable(skinType);
+ private Skin skin = Skin.getFallbackInstance();
+ @VisibleForTesting Drawable scrollBarDrawable = createScrollBarDrawable(skin);
public ScrollGuideView(Context context) {
super(context);
@@ -66,13 +66,12 @@
super(context, attributeSet, defStyle);
}
- private static Drawable createScrollBarDrawable(SkinType skinType) {
+ private static Drawable createScrollBarDrawable(Skin skin) {
// TODO(hidehiko): Probably we should rename the RectKeyDrawable,
// because this usage is not the key but actually we can reuse the code as is.
- Preconditions.checkNotNull(skinType);
return new RectKeyDrawable(1, 0, 1, 1,
- skinType.candidateScrollBarTopColor,
- skinType.candidateScrollBarBottomColor,
+ skin.candidateScrollBarTopColor,
+ skin.candidateScrollBarBottomColor,
0, 0, 0, 0);
}
@@ -82,12 +81,15 @@
}
/** Sets the skin type, and regenerates an indicator drawable if necessary. */
- public void setSkinType(SkinType skinType) {
- if (this.skinType == Preconditions.checkNotNull(skinType)) {
+ @SuppressWarnings("deprecation")
+ public void setSkin(Skin skin) {
+ Preconditions.checkNotNull(skin);
+ if (this.skin.equals(skin)) {
return;
}
- this.skinType = skinType;
- scrollBarDrawable = createScrollBarDrawable(skinType);
+ this.skin = skin;
+ scrollBarDrawable = createScrollBarDrawable(skin);
+ setBackgroundDrawable(skin.scrollBarBackgroundDrawable.getConstantState().newDrawable());
invalidate();
}
diff --git a/src/android/src/com/google/android/inputmethod/japanese/ui/SideFrameStubProxy.java b/src/android/src/com/google/android/inputmethod/japanese/ui/SideFrameStubProxy.java
index da02260..2267595 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/ui/SideFrameStubProxy.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/ui/SideFrameStubProxy.java
@@ -29,22 +29,16 @@
package org.mozc.android.inputmethod.japanese.ui;
-import org.mozc.android.inputmethod.japanese.resources.R;
-import org.mozc.android.inputmethod.japanese.view.MozcDrawableFactory;
+import org.mozc.android.inputmethod.japanese.view.Skin;
import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Optional;
import com.google.common.base.Preconditions;
import android.content.res.Resources;
-import android.graphics.drawable.Drawable;
-import android.graphics.drawable.GradientDrawable;
-import android.graphics.drawable.GradientDrawable.Orientation;
import android.view.View;
import android.view.View.OnClickListener;
-import android.view.ViewGroup;
import android.view.ViewStub;
import android.view.ViewStub.OnInflateListener;
-import android.view.animation.Animation;
import android.widget.FrameLayout;
import android.widget.ImageView;
@@ -64,35 +58,22 @@
private int inputFrameHeight = 0;
private Optional<OnClickListener> buttonOnClickListener = Optional.absent();
- private Optional<View> dropshadowShort = Optional.absent();
- private Optional<View> dropshadowLong = Optional.absent();
- private int dropShadowShortVisibility = View.GONE;
- private int dropShadowShortLayoutHeight = 0;
- private int dropShadowLongLayoutHeight = 0;
+ private int adjustButtonResourceId;
+ private Skin skin = Skin.getFallbackInstance();
- private static void setLayoutHeight(View view, int height) {
- ViewGroup.LayoutParams layoutParams = view.getLayoutParams();
- layoutParams.height = height;
- view.setLayoutParams(layoutParams);
+ private Resources resources;
+
+ private void updateAdjustButtonImage() {
+ Preconditions.checkState(adjustButton.isPresent());
+ adjustButton.get().setImageDrawable(skin.getDrawable(resources, adjustButtonResourceId));
}
- private static Drawable createDropShadowGradientDrawable(
- int startColor, int endColor, float radius, float centerX, float centerY) {
- GradientDrawable gradientDrawable =
- new GradientDrawable(Orientation.TL_BR, new int[]{startColor, endColor});
- gradientDrawable.setGradientType(GradientDrawable.RADIAL_GRADIENT);
- gradientDrawable.setGradientRadius(radius);
- gradientDrawable.setGradientCenter(centerX, centerY);
- return gradientDrawable;
- }
-
- public void initialize(View view, int stubId, final int dropShadowShortTopId,
- final int dropShadowLongTopId, final int adjustButtonId,
- final int adjustButtonResouceId, final float dropShadowGradientCenterX,
- final int dropshadowShortId,
- final int dropshadowLongId) {
+ public void initialize(View view, int stubId, final int adjustButtonId,
+ int adjustButtonResourceId) {
+ this.resources = Preconditions.checkNotNull(view).getResources();
ViewStub viewStub = ViewStub.class.cast(view.findViewById(stubId));
currentView = Optional.<View>of(viewStub);
+ this.adjustButtonResourceId = adjustButtonResourceId;
viewStub.setOnInflateListener(new OnInflateListener() {
@@ -103,32 +84,22 @@
currentView = Optional.of(view);
currentView.get().setVisibility(View.VISIBLE);
- dropshadowShort = Optional.of(view.findViewById(dropshadowShortId));
- dropshadowLong = Optional.of(view.findViewById(dropshadowLongId));
adjustButton = Optional.of(ImageView.class.cast(view.findViewById(adjustButtonId)));
adjustButton.get().setOnClickListener(buttonOnClickListener.orNull());
- Resources resources = view.getResources();
- MozcDrawableFactory drawableFactory = new MozcDrawableFactory(resources);
- adjustButton.get().setImageDrawable(
- drawableFactory.getDrawable(adjustButtonResouceId).orNull());
-
- // Create dropshadow corner drawable.
- // Because resource xml cannot set gradientRadius in dip style, code it.
- int startColor = resources.getColor(R.color.dropshadow_start);
- int endColor = resources.getColor(R.color.dropshadow_end);
- float radius = resources.getDimensionPixelSize(R.dimen.translucent_border_height);
- Drawable gradientTop = createDropShadowGradientDrawable(startColor, endColor, radius,
- dropShadowGradientCenterX, 1.0f);
- view.findViewById(dropShadowShortTopId).setBackgroundDrawable(gradientTop);
- view.findViewById(dropShadowLongTopId).setBackgroundDrawable(gradientTop);
-
+ adjustButton.get().setLayerType(View.LAYER_TYPE_SOFTWARE, null);
+ updateAdjustButtonImage();
resetAdjustButtonBottomMarginInternal(inputFrameHeight);
- flipDropShadowVisibilityInternal(dropShadowShortVisibility);
- setDropShadowHeightInternal(dropShadowShortLayoutHeight, dropShadowLongLayoutHeight);
}
});
}
+ public void setSkin(Skin skin) {
+ this.skin = Preconditions.checkNotNull(skin);
+ if (adjustButton.isPresent()) {
+ updateAdjustButtonImage();
+ }
+ }
+
public void setButtonOnClickListener(OnClickListener onClickListener) {
buttonOnClickListener = Optional.of(Preconditions.checkNotNull(onClickListener));
}
@@ -141,7 +112,7 @@
private void resetAdjustButtonBottomMarginInternal(int inputFrameHeight) {
if (adjustButton.isPresent()) {
- ImageView imageView = ImageView.class.cast(adjustButton.get());
+ ImageView imageView = adjustButton.get();
FrameLayout.LayoutParams layoutParams = FrameLayout.LayoutParams.class.cast(
imageView.getLayoutParams());
layoutParams.bottomMargin = (inputFrameHeight - layoutParams.height) / 2;
@@ -155,43 +126,4 @@
}
this.inputFrameHeight = inputFrameHeight;
}
-
- private void flipDropShadowVisibilityInternal(int shortVisibility) {
- if (dropshadowShort.isPresent() && dropshadowLong.isPresent()) {
- dropshadowShort.get().setVisibility(shortVisibility);
- dropshadowLong.get().setVisibility(
- shortVisibility == View.VISIBLE ? View.INVISIBLE : View.VISIBLE);
- }
- }
-
- public void flipDropShadowVisibility(int shortVisibility) {
- if (inflated) {
- flipDropShadowVisibilityInternal(shortVisibility);
- return;
- }
- dropShadowShortVisibility = shortVisibility;
- }
-
- private void setDropShadowHeightInternal(int shortHeight, int longHeight) {
- if (dropshadowShort.isPresent() && dropshadowLong.isPresent()) {
- setLayoutHeight(dropshadowShort.get(), shortHeight);
- setLayoutHeight(dropshadowLong.get(), longHeight);
- }
- }
-
- public void setDropShadowHeight(int shortHeight, int longHeight) {
- if (inflated) {
- setDropShadowHeightInternal(shortHeight, longHeight);
- return;
- }
- dropShadowShortLayoutHeight = shortHeight;
- dropShadowLongLayoutHeight = longHeight;
- }
-
- public void startDropShadowAnimation(Animation shortAnimation, Animation longAnimation) {
- if (inflated && dropshadowShort.isPresent() && dropshadowLong.isPresent()) {
- dropshadowShort.get().startAnimation(Preconditions.checkNotNull(shortAnimation));
- dropshadowLong.get().startAnimation(Preconditions.checkNotNull(longAnimation));
- }
- }
}
diff --git a/src/android/src/com/google/android/inputmethod/japanese/ui/SpanFactory.java b/src/android/src/com/google/android/inputmethod/japanese/ui/SpanFactory.java
index 0d7c33e..aab8e22 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/ui/SpanFactory.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/ui/SpanFactory.java
@@ -31,16 +31,14 @@
import org.mozc.android.inputmethod.japanese.protobuf.ProtoCandidates.CandidateWord;
import org.mozc.android.inputmethod.japanese.ui.CandidateLayout.Span;
+import org.mozc.android.inputmethod.japanese.util.CandidateDescriptionUtil;
import com.google.common.base.Optional;
import com.google.common.base.Preconditions;
import com.google.common.base.Strings;
import android.graphics.Paint;
-import java.util.ArrayList;
-import java.util.Collections;
import java.util.List;
-import java.util.StringTokenizer;
/**
* Factory to create Span instances based on given CandidateWord instances.
@@ -65,7 +63,7 @@
}
public void setDescriptionDelimiter(String descriptionDelimiter) {
- this.descriptionDelimiter = Optional.of(Preconditions.checkNotNull(descriptionDelimiter));
+ this.descriptionDelimiter = Optional.of(descriptionDelimiter);
}
public Span newInstance(CandidateWord candidateWord) {
@@ -73,8 +71,8 @@
float valueWidth = valuePaint.measureText(candidateWord.getValue());
String description = candidateWord.getAnnotation().getDescription();
- List<String> splitDescriptionList = splitDescription(Strings.nullToEmpty(description),
- descriptionDelimiter);
+ List<String> splitDescriptionList = CandidateDescriptionUtil.extractDescriptions(
+ Strings.nullToEmpty(description), descriptionDelimiter);
float descriptionWidth = 0;
for (String line : splitDescriptionList) {
float width = descriptionPaint.measureText(line);
@@ -85,39 +83,4 @@
return new Span(Optional.of(candidateWord), valueWidth, descriptionWidth,
splitDescriptionList);
}
-
- private static List<String> splitDescription(
- String description, Optional<String> descriptionDelimiter) {
- if (description.length() == 0) {
- // No description is available.
- return Collections.emptyList();
- }
-
- if (!descriptionDelimiter.isPresent()) {
- // If the delimiter is not set, return the description as is.
- return Collections.singletonList(description);
- }
-
- // Split the description by delimiter.
- StringTokenizer tokenizer = new StringTokenizer(description, descriptionDelimiter.get());
- List<String> result = new ArrayList<String>();
- while (tokenizer.hasMoreTokens()) {
- String token = tokenizer.nextToken();
- if (isEligibleDescriptionFragment(token)) {
- result.add(token);
- }
- }
-
- return result;
- }
-
- private static boolean isEligibleDescriptionFragment(String descriptionFragment) {
- // We'd like to always remove "ひらがな" because the description fragment frequently
- // and largely increases the width of a candidate span.
- // Increased width reduces the number of the candidates which are shown in a screen.
- // This behavior is especially harmful for zero-query suggestion
- // because zero-query suggestion mainly shows Hiragana candidates.
- // TODO(matsuzakit): Such filtering/oprimization should be done in the server side.
- return !"ひらがな".equals(descriptionFragment);
- }
}
diff --git a/src/android/src/com/google/android/inputmethod/japanese/userdictionary/UserDictionaryActionBarHelperFactory.java b/src/android/src/com/google/android/inputmethod/japanese/userdictionary/UserDictionaryActionBarHelperFactory.java
deleted file mode 100644
index f889f89..0000000
--- a/src/android/src/com/google/android/inputmethod/japanese/userdictionary/UserDictionaryActionBarHelperFactory.java
+++ /dev/null
@@ -1,188 +0,0 @@
-// Copyright 2010-2014, Google Inc.
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-package org.mozc.android.inputmethod.japanese.userdictionary;
-
-import org.mozc.android.inputmethod.japanese.resources.R;
-
-import android.app.Activity;
-import android.content.res.Configuration;
-import android.os.Build;
-import android.os.Bundle;
-import android.util.DisplayMetrics;
-import android.view.Menu;
-import android.view.View;
-import android.view.View.OnClickListener;
-import android.view.Window;
-
-/**
- * Utility to support Action Bar like UI for all the devices.
- *
- * Android 3.0 (or later) supports a new UI named "Action Bar", and it is recommended to be used.
- * However, Google Japanese Input supports also Android 2.3 or earlier.
- * To provide quite similar user experiences for all the platforms, we implement "mimic" of
- * Action Bar for such earlier devices.
- * On the other hand, on later devices, we use Action Bar itself (supported by Android OS).
- *
- * This class provides utilities to fill the gaps between earlier and later devices.
- *
- */
-class UserDictionaryActionBarHelperFactory {
-
- /**
- * Hook-methods of Activity to support ActionBar like UI for earlier devices.
- */
- interface ActionBarHelper {
- void onCreate(Bundle savedInstance);
- public void onPostCreate(
- Bundle savedInstance,
- OnClickListener addEntryClickListener,
- OnClickListener deleteEntryClickListener,
- OnClickListener undoClickListener);
- void onConfigurationChanged(Configuration configuration);
- void onCreateOptionsMenu(Menu menu);
- }
-
- /**
- * Implementation of ActionBar like ui for earlier devices.
- */
- private static class MozcActionBarHelper implements ActionBarHelper {
- private final Activity activity;
-
- MozcActionBarHelper(Activity activity) {
- this.activity = activity;
- }
-
- @Override
- public void onCreate(Bundle savedInstance) {
- // We'll use "custom title" for the ActionBar like UI.
- activity.getWindow().requestFeature(Window.FEATURE_CUSTOM_TITLE);
- }
-
- @Override
- public void onPostCreate(Bundle savedInstance,
- OnClickListener addEntryClickListener,
- OnClickListener deleteEntryClickListener,
- OnClickListener undoClickListener) {
- activity.getWindow().setFeatureInt(
- Window.FEATURE_CUSTOM_TITLE,
- R.layout.user_dictionary_tool_action_bar_view);
-
- activity.findViewById(R.id.user_dictionary_tool_action_bar_add_entry)
- .setOnClickListener(addEntryClickListener);
- activity.findViewById(R.id.user_dictionary_tool_split_action_bar_add_entry)
- .setOnClickListener(addEntryClickListener);
- activity.findViewById(R.id.user_dictionary_tool_action_bar_delete_entry)
- .setOnClickListener(deleteEntryClickListener);
- activity.findViewById(R.id.user_dictionary_tool_split_action_bar_delete_entry)
- .setOnClickListener(deleteEntryClickListener);
-
- // Need to select either icons (on top action bar, or bottom split action bar)
- // should be shown.
- updateActionBar();
- }
-
- @Override
- public void onConfigurationChanged(Configuration configuration) {
- updateActionBar();
- }
-
- @Override
- public void onCreateOptionsMenu(Menu menu) {
- // These items should be put on the self implemented action bar.
- menu.findItem(R.id.user_dictionary_tool_menu_add_entry).setVisible(false);
- menu.findItem(R.id.user_dictionary_tool_menu_delete_entry).setVisible(false);
- }
-
- private void updateActionBar() {
- DisplayMetrics metrics = activity.getResources().getDisplayMetrics();
- if (metrics.widthPixels < 480 * metrics.scaledDensity) {
- // Show split action bar. Instead, hide icons on the main action bar.
- activity.findViewById(R.id.user_dictionary_tool_action_bar_add_entry)
- .setVisibility(View.GONE);
- activity.findViewById(R.id.user_dictionary_tool_action_bar_delete_entry)
- .setVisibility(View.GONE);
- activity.findViewById(R.id.user_dictionary_tool_split_action_bar)
- .setVisibility(View.VISIBLE);
- } else {
- // Hide split action bar. Instead, show icons on the main action bar.
- activity.findViewById(R.id.user_dictionary_tool_action_bar_add_entry)
- .setVisibility(View.VISIBLE);
- activity.findViewById(R.id.user_dictionary_tool_action_bar_delete_entry)
- .setVisibility(View.VISIBLE);
- activity.findViewById(R.id.user_dictionary_tool_split_action_bar)
- .setVisibility(View.GONE);
- }
- }
- }
-
- /**
- * Implement to use system Action Bar (which is supported Android 3.0 or later).
- */
- private static class SystemActionBarHelper implements ActionBarHelper {
- private final Activity activity;
-
- SystemActionBarHelper(Activity activity) {
- this.activity = activity;
- }
-
- @Override
- public void onCreate(Bundle savedInstance) {
- activity.getWindow().requestFeature(Window.FEATURE_ACTION_BAR);
- }
-
- @Override
- public void onPostCreate(Bundle savedInstance,
- OnClickListener addEntryClickListener,
- OnClickListener deleteEntryClickListener,
- OnClickListener undoClickListener) {
- // Disable self implemented action bars.
- activity.findViewById(R.id.user_dictionary_tool_split_action_bar).setVisibility(View.GONE);
- }
-
- @Override
- public void onConfigurationChanged(Configuration configuration) {
- // Do nothing.
- }
-
- @Override
- public void onCreateOptionsMenu(Menu menu) {
- // Do nothing.
- }
- }
-
- private UserDictionaryActionBarHelperFactory() {
- }
-
- static ActionBarHelper newInstance(Activity activity) {
- return (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
- ? new SystemActionBarHelper(activity)
- : new MozcActionBarHelper(activity);
- }
-}
diff --git a/src/android/src/com/google/android/inputmethod/japanese/userdictionary/UserDictionaryToolActivity.java b/src/android/src/com/google/android/inputmethod/japanese/userdictionary/UserDictionaryToolActivity.java
index 2bfc8b3..618b401 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/userdictionary/UserDictionaryToolActivity.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/userdictionary/UserDictionaryToolActivity.java
@@ -37,7 +37,6 @@
import org.mozc.android.inputmethod.japanese.resources.R;
import org.mozc.android.inputmethod.japanese.session.SessionExecutor;
import org.mozc.android.inputmethod.japanese.session.SessionHandlerFactory;
-import org.mozc.android.inputmethod.japanese.userdictionary.UserDictionaryActionBarHelperFactory.ActionBarHelper;
import org.mozc.android.inputmethod.japanese.userdictionary.UserDictionaryUtil.DictionaryNameDialog;
import org.mozc.android.inputmethod.japanese.userdictionary.UserDictionaryUtil.DictionaryNameDialogListener;
import org.mozc.android.inputmethod.japanese.userdictionary.UserDictionaryUtil.WordRegisterDialog;
@@ -49,10 +48,8 @@
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
-import android.content.DialogInterface.OnDismissListener;
import android.content.Intent;
import android.content.pm.PackageManager;
-import android.content.res.Configuration;
import android.net.Uri;
import android.os.Bundle;
import android.util.SparseBooleanArray;
@@ -77,9 +74,7 @@
import java.io.IOException;
import java.util.ArrayList;
import java.util.Enumeration;
-import java.util.HashSet;
import java.util.List;
-import java.util.Set;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
@@ -158,21 +153,11 @@
private static final int IMPORT_DICTIONARY_SELECTION_DIALOG_ID = 5;
private UserDictionaryToolModel model;
- private final ActionBarHelper actionBarHelper =
- UserDictionaryActionBarHelperFactory.newInstance(this);
private ToastManager toastManager;
- private final Set<Dialog> visibleDialogSet = new HashSet<Dialog>();
- private final OnDismissListener dialogDismissListener = new OnDismissListener() {
- @Override
- public void onDismiss(DialogInterface dialog) {
- visibleDialogSet.remove(dialog);
- }
- };
@Override
protected void onCreate(Bundle savedInstance) {
super.onCreate(savedInstance);
- actionBarHelper.onCreate(savedInstance);
toastManager = new ToastManager(this);
// Initialize model.
@@ -222,31 +207,6 @@
}
@Override
- protected void onPostCreate(Bundle savedInstance) {
- super.onPostCreate(savedInstance);
- actionBarHelper.onPostCreate(
- savedInstance,
- new OnClickListener() {
- @Override
- public void onClick(View v) {
- maybeShowAddEntryDialog();
- }
- },
- new OnClickListener() {
- @Override
- public void onClick(View v) {
- maybeDeleteEntry();
- }
- },
- new OnClickListener() {
- @Override
- public void onClick(View v) {
- runUndo();
- }
- });
- }
-
- @Override
protected void onDestroy() {
// To release pending resources.
model.resetImportState();
@@ -263,7 +223,6 @@
toastManager.maybeShowMessageShortly(model.resumeSession(defaultDictionaryName));
updateDictionaryNameSpinner();
updateEntryList();
- updateDialogWindowSize();
}
@Override
@@ -375,19 +334,11 @@
super.onPause();
}
- @Override
- public void onConfigurationChanged(Configuration configuration) {
- super.onConfigurationChanged(configuration);
- actionBarHelper.onConfigurationChanged(configuration);
- updateDialogWindowSize();
- }
-
// Menu implementation.
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.user_dictionary_tool_menu, menu);
- actionBarHelper.onCreateOptionsMenu(menu);
return true;
}
@@ -558,8 +509,7 @@
}
return status;
}
- },
- dialogDismissListener, toastManager);
+ }, toastManager);
case EDIT_ENTRY_DIALOG_ID:
return UserDictionaryUtil.createWordRegisterDialog(
@@ -574,8 +524,7 @@
}
return status;
}
- },
- dialogDismissListener, toastManager);
+ }, toastManager);
case CREATE_DICTIONARY_DIALOG_ID:
return UserDictionaryUtil.createDictionaryNameDialog(
@@ -591,8 +540,7 @@
}
return status;
}
- },
- dialogDismissListener, toastManager);
+ }, toastManager);
case RENAME_DICTIONARY_DIALOG_ID:
return UserDictionaryUtil.createDictionaryNameDialog(
@@ -607,8 +555,7 @@
}
return status;
}
- },
- dialogDismissListener, toastManager);
+ }, toastManager);
case ZIP_FILE_SELECTION_DIALOG_ID:
return UserDictionaryUtil.createZipFileSelectionDialog(
@@ -648,8 +595,7 @@
public void onCancel(DialogInterface dialog) {
model.resetImportState();
}
- },
- dialogDismissListener);
+ });
case IMPORT_DICTIONARY_SELECTION_DIALOG_ID:
return UserDictionaryUtil.createImportDictionarySelectionDialog(
@@ -684,8 +630,7 @@
public void onCancel(DialogInterface dialog) {
model.resetImportState();
}
- },
- dialogDismissListener);
+ });
}
MozcLog.e("Unknown Dialog ID: " + id);
@@ -696,11 +641,6 @@
@Override
protected void onPrepareDialog(int id, Dialog dialog) {
super.onPrepareDialog(id, dialog);
-
- // Set dialog window size based on the display size.
- UserDictionaryUtil.setDialogWindowSize(dialog);
- visibleDialogSet.add(dialog);
-
switch (id) {
case ADD_ENTRY_DIALOG_ID:
WordRegisterDialog.class.cast(dialog).setEntry(Entry.newBuilder()
@@ -784,12 +724,6 @@
ArrayAdapter.class.cast(entryList.getAdapter()).notifyDataSetChanged();
}
- private void updateDialogWindowSize() {
- for (Dialog dialog : visibleDialogSet) {
- UserDictionaryUtil.setDialogWindowSize(dialog);
- }
- }
-
private Spinner getDictionaryNameSpinner() {
return Spinner.class.cast(findViewById(R.id.user_dictionary_tool_dictionary_name_spinner));
}
diff --git a/src/android/src/com/google/android/inputmethod/japanese/userdictionary/UserDictionaryUtil.java b/src/android/src/com/google/android/inputmethod/japanese/userdictionary/UserDictionaryUtil.java
index 1056c92..422b610 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/userdictionary/UserDictionaryUtil.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/userdictionary/UserDictionaryUtil.java
@@ -40,24 +40,18 @@
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
-import android.content.DialogInterface.OnDismissListener;
import android.content.Intent;
import android.content.res.Resources;
import android.net.Uri;
import android.os.Bundle;
import android.os.Message;
import android.util.AttributeSet;
-import android.util.DisplayMetrics;
import android.view.LayoutInflater;
import android.view.View;
-import android.view.ViewGroup;
import android.view.WindowManager;
-import android.view.WindowManager.LayoutParams;
import android.view.inputmethod.InputMethodManager;
import android.widget.ArrayAdapter;
import android.widget.EditText;
-import android.widget.FrameLayout;
-import android.widget.ScrollView;
import android.widget.Spinner;
import android.widget.TextView;
@@ -111,7 +105,6 @@
UserDictionaryBaseDialog(Context context, int titleResourceId, int viewResourceId,
UserDictionaryBaseDialogListener listener,
- OnDismissListener dismissListener,
ToastManager toastManager) {
super(context);
this.listener = listener;
@@ -130,28 +123,12 @@
setButton(DialogInterface.BUTTON_NEGATIVE, context.getText(android.R.string.cancel),
DialogInterface.OnClickListener.class.cast(null));
setCancelable(true);
- setOnDismissListener(dismissListener);
}
@Override
protected void onCreate(Bundle savedInstance) {
super.onCreate(savedInstance);
- ViewGroup contentGroup = ViewGroup.class.cast(findViewById(android.R.id.content));
- if (contentGroup != null && contentGroup.getChildCount() > 0) {
- // Wrap the content view by ScrollView so that we can scroll the dialog window
- // in order to avoid shrinking the main edit text fields.
- ScrollView view = ScrollView.class.cast(
- LayoutInflater.from(getContext()).inflate(
- R.layout.user_dictionary_tool_empty_scrollview, null));
- View contentView = contentGroup.getChildAt(0);
- contentGroup.removeViewAt(0);
- FrameLayout.class.cast(
- view.findViewById(R.id.user_dictionary_tool_empty_scroll_view_content))
- .addView(contentView);
- contentGroup.addView(view, 0);
- }
-
// To override the default behavior that the dialog is dismissed after user's clicking
// a button regardless of any action inside listener, we set the callback directly
// to the button and manage dismissing behavior.
@@ -262,7 +239,6 @@
static class WordRegisterDialog extends UserDictionaryBaseDialog {
WordRegisterDialog(Context context, int titleResourceId,
final WordRegisterDialogListener listener,
- OnDismissListener dismissListener,
ToastManager toastManager) {
super(context, titleResourceId, R.layout.user_dictionary_tool_word_register_dialog_view,
new UserDictionaryBaseDialogListener() {
@@ -273,8 +249,7 @@
getText(view, R.id.user_dictionary_tool_word_register_dialog_reading),
getPos(view, R.id.user_dictionary_tool_word_register_dialog_pos));
}
- },
- dismissListener, toastManager);
+ }, toastManager);
// TODO(hidehiko): Attach a callback for un-focused event on "word" EditText.
// and invoke reverse conversion (if necessary) to fill reading automatically.
}
@@ -320,7 +295,6 @@
static class DictionaryNameDialog extends UserDictionaryBaseDialog {
DictionaryNameDialog(Context context, int titleResourceId,
final DictionaryNameDialogListener listener,
- OnDismissListener dismissListener,
ToastManager toastManager) {
super(context, titleResourceId, R.layout.user_dictionary_tool_dictionary_name_dialog_view,
new UserDictionaryBaseDialogListener() {
@@ -329,8 +303,7 @@
return listener.onPositiveButtonClicked(
getText(view, R.id.user_dictionary_tool_dictionary_name_dialog_name));
}
- },
- dismissListener, toastManager);
+ }, toastManager);
}
/**
@@ -345,8 +318,6 @@
}
}
- private static final int DIALOG_WIDTH_THRESHOLD = 480; // in dip.
-
/** A map from PosType to the string resource id for i18n. */
private static final Map<PosType, Integer> POS_RESOURCE_MAP;
static {
@@ -518,9 +489,8 @@
*/
static WordRegisterDialog createWordRegisterDialog(
Context context, int titleResourceId, WordRegisterDialogListener listener,
- OnDismissListener dismissListener, ToastManager toastManager) {
- return new WordRegisterDialog(
- context, titleResourceId, listener, dismissListener, toastManager);
+ ToastManager toastManager) {
+ return new WordRegisterDialog(context, titleResourceId, listener, toastManager);
}
/**
@@ -528,9 +498,8 @@
*/
static DictionaryNameDialog createDictionaryNameDialog(
Context context, int titleResourceId, DictionaryNameDialogListener listener,
- OnDismissListener dismissListener, ToastManager toastManager) {
- return new DictionaryNameDialog(
- context, titleResourceId, listener, dismissListener, toastManager);
+ ToastManager toastManager) {
+ return new DictionaryNameDialog(context, titleResourceId, listener, toastManager);
}
/**
@@ -540,11 +509,10 @@
Context context, int titleResourceId,
DialogInterface.OnClickListener positiveButtonListener,
DialogInterface.OnClickListener negativeButtonListener,
- DialogInterface.OnCancelListener cancelListener,
- OnDismissListener dismissListener) {
+ DialogInterface.OnCancelListener cancelListener) {
return createSimpleSpinnerDialog(
context, titleResourceId, positiveButtonListener, negativeButtonListener,
- cancelListener, dismissListener);
+ cancelListener);
}
/**
@@ -554,30 +522,26 @@
Context context, int titleResourceId,
DialogInterface.OnClickListener positiveButtonListener,
DialogInterface.OnClickListener negativeButtonListener,
- DialogInterface.OnCancelListener cancelListener,
- OnDismissListener dismissListener) {
+ DialogInterface.OnCancelListener cancelListener) {
return createSimpleSpinnerDialog(
- context, titleResourceId, positiveButtonListener, negativeButtonListener,
- cancelListener, dismissListener);
+ context, titleResourceId, positiveButtonListener, negativeButtonListener, cancelListener);
}
private static Dialog createSimpleSpinnerDialog(
Context context, int titleResourceId,
DialogInterface.OnClickListener positiveButtonListener,
DialogInterface.OnClickListener negativeButtonListener,
- DialogInterface.OnCancelListener cancelListener,
- OnDismissListener dismissListener) {
+ DialogInterface.OnCancelListener cancelListener) {
View view = LayoutInflater.from(context).inflate(
R.layout.user_dictionary_tool_simple_spinner_dialog_view, null);
AlertDialog dialog = new AlertDialog.Builder(context)
.setTitle(titleResourceId)
.setView(view)
- .setPositiveButton(android.R.string.yes, positiveButtonListener)
+ .setPositiveButton(android.R.string.ok, positiveButtonListener)
.setNegativeButton(android.R.string.cancel, negativeButtonListener)
.setOnCancelListener(cancelListener)
.setCancelable(true)
.create();
- dialog.setOnDismissListener(dismissListener);
return dialog;
}
@@ -589,31 +553,6 @@
}
/**
- * The default size of dialog looks not good on some devices, such as tablets.
- * So, modify the dialog size to make the look better.
- *
- * The current strategy is:
- * - if the display is small, we tries to fill the display width by the dialog.
- * - otherwise, set w480dip to the window.
- */
- static void setDialogWindowSize(Dialog dialog) {
- DisplayMetrics metrics = dialog.getContext().getResources().getDisplayMetrics();
- LayoutParams params = dialog.getWindow().getAttributes();
- float dialogWidthThreshold = DIALOG_WIDTH_THRESHOLD * metrics.scaledDensity;
- if (metrics.widthPixels > dialogWidthThreshold) {
- params.width = (int) dialogWidthThreshold;
- } else {
- params.width = LayoutParams.MATCH_PARENT;
- }
- if (dialog instanceof UserDictionaryBaseDialog) {
- // If the ScrollView hack is used for the dialog to make it scrollable,
- // it is necessary to set its height parameter MATCH_PARENT as a part of the hack.
- params.height = LayoutParams.MATCH_PARENT;
- }
- dialog.getWindow().setAttributes(params);
- }
-
- /**
* Returns the {@code String} instance with detecting the Japanese encoding.
* @throws UnsupportedEncodingException if it fails to detect the encoding.
*/
diff --git a/src/android/src/com/google/android/inputmethod/japanese/util/CandidateDescriptionUtil.java b/src/android/src/com/google/android/inputmethod/japanese/util/CandidateDescriptionUtil.java
new file mode 100644
index 0000000..0f17cca
--- /dev/null
+++ b/src/android/src/com/google/android/inputmethod/japanese/util/CandidateDescriptionUtil.java
@@ -0,0 +1,139 @@
+// Copyright 2010-2014, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package org.mozc.android.inputmethod.japanese.util;
+
+import com.google.common.base.Objects;
+import com.google.common.base.Optional;
+import com.google.common.base.Preconditions;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.StringTokenizer;
+
+/**
+ * Utility to handle candidate description.
+ */
+public class CandidateDescriptionUtil {
+
+ private static final Set<String> DESCRIPTION_BLACKLIST_SET;
+ static {
+ String[] blacklist = new String[] {
+ "ひらがな",
+ "数字",
+ "丸数字",
+ "大字",
+ "絵文字",
+ "顔文字",
+ "<機種依存>",
+ "捨て仮名",
+ };
+ DESCRIPTION_BLACKLIST_SET = Collections.unmodifiableSet(
+ new HashSet<String>(Arrays.asList(blacklist)));
+ }
+
+ private static final String[] DESCRIPTION_SUFFIX_BLACKLIST = new String[] {
+ "の旧字体",
+ "の簡易慣用字体",
+ "の印刷標準字体",
+ "の俗字",
+ "の正字",
+ "の本字",
+ "の異体字",
+ "の略字",
+ "の別字",
+ };
+
+ private static final Map<String, String> DESCRIPTION_SHORTEN_MAP;
+ static {
+ Map<String, String> map = new HashMap<String, String>();
+ map.put("小書き文字", "小書き");
+ map.put("ローマ数字(大文字)", "ローマ数字");
+ map.put("ローマ数字(小文字)", "ローマ数字");
+ DESCRIPTION_SHORTEN_MAP = Collections.unmodifiableMap(map);
+ }
+
+ private CandidateDescriptionUtil() {}
+
+ public static List<String> extractDescriptions(
+ String description, Optional<String> descriptionDelimiter) {
+ Preconditions.checkNotNull(description);
+ Preconditions.checkNotNull(descriptionDelimiter);
+
+ if (description.length() == 0) {
+ // No description is available.
+ return Collections.emptyList();
+ }
+
+ if (!descriptionDelimiter.isPresent()) {
+ // If the delimiter is not set, return the description as is.
+ return Collections.singletonList(description);
+ }
+
+ // Split the description by delimiter.
+ StringTokenizer tokenizer = new StringTokenizer(description, descriptionDelimiter.get());
+ List<String> result = new ArrayList<String>();
+ while (tokenizer.hasMoreTokens()) {
+ String token = tokenizer.nextToken();
+ if (isEligibleDescriptionFragment(token)) {
+ result.add(shortenDescriptionFragment(token));
+ }
+ }
+
+ return result;
+ }
+
+ private static boolean isEligibleDescriptionFragment(String descriptionFragment) {
+ // We'd like to always remove some descriptions because the description fragment frequently
+ // and largely increases the width of a candidate span.
+ // Increased width reduces the number of the candidates which are shown in a screen.
+ // TODO(matsuzakit): Such filtering/optimization should be done in the server side.
+ if (DESCRIPTION_BLACKLIST_SET.contains(descriptionFragment)) {
+ return false;
+ }
+ for (String suffix : DESCRIPTION_SUFFIX_BLACKLIST) {
+ if (descriptionFragment.endsWith(suffix)) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ private static String shortenDescriptionFragment(String descriptionFragment) {
+ Preconditions.checkNotNull(descriptionFragment);
+ return Objects.firstNonNull(DESCRIPTION_SHORTEN_MAP.get(descriptionFragment),
+ descriptionFragment);
+ }
+}
diff --git a/src/android/src/com/google/android/inputmethod/japanese/util/ImeSwitcherFactory.java b/src/android/src/com/google/android/inputmethod/japanese/util/ImeSwitcherFactory.java
index 2e924b2..3080f90 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/util/ImeSwitcherFactory.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/util/ImeSwitcherFactory.java
@@ -62,8 +62,6 @@
*/
public class ImeSwitcherFactory {
- static final int SWITCH_NEXT_TARGTET_API_LEVEL = 16;
-
private static final String GOOGLE_PACKAGE_ID_PREFIX = "com.google.android";
private static final String VOICE_IME_MODE = "voice";
@@ -133,6 +131,13 @@
* @return true if the switching succeeds
*/
boolean switchToNextInputMethod(boolean onlyCurrentIme);
+
+ /**
+ * @see InputMethodManager#shouldOfferSwitchingToNextInputMethod(IBinder)
+ *
+ * If not supported the API, returns false.
+ */
+ boolean shouldOfferSwitchingToNextInputMethod();
}
/**
@@ -222,15 +227,20 @@
public boolean switchToNextInputMethod(boolean onlyCurrentIme) {
return false;
}
+
+ @Override
+ public boolean shouldOfferSwitchingToNextInputMethod() {
+ return false;
+ }
}
/**
* A switcher for much later OS where switchToNextInputMethod is available.
*/
- @TargetApi(SWITCH_NEXT_TARGTET_API_LEVEL)
- static class NextInputSwitchableImeSwitcher extends SubtypeImeSwitcher {
+ @TargetApi(16)
+ static class ImeSwitcher16 extends SubtypeImeSwitcher {
- public NextInputSwitchableImeSwitcher(InputMethodService inputMethodService) {
+ public ImeSwitcher16(InputMethodService inputMethodService) {
super(inputMethodService);
}
@@ -241,14 +251,33 @@
}
}
+ /**
+ * A switcher for much later OS where switchToNextInputMethod is available.
+ */
+ @TargetApi(19)
+ static class ImeSwitcher21 extends ImeSwitcher16 {
+
+ public ImeSwitcher21(InputMethodService inputMethodService) {
+ super(inputMethodService);
+ }
+
+ @Override
+ public boolean shouldOfferSwitchingToNextInputMethod() {
+ return MozcUtil.getInputMethodManager(inputMethodService)
+ .shouldOfferSwitchingToNextInputMethod(getToken());
+ }
+ }
+
// A constructor of concrete switcher class.
// Null if reflection fails.
static final Constructor<? extends ImeSwitcher> switcherConstructor;
static {
Class<? extends ImeSwitcher> clazz;
- if (Build.VERSION.SDK_INT >= SWITCH_NEXT_TARGTET_API_LEVEL) {
- clazz = NextInputSwitchableImeSwitcher.class;
+ if (Build.VERSION.SDK_INT >= 21) {
+ clazz = ImeSwitcher21.class;
+ } else if (Build.VERSION.SDK_INT >= 16) {
+ clazz = ImeSwitcher16.class;
} else {
clazz = SubtypeImeSwitcher.class;
}
diff --git a/src/android/src/com/google/android/inputmethod/japanese/util/LauncherIconManagerFactory.java b/src/android/src/com/google/android/inputmethod/japanese/util/LauncherIconManagerFactory.java
new file mode 100644
index 0000000..0f77fbb
--- /dev/null
+++ b/src/android/src/com/google/android/inputmethod/japanese/util/LauncherIconManagerFactory.java
@@ -0,0 +1,139 @@
+// Copyright 2010-2014, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package org.mozc.android.inputmethod.japanese.util;
+
+import org.mozc.android.inputmethod.japanese.LauncherActivity;
+import org.mozc.android.inputmethod.japanese.MozcUtil;
+import org.mozc.android.inputmethod.japanese.preference.PreferenceUtil;
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Preconditions;
+
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.SharedPreferences;
+import android.content.pm.PackageManager;
+import android.preference.PreferenceManager;
+
+/**
+ * Manager of launcher icon's visibility.
+ */
+public class LauncherIconManagerFactory {
+
+ /**
+ * Interface for the manager.
+ */
+ public interface LauncherIconManager {
+ /**
+ * Updates launcher icon's visibility by checking the value in preferences or
+ * by checking whether the app is (updated) system application or not.
+ *
+ * @param context The application's context.
+ */
+ public void updateLauncherIconVisibility(Context context);
+ }
+
+ @VisibleForTesting
+ static class DefaultImplementation implements LauncherIconManager {
+
+ @Override
+ public void updateLauncherIconVisibility(Context context) {
+ Preconditions.checkNotNull(context);
+ SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context);
+ boolean visible = shouldLauncherIconBeVisible(context, sharedPreferences);
+ updateComponentEnableSetting(context, LauncherActivity.class, visible);
+ sharedPreferences.edit()
+ .putBoolean(PreferenceUtil.PREF_LAUNCHER_ICON_VISIBILITY_KEY, visible)
+ .apply();
+ }
+
+ /**
+ * Enables/disables component.
+ *
+ * @param context The application's context
+ * @param component The component to be enabled/disabled
+ * @param enabled true for enabled, false for disabled
+ */
+ private void updateComponentEnableSetting(
+ Context context, Class<?> component, boolean enabled) {
+ Preconditions.checkNotNull(context);
+ Preconditions.checkNotNull(component);
+ PackageManager packageManager = context.getPackageManager();
+ ComponentName componentName = new ComponentName(context.getApplicationContext(), component);
+ int newState = enabled ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED
+ : PackageManager.COMPONENT_ENABLED_STATE_DISABLED;
+ if (newState != packageManager.getComponentEnabledSetting(componentName)) {
+ packageManager.setComponentEnabledSetting(
+ componentName, newState, PackageManager.DONT_KILL_APP);
+ }
+ }
+
+ @VisibleForTesting
+ static boolean shouldLauncherIconBeVisible(Context context,
+ SharedPreferences sharedPreferences) {
+ // NOTE: Both flags below can be true at the same time.
+ boolean isSystemApplication = MozcUtil.isSystemApplication(context);
+ boolean isUpdatedSystemApplication = MozcUtil.isUpdatedSystemApplication(context);
+ if (sharedPreferences.contains(PreferenceUtil.PREF_LAUNCHER_ICON_VISIBILITY_KEY)) {
+ return sharedPreferences.getBoolean(
+ PreferenceUtil.PREF_LAUNCHER_ICON_VISIBILITY_KEY, true);
+ } else {
+ // If PREF_LAUNCHER_ICON_VISIBILITY_KEY is not set, we don't show launcher icon in
+ // following conditions:
+ if (isSystemApplication && !isUpdatedSystemApplication) {
+ // System app (not updated) doesn't show the icon.
+ return false;
+ }
+ if (isUpdatedSystemApplication
+ && sharedPreferences.contains(
+ PreferenceUtil.PREF_LAST_LAUNCH_ABI_INDEPENDENT_VERSION_CODE)) {
+ // Workaround for updated system app from preinstalled 2.16.1955.3.
+ // Preinstalled 2.16.1955.3 doesn't put PREF_LAUNCHER_ICON_VISIBILITY_KEY
+ // unless preference screen is shown so checking PREF_LAUNCHER_ICON_VISIBILITY_KEY
+ // doesn't work for the version.
+ // However PREF_LAST_LAUNCH_ABI_INDEPENDENT_VERSION_CODE is always written,
+ // use the preference instaed.
+ // If the preference exists, this means the IME has been launched as a preinstall
+ // app at least once.
+ // Therefore we should take over the visibility (== hide the icon).
+ return false;
+ }
+ return true;
+ }
+ }
+ }
+
+ private static LauncherIconManager defaultInstance = new DefaultImplementation();
+
+ private LauncherIconManagerFactory() {}
+
+ public static LauncherIconManager getDefaultInstance() {
+ return defaultInstance;
+ }
+}
diff --git a/src/android/src/com/google/android/inputmethod/japanese/util/ParserUtil.java b/src/android/src/com/google/android/inputmethod/japanese/util/ParserUtil.java
new file mode 100644
index 0000000..ebfa8da
--- /dev/null
+++ b/src/android/src/com/google/android/inputmethod/japanese/util/ParserUtil.java
@@ -0,0 +1,98 @@
+// Copyright 2010-2014, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package org.mozc.android.inputmethod.japanese.util;
+
+import org.xmlpull.v1.XmlPullParser;
+import org.xmlpull.v1.XmlPullParserException;
+
+import java.io.IOException;
+
+/**
+ * Utility for XML parser.
+ */
+public class ParserUtil {
+
+ public static void ignoreWhiteSpaceAndComment(XmlPullParser parser)
+ throws XmlPullParserException, IOException {
+ int event = parser.getEventType();
+ while (event == XmlPullParser.IGNORABLE_WHITESPACE || event == XmlPullParser.COMMENT) {
+ event = parser.next();
+ }
+ }
+
+ public static void assertStartDocument(XmlPullParser parser) throws XmlPullParserException {
+ if (parser.getEventType() != XmlPullParser.START_DOCUMENT) {
+ throw new IllegalArgumentException(
+ "The start of document is expected, but actually not: "
+ + parser.getPositionDescription());
+ }
+ }
+
+ public static void assertEndDocument(XmlPullParser parser) throws XmlPullParserException {
+ if (parser.getEventType() != XmlPullParser.END_DOCUMENT) {
+ throw new IllegalArgumentException(
+ "The end of document is expected, but actually not: " + parser.getPositionDescription());
+ }
+ }
+
+ public static void assertNotEndDocument(XmlPullParser parser) throws XmlPullParserException {
+ if (parser.getEventType() == XmlPullParser.END_DOCUMENT) {
+ throw new IllegalArgumentException(
+ "Unexpected end of document is found: " + parser.getPositionDescription());
+ }
+ }
+
+ public static void assertTagName(XmlPullParser parser, String expectedName) {
+ String actualName = parser.getName();
+ if (!actualName.equals(expectedName)) {
+ throw new IllegalArgumentException(
+ "Tag <" + expectedName + "> is expected, but found <" + actualName + ">: "
+ + parser.getPositionDescription());
+ }
+ }
+
+ public static void assertStartTag(XmlPullParser parser, String expectedName)
+ throws XmlPullParserException {
+ if (parser.getEventType() != XmlPullParser.START_TAG) {
+ throw new IllegalArgumentException(
+ "Start tag <" + expectedName + "> is expected: " + parser.getPositionDescription());
+ }
+ assertTagName(parser, expectedName);
+ }
+
+ public static void assertEndTag(XmlPullParser parser, String expectedName)
+ throws XmlPullParserException {
+ if (parser.getEventType() != XmlPullParser.END_TAG) {
+ throw new IllegalArgumentException(
+ "End tag </" + expectedName + "> is expected: " + parser.getPositionDescription());
+ }
+ assertTagName(parser, expectedName);
+ }
+}
diff --git a/src/android/src/com/google/android/inputmethod/japanese/view/DrawableCache.java b/src/android/src/com/google/android/inputmethod/japanese/view/DrawableCache.java
index 5e978f3..e679c34 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/view/DrawableCache.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/view/DrawableCache.java
@@ -29,10 +29,10 @@
package org.mozc.android.inputmethod.japanese.view;
-import org.mozc.android.inputmethod.japanese.MozcLog;
import com.google.common.base.Optional;
import com.google.common.base.Preconditions;
+import android.content.res.Resources;
import android.graphics.drawable.Drawable;
import android.util.SparseArray;
@@ -43,21 +43,21 @@
public class DrawableCache {
private final SparseArray<Drawable> cacheMap = new SparseArray<Drawable>(128);
- private final MozcDrawableFactory mozcDrawableFactory;
- private SkinType skinType = SkinType.ORANGE_LIGHTGRAY;
+ private Skin skin = Skin.getFallbackInstance();
+ private final Resources resources;
- public DrawableCache(MozcDrawableFactory mozcDrawableFactory) {
- this.mozcDrawableFactory = Preconditions.checkNotNull(mozcDrawableFactory);
+ public DrawableCache(Resources resources) {
+ this.resources = Preconditions.checkNotNull(resources);
}
- public void setSkinType(SkinType skinType) {
- if (this.skinType == Preconditions.checkNotNull(skinType)) {
+ public void setSkin(Skin skin) {
+ Preconditions.checkNotNull(skin);
+ if (this.skin.equals(skin)) {
return;
}
- this.skinType = skinType;
+ this.skin = skin;
cacheMap.clear();
- mozcDrawableFactory.setSkinType(skinType);
}
/**
@@ -74,12 +74,8 @@
Integer key = Integer.valueOf(resourceId);
Optional<Drawable> drawable = Optional.fromNullable(cacheMap.get(key));
if (!drawable.isPresent()) {
- drawable = mozcDrawableFactory.getDrawable(resourceId);
- if (drawable.isPresent()) {
- cacheMap.put(key, drawable.get());
- } else {
- MozcLog.e("Failed to load: " + resourceId);
- }
+ drawable = Optional.of(skin.getDrawable(resources, resourceId));
+ cacheMap.put(key, drawable.get());
}
return drawable;
}
diff --git a/src/android/src/com/google/android/inputmethod/japanese/view/DummyDrawable.java b/src/android/src/com/google/android/inputmethod/japanese/view/DummyDrawable.java
new file mode 100644
index 0000000..c9ea337
--- /dev/null
+++ b/src/android/src/com/google/android/inputmethod/japanese/view/DummyDrawable.java
@@ -0,0 +1,82 @@
+// Copyright 2010-2014, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package org.mozc.android.inputmethod.japanese.view;
+
+import android.graphics.Canvas;
+import android.graphics.ColorFilter;
+import android.graphics.drawable.Drawable;
+
+/**
+ * Singleton dummy drawable which does nothing.
+ * <p>
+ * Typically used when skin is not specified.
+ */
+public class DummyDrawable extends Drawable {
+
+ private static final DummyDrawable theInstance = new DummyDrawable();
+
+ public static DummyDrawable getInstance() {
+ return theInstance;
+ }
+
+ private DummyDrawable() {}
+
+ @Override
+ public void draw(Canvas canvas) {
+ }
+
+ @Override
+ public int getOpacity() {
+ return 0;
+ }
+
+ @Override
+ public void setAlpha(int alpha) {
+ }
+
+ @Override
+ public void setColorFilter(ColorFilter cf) {
+ }
+
+ @Override
+ public ConstantState getConstantState() {
+ return new ConstantState() {
+ @Override
+ public Drawable newDrawable() {
+ return theInstance;
+ }
+
+ @Override
+ public int getChangingConfigurations() {
+ return 0;
+ }
+ };
+ }
+}
diff --git a/src/android/src/com/google/android/inputmethod/japanese/view/LightIconDrawable.java b/src/android/src/com/google/android/inputmethod/japanese/view/LightIconDrawable.java
deleted file mode 100644
index 1930cb1..0000000
--- a/src/android/src/com/google/android/inputmethod/japanese/view/LightIconDrawable.java
+++ /dev/null
@@ -1,116 +0,0 @@
-// Copyright 2010-2014, Google Inc.
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-package org.mozc.android.inputmethod.japanese.view;
-
-import android.graphics.BlurMaskFilter;
-import android.graphics.Canvas;
-import android.graphics.ColorFilter;
-import android.graphics.LinearGradient;
-import android.graphics.Paint;
-import android.graphics.PixelFormat;
-import android.graphics.Rect;
-import android.graphics.BlurMaskFilter.Blur;
-import android.graphics.Paint.Style;
-import android.graphics.Shader.TileMode;
-import android.graphics.drawable.Drawable;
-
-/**
- * The light (indicator) mark for ALT key on qwerty layout.
- *
- */
-public class LightIconDrawable extends Drawable {
- private final float topOffset;
- private final float rightOffset;
-
- private final int lightColor;
- private final int darkColor;
- private final float radius;
-
- private float centerX;
- private float centerY;
-
- private final Paint basePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
- private final Paint shadePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
-
- public LightIconDrawable(float topOffset, float rightOffset,
- int lightColor, int darkColor, int shadeColor, float radius) {
- this.topOffset = topOffset;
- this.rightOffset = rightOffset;
- this.lightColor = lightColor;
- this.darkColor = darkColor;
- this.radius = radius;
-
- if (lightColor == darkColor) {
- basePaint.setColor(lightColor);
- }
-
- shadePaint.setStyle(Style.STROKE);
- shadePaint.setStrokeWidth(1);
- shadePaint.setMaskFilter(new BlurMaskFilter(2, Blur.INNER));
- shadePaint.setColor(shadeColor);
- }
-
- /* (non-Javadoc)
- * @see android.graphics.drawable.Drawable#draw(android.graphics.Canvas)
- */
- @Override
- public void draw(Canvas canvas) {
- canvas.drawCircle(centerX, centerY, radius, basePaint);
- canvas.drawCircle(centerX, centerY, radius, shadePaint);
- }
-
- @Override
- protected void onBoundsChange(Rect bound) {
- super.onBoundsChange(bound);
-
- centerX = bound.right - rightOffset;
- centerY = bound.top + topOffset;
-
- if (lightColor != darkColor) {
- float top = centerY - radius;
- // Hard coded parameters are based on design mock.
- basePaint.setShader(new LinearGradient(
- centerX, top, centerX + 2, top + 8, lightColor, darkColor, TileMode.CLAMP));
- }
- }
-
- @Override
- public int getOpacity() {
- return PixelFormat.TRANSLUCENT;
- }
-
- @Override
- public void setAlpha(int alpha) {
- }
-
- @Override
- public void setColorFilter(ColorFilter cf) {
- }
-}
diff --git a/src/android/src/com/google/android/inputmethod/japanese/view/MozcDrawableFactory.java b/src/android/src/com/google/android/inputmethod/japanese/view/MozcDrawableFactory.java
index abb0aa3..4a66552 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/view/MozcDrawableFactory.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/view/MozcDrawableFactory.java
@@ -31,14 +31,17 @@
import org.mozc.android.inputmethod.japanese.MozcLog;
import org.mozc.android.inputmethod.japanese.MozcUtil;
+import com.google.common.base.Charsets;
import com.google.common.base.Optional;
import com.google.common.base.Preconditions;
+import android.content.res.AssetManager;
import android.content.res.Resources;
import android.graphics.Canvas;
import android.graphics.LinearGradient;
import android.graphics.Matrix;
import android.graphics.Paint;
+import android.graphics.Paint.Align;
import android.graphics.Paint.Cap;
import android.graphics.Paint.Join;
import android.graphics.Paint.Style;
@@ -48,13 +51,16 @@
import android.graphics.RectF;
import android.graphics.Shader;
import android.graphics.Shader.TileMode;
+import android.graphics.Typeface;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.PictureDrawable;
import android.graphics.drawable.StateListDrawable;
+import android.os.Build;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
+import java.util.Locale;
/**
* Factory to create Drawables from raw resources which is in mozc original format.
@@ -68,7 +74,16 @@
* Also, for performance purpose, this class caches the parsed drawable.
*
*/
-public class MozcDrawableFactory {
+class MozcDrawableFactory {
+
+ private static class MozcStyle {
+ Paint paint = new Paint();
+ int dominantBaseline = COMMAND_PICTURE_PAINT_DOMINANTE_BASELINE_AUTO;
+ }
+
+ /** Locale field for {@link Paint#setTextLocale(Locale)}. */
+ private static final Optional<Locale> TEXT_LOCALE = (Build.VERSION.SDK_INT >= 17)
+ ? Optional.of(Locale.JAPAN) : Optional.<Locale>absent();
private static final int DRAWABLE_PICTURE = 1;
private static final int DRAWABLE_STATE_LIST = 2;
@@ -83,6 +98,7 @@
private static final int COMMAND_PICTURE_DRAW_ELLIPSE = 7;
private static final int COMMAND_PICTURE_DRAW_GROUP_START = 8;
private static final int COMMAND_PICTURE_DRAW_GROUP_END = 9;
+ private static final int COMMAND_PICTURE_DRAW_TEXT = 10;
private static final int COMMAND_PICTURE_PATH_EOP = 0;
private static final int COMMAND_PICTURE_PATH_MOVE = 1;
@@ -101,31 +117,42 @@
private static final int COMMAND_PICTURE_PAINT_STROKE_CAP = 5;
private static final int COMMAND_PICTURE_PAINT_STROKE_JOIN = 6;
private static final int COMMAND_PICTURE_PAINT_SHADER = 7;
+ private static final int COMMAND_PICTURE_PAINT_FONT_SIZE = 8;
+ private static final int COMMAND_PICTURE_PAINT_TEXT_ANCHOR = 9;
+ private static final int COMMAND_PICTURE_PAINT_DOMINANT_BASELINE = 10;
+ private static final int COMMAND_PICTURE_PAINT_FONT_WEIGHT = 11;
+
+ private static final int COMMAND_PICTURE_PAINT_TEXT_ANCHOR_START = 0;
+ private static final int COMMAND_PICTURE_PAINT_TEXT_ANCHOR_MIDDLE = 1;
+ private static final int COMMAND_PICTURE_PAINT_TEXT_ANCHOR_END = 2;
+
+ private static final int COMMAND_PICTURE_PAINT_DOMINANTE_BASELINE_AUTO = 0;
+ @SuppressWarnings("unused")
+ private static final int COMMAND_PICTURE_PAINT_DOMINANTE_BASELINE_CENTRAL = 1;
+
+ @SuppressWarnings("unused")
+ private static final int COMMAND_PICTURE_PAINT_FONT_WEIGHT_NORMAL = 0;
+ private static final int COMMAND_PICTURE_PAINT_FONT_WEIGHT_BOLD = 1;
private static final int COMMAND_PICTURE_SHADER_LINEAR_GRADIENT = 1;
private static final int COMMAND_PICTURE_SHADER_RADIAL_GRADIENT = 2;
private static final int[] EMPTY_STATE_LIST = {};
+ private static final String FONT_PATH = "subset_font.otf";
+
private final Resources resources;
private final WeakDrawableCache cacheMap = new WeakDrawableCache();
- private SkinType skinType = SkinType.ORANGE_LIGHTGRAY;
+ private final Skin skin;
+ private static volatile Optional<Typeface> typeface = Optional.absent();
- public MozcDrawableFactory(Resources resources) {
+ MozcDrawableFactory(Resources resources, Skin skin) {
this.resources = Preconditions.checkNotNull(resources);
+ this.skin = Preconditions.checkNotNull(skin);
+ ensureTypeface(resources.getAssets());
}
- // TODO(hidehiko): Add test to make sure getDrawable returns diffenent instances for
- // the same resourceId when the current skinType gets different.
- public void setSkinType(SkinType skinType) {
- if (this.skinType != Preconditions.checkNotNull(skinType)) {
- this.skinType = skinType;
- // Invalidate cache.
- cacheMap.clear();
- }
- }
-
- public Optional<Drawable> getDrawable(int resourceId) {
+ Optional<Drawable> getDrawable(int resourceId) {
if (!resources.getResourceTypeName(resourceId).equalsIgnoreCase("raw")) {
// For non-"raw" resources, just delegate loading to Resources.
return Optional.fromNullable(resources.getDrawable(resourceId));
@@ -138,7 +165,7 @@
try {
boolean success = false;
try {
- drawable = createDrawable(new DataInputStream(stream), skinType);
+ drawable = createDrawable(new DataInputStream(stream), skin);
success = true;
} finally {
MozcUtil.close(stream, !success);
@@ -154,17 +181,16 @@
return drawable;
}
- private static Optional<Drawable> createDrawable(DataInputStream stream, SkinType skinType)
+ private static Optional<Drawable> createDrawable(DataInputStream stream, Skin skin)
throws IOException {
Preconditions.checkNotNull(stream);
- Preconditions.checkNotNull(skinType);
byte tag = stream.readByte();
switch (tag) {
case DRAWABLE_PICTURE:
- return Optional.<Drawable>of(createPictureDrawable(stream, skinType));
+ return Optional.<Drawable>of(createPictureDrawable(stream, skin));
case DRAWABLE_STATE_LIST:
- return Optional.<Drawable>of(createStateListDrawable(stream, skinType));
+ return Optional.<Drawable>of(createStateListDrawable(stream, skin));
default:
MozcLog.e("Unknown tag: " + tag);
}
@@ -174,16 +200,18 @@
// Note, PictureDrawable may cause runtime slowness.
// Instead, we can prepare pre-rendered bit-map drawable, by modifying the interface to take
// the drawable, which should be faster theoretically.
- private static PictureDrawable createPictureDrawable(DataInputStream stream, SkinType skinType)
+ private static PictureDrawable createPictureDrawable(DataInputStream stream, Skin skin)
throws IOException {
+ Preconditions.checkNotNull(stream);
+ Preconditions.checkNotNull(skin);
// The first eight bytes are width and height (four bytes for each).
int width = stream.readUnsignedShort();
int height = stream.readUnsignedShort();
Picture picture = new Picture();
Canvas canvas = picture.beginRecording(width, height);
- Paint paint = new Paint();
- resetPaint(paint);
+ MozcStyle style = new MozcStyle();
+ resetStyle(style);
LOOP: while (true) {
byte command = stream.readByte();
@@ -195,13 +223,13 @@
Path path = createPath(stream);
int size = stream.readByte();
if (size == 0) {
- resetPaint(paint);
- canvas.drawPath(path, paint);
+ resetStyle(style);
+ canvas.drawPath(path, style.paint);
} else {
for (int i = 0; i < size; ++i) {
- resetPaint(paint);
- parsePaint(stream, skinType, paint);
- canvas.drawPath(path, paint);
+ resetStyle(style);
+ parseStyle(stream, skin, style);
+ canvas.drawPath(path, style.paint);
}
}
break;
@@ -218,16 +246,17 @@
int size = stream.readByte();
if (size == 0) {
- resetPaint(paint);
+ resetStyle(style);
for (int i = 0; i < length - 2; i += 2) {
- canvas.drawLine(points[i], points[i + 1], points[i + 2], points[i + 3], paint);
+ canvas.drawLine(points[i], points[i + 1], points[i + 2], points[i + 3], style.paint);
}
} else {
for (int i = 0; i < size; ++i) {
- resetPaint(paint);
- parsePaint(stream, skinType, paint);
+ resetStyle(style);
+ parseStyle(stream, skin, style);
for (int j = 0; j < length - 2; j += 2) {
- canvas.drawLine(points[j], points[j + 1], points[j + 2], points[j + 3], paint);
+ canvas.drawLine(points[j], points[j + 1], points[j + 2], points[j + 3],
+ style.paint);
}
}
}
@@ -254,13 +283,13 @@
int size = stream.readUnsignedByte();
if (size == 0) {
- resetPaint(paint);
- canvas.drawPath(path, paint);
+ resetStyle(style);
+ canvas.drawPath(path, style.paint);
} else {
for (int i = 0; i < size; ++i) {
- resetPaint(paint);
- parsePaint(stream, skinType, paint);
- canvas.drawPath(path, paint);
+ resetStyle(style);
+ parseStyle(stream, skin, style);
+ canvas.drawPath(path, style.paint);
}
}
break;
@@ -273,13 +302,13 @@
int size = stream.readUnsignedByte();
if (size == 0) {
- resetPaint(paint);
- canvas.drawLine(x1, y1, x2, y2, paint);
+ resetStyle(style);
+ canvas.drawLine(x1, y1, x2, y2, style.paint);
} else {
for (int i = 0; i < size; ++i) {
- resetPaint(paint);
- parsePaint(stream, skinType, paint);
- canvas.drawLine(x1, y1, x2, y2, paint);
+ resetStyle(style);
+ parseStyle(stream, skin, style);
+ canvas.drawLine(x1, y1, x2, y2, style.paint);
}
}
break;
@@ -292,13 +321,13 @@
int size = stream.readUnsignedByte();
if (size == 0) {
- resetPaint(paint);
- canvas.drawRect(x, y, x + w, y + h, paint);
+ resetStyle(style);
+ canvas.drawRect(x, y, x + w, y + h, style.paint);
} else {
for (int i = 0; i < size; ++i) {
- resetPaint(paint);
- parsePaint(stream, skinType, paint);
- canvas.drawRect(x, y, x + w, y + h, paint);
+ resetStyle(style);
+ parseStyle(stream, skin, style);
+ canvas.drawRect(x, y, x + w, y + h, style.paint);
}
}
break;
@@ -311,13 +340,13 @@
int size = stream.readUnsignedByte();
if (size == 0) {
- resetPaint(paint);
- canvas.drawOval(bound, paint);
+ resetStyle(style);
+ canvas.drawOval(bound, style.paint);
} else {
for (int i = 0; i < size; ++i) {
- resetPaint(paint);
- parsePaint(stream, skinType, paint);
- canvas.drawOval(bound, paint);
+ resetStyle(style);
+ parseStyle(stream, skin, style);
+ canvas.drawOval(bound, style.paint);
}
}
break;
@@ -331,13 +360,13 @@
int size = stream.readUnsignedByte();
if (size == 0) {
- resetPaint(paint);
- canvas.drawOval(bound, paint);
+ resetStyle(style);
+ canvas.drawOval(bound, style.paint);
} else {
for (int i = 0; i < size; ++i) {
- resetPaint(paint);
- parsePaint(stream, skinType, paint);
- canvas.drawOval(bound, paint);
+ resetStyle(style);
+ parseStyle(stream, skin, style);
+ canvas.drawOval(bound, style.paint);
}
}
break;
@@ -361,6 +390,29 @@
case COMMAND_PICTURE_DRAW_GROUP_END:
canvas.restore();
break;
+ case COMMAND_PICTURE_DRAW_TEXT: {
+ float x = readCompressedFloat(stream);
+ float y = readCompressedFloat(stream);
+ short stringSize = stream.readShort();
+ byte[] stringBuffer = new byte[stringSize];
+ stream.read(stringBuffer);
+ String string = new String(stringBuffer, Charsets.UTF_8);
+ int size = stream.readByte();
+ if (size == 0) {
+ resetStyle(style);
+ canvas.drawText(string, x, y, style.paint);
+ } else {
+ for (int i = 0; i < size; ++i) {
+ resetStyle(style);
+ parseStyle(stream, skin, style);
+ float drawY = style.dominantBaseline == COMMAND_PICTURE_PAINT_DOMINANTE_BASELINE_AUTO
+ ? y
+ : y - (style.paint.ascent() + style.paint.descent()) / 2;
+ canvas.drawText(string, x, drawY, style.paint);
+ }
+ }
+ break;
+ }
default:
MozcLog.e("unknown command " + command);
}
@@ -370,20 +422,42 @@
return new MozcPictureDrawable(picture);
}
- private static void resetPaint(Paint paint) {
- paint.reset();
- paint.setAntiAlias(true);
+ private void ensureTypeface(AssetManager assetManager) {
+ if (!typeface.isPresent()) {
+ synchronized (typeface) {
+ if (!typeface.isPresent()) {
+ try {
+ typeface = Optional.of(Typeface.createFromAsset(assetManager, FONT_PATH));
+ } catch (RuntimeException e) {
+ // Typeface cannot be made. Use default typeface as fallback.
+ MozcLog.e(FONT_PATH + " is not accessible. Use system font.");
+ typeface = Optional.of(Typeface.DEFAULT);
+ }
+ }
+ }
+ }
}
- private static void parsePaint(DataInputStream stream, SkinType skinType, Paint paint)
+ private static void resetStyle(MozcStyle style) {
+ style.paint.reset();
+ style.paint.setAntiAlias(true);
+ style.paint.setTypeface(typeface.get());
+ if (TEXT_LOCALE.isPresent()) {
+ style.paint.setTextLocale(TEXT_LOCALE.get());
+ }
+ style.dominantBaseline = COMMAND_PICTURE_PAINT_DOMINANTE_BASELINE_AUTO;
+ }
+
+ private static void parseStyle(DataInputStream stream, Skin skin, MozcStyle style)
throws IOException {
+ Paint paint = style.paint;
while (true) {
int tag = stream.readByte() & 0xFF;
if (tag >= 128) {
// This is a bit tricky format, but the highest 1-bit means that the style should be
// based on skin configuration. Delegate the paint to the skin.
- skinType.apply(paint, tag & 0x7F);
- return;
+ skin.apply(paint, tag & 0x7F);
+ continue;
}
switch (tag) {
@@ -421,6 +495,35 @@
paint.setShader(createShader(stream).orNull());
break;
}
+ case COMMAND_PICTURE_PAINT_FONT_SIZE: {
+ paint.setTextSize(readCompressedFloat(stream));
+ break;
+ }
+ case COMMAND_PICTURE_PAINT_TEXT_ANCHOR: {
+ byte value = stream.readByte();
+ switch (value) {
+ case COMMAND_PICTURE_PAINT_TEXT_ANCHOR_START:
+ paint.setTextAlign(Align.LEFT);
+ break;
+ case COMMAND_PICTURE_PAINT_TEXT_ANCHOR_MIDDLE:
+ paint.setTextAlign(Align.CENTER);
+ break;
+ case COMMAND_PICTURE_PAINT_TEXT_ANCHOR_END:
+ paint.setTextAlign(Align.RIGHT);
+ break;
+ default:
+ MozcLog.e("Unknown text-anchor : " + value, new Exception());
+ }
+ break;
+ }
+ case COMMAND_PICTURE_PAINT_DOMINANT_BASELINE: {
+ style.dominantBaseline = stream.readByte();
+ break;
+ }
+ case COMMAND_PICTURE_PAINT_FONT_WEIGHT: {
+ style.paint.setFakeBoldText(stream.readByte() == COMMAND_PICTURE_PAINT_FONT_WEIGHT_BOLD);
+ break;
+ }
default:
MozcLog.e("Unknown paint tag: " + tag, new Exception());
}
@@ -584,12 +687,12 @@
}
private static StateListDrawable createStateListDrawable(
- DataInputStream stream, SkinType skinType) throws IOException {
+ DataInputStream stream, Skin skin) throws IOException {
int length = stream.readUnsignedByte();
StateListDrawable result = new StateListDrawable();
for (int i = 0; i < length; ++i) {
int[] stateList = createStateList(stream);
- Optional<Drawable> drawable = createDrawable(stream, skinType);
+ Optional<Drawable> drawable = createDrawable(stream, skin);
result.addState(stateList, drawable.orNull());
}
return result;
diff --git a/src/android/src/com/google/android/inputmethod/japanese/view/MozcImageButton.java b/src/android/src/com/google/android/inputmethod/japanese/view/MozcImageButton.java
new file mode 100644
index 0000000..2906280
--- /dev/null
+++ b/src/android/src/com/google/android/inputmethod/japanese/view/MozcImageButton.java
@@ -0,0 +1,94 @@
+// Copyright 2010-2014, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package org.mozc.android.inputmethod.japanese.view;
+
+import com.google.common.base.Preconditions;
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.widget.ImageButton;
+import android.widget.ImageView;
+
+/**
+ * A ImageButton which accepts mozc drawable as src.
+ * <p>
+ * See {@code MozcImageView}.
+ */
+public class MozcImageButton extends ImageButton implements MozcImageCapableView {
+
+ private final MozcImageCapableViewDelegate delegate = new MozcImageCapableViewDelegate(this);
+
+ public MozcImageButton(Context context, AttributeSet attrs, int defStyle) {
+ super(context, attrs, defStyle);
+ Preconditions.checkArgument(
+ MozcImageCapableViewDelegate.assertSrcAttribute(getResources(), attrs));
+ delegate.loadMozcImageSource(attrs);
+ }
+
+ public MozcImageButton(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ Preconditions.checkArgument(
+ MozcImageCapableViewDelegate.assertSrcAttribute(getResources(), attrs));
+ delegate.loadMozcImageSource(attrs);
+ }
+
+ public MozcImageButton(Context context) {
+ super(context);
+ }
+
+ public void setRawId(int rawId) {
+ delegate.setRawId(rawId);
+ }
+
+ public void setSkin(Skin skin) {
+ delegate.setSkin(skin);
+ }
+
+ @Override
+ protected void onSizeChanged(int width, int height, int oldWidth, int oldHeight) {
+ super.onSizeChanged(width, height, oldWidth, oldHeight);
+ delegate.updateAdditionalPadding();
+ }
+
+ @Override
+ public void setMaxImageWidth(int maxImageWidth) {
+ delegate.setMaxImageWidth(maxImageWidth);
+ }
+
+ @Override
+ public void setMaxImageHeight(int maxImageHeight) {
+ delegate.setMaxImageHeight(maxImageHeight);
+ }
+
+ @Override
+ public ImageView asImageView() {
+ return this;
+ }
+}
diff --git a/src/android/src/com/google/android/inputmethod/japanese/view/MozcImageCapableView.java b/src/android/src/com/google/android/inputmethod/japanese/view/MozcImageCapableView.java
new file mode 100644
index 0000000..bf84af6
--- /dev/null
+++ b/src/android/src/com/google/android/inputmethod/japanese/view/MozcImageCapableView.java
@@ -0,0 +1,174 @@
+// Copyright 2010-2014, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package org.mozc.android.inputmethod.japanese.view;
+
+import org.mozc.android.inputmethod.japanese.resources.R;
+import com.google.common.base.Preconditions;
+
+import android.content.res.Resources;
+import android.content.res.TypedArray;
+import android.util.AttributeSet;
+import android.view.View;
+import android.widget.ImageView;
+
+/**
+ * Views which support MozcDrawable should implement this interface
+ * delegate some methods.
+ */
+public interface MozcImageCapableView {
+
+ public void setMaxImageWidth(int maxImageWidth);
+ public void setMaxImageHeight(int maxImageHeight);
+ public ImageView asImageView();
+
+ /**
+ * Delagate object used by the views implementing MozcImageCapableView.
+ */
+ class MozcImageCapableViewDelegate {
+
+ private static final int INVALID_RESOURCE_ID = 0;
+ private static final int UNSPECIFIED_SIZE = -1;
+ private static final String XML_NAMESPACE_ANDROID =
+ "http://schemas.android.com/apk/res/android";
+ private static final String XML_NAMESPACE_MOZC =
+ "http://schemas.android.com/apk/res-auto";
+ private Skin skin = Skin.getFallbackInstance();
+ private int rawId = INVALID_RESOURCE_ID;
+ private int maxImageWidth = UNSPECIFIED_SIZE;
+ private int maxImageHeight = UNSPECIFIED_SIZE;
+ private final MozcImageCapableView baseView;
+
+ MozcImageCapableViewDelegate(MozcImageCapableView baseView) {
+ this.baseView = Preconditions.checkNotNull(baseView);
+ // Disable h/w acceleration to use a PictureDrawable.
+ baseView.asImageView().setLayerType(View.LAYER_TYPE_SOFTWARE, null);
+ }
+
+ static boolean assertSrcAttribute(Resources resources, AttributeSet attrs) {
+ int srcId = attrs.getAttributeResourceValue(
+ XML_NAMESPACE_ANDROID, "src", INVALID_RESOURCE_ID);
+ if (srcId == INVALID_RESOURCE_ID) {
+ return true;
+ }
+ return !"raw".equals(resources.getResourceTypeName(srcId));
+ }
+
+ void loadMozcImageSource(AttributeSet attrs) {
+ rawId = attrs.getAttributeResourceValue(
+ XML_NAMESPACE_MOZC, "rawSrc", INVALID_RESOURCE_ID);
+ TypedArray typedArray =
+ baseView.asImageView().getContext().obtainStyledAttributes(attrs,
+ R.styleable.MozcImageView);
+ try {
+ maxImageWidth =
+ typedArray.getDimensionPixelOffset(R.styleable.MozcImageView_maxImageWidth,
+ UNSPECIFIED_SIZE);
+ maxImageHeight =
+ typedArray.getDimensionPixelOffset(R.styleable.MozcImageView_maxImageHeight,
+ UNSPECIFIED_SIZE);
+ } finally {
+ typedArray.recycle();
+ }
+ }
+
+ private void updateMozcDrawable() {
+ if (rawId != INVALID_RESOURCE_ID) {
+ ImageView view = baseView.asImageView();
+ view.setImageDrawable(
+ skin.getDrawable(baseView.asImageView().getContext().getResources(), rawId));
+ view.invalidate();
+ }
+ }
+
+ void setRawId(int rawId) {
+ this.rawId = rawId;
+ updateMozcDrawable();
+ }
+
+ @SuppressWarnings("deprecation")
+ void setSkin(Skin skin) {
+ this.skin = Preconditions.checkNotNull(skin);
+ updateMozcDrawable();
+ }
+
+ void updateAdditionalPadding() {
+ updateAdditionalHorizontalPadding();
+ updateAdditionalVerticalPadding();
+ }
+
+ void setMaxImageWidth(int maxImageWidth) {
+ this.maxImageWidth = maxImageWidth;
+ updateAdditionalHorizontalPadding();
+ }
+
+ void setMaxImageHeight(int maxImageHeight) {
+ this.maxImageHeight = maxImageHeight;
+ updateAdditionalVerticalPadding();
+ }
+
+ private void updateAdditionalHorizontalPadding() {
+ ImageView imageView = baseView.asImageView();
+ int paddingLeft = baseView.asImageView().getPaddingLeft();
+ int paddingRight = baseView.asImageView().getPaddingRight();
+ int additionalHorizontalPadding = maxImageWidth < 0 ? 0 : Math.max(
+ 0, baseView.asImageView().getWidth() - paddingLeft - paddingRight - maxImageWidth);
+ if (additionalHorizontalPadding == 0) {
+ return;
+ }
+ int additionalLeftPadding = additionalHorizontalPadding / 2;
+ int additionalRightPadding = additionalHorizontalPadding - additionalLeftPadding;
+ baseView.asImageView().setPadding(
+ paddingLeft + additionalLeftPadding,
+ imageView.getPaddingTop(),
+ paddingRight + additionalRightPadding,
+ imageView.getPaddingBottom());
+ imageView.invalidate();
+ }
+
+ private void updateAdditionalVerticalPadding() {
+ ImageView imageView = baseView.asImageView();
+ int paddingTop = imageView.getPaddingTop();
+ int paddingBottom = imageView.getPaddingBottom();
+ int additionalVerticalPadding = maxImageHeight < 0
+ ? 0 : imageView.getHeight() - paddingTop - paddingBottom - maxImageHeight;
+ if (additionalVerticalPadding == 0) {
+ return;
+ }
+ int additionalTopPadding = additionalVerticalPadding / 2;
+ int additionalBottomPadding = additionalVerticalPadding - additionalTopPadding;
+ baseView.asImageView().setPadding(
+ imageView.getPaddingLeft(),
+ paddingTop + additionalTopPadding,
+ imageView.getPaddingRight(),
+ paddingBottom + additionalBottomPadding);
+ imageView.invalidate();
+ }
+ }
+}
diff --git a/src/android/src/com/google/android/inputmethod/japanese/view/MozcImageView.java b/src/android/src/com/google/android/inputmethod/japanese/view/MozcImageView.java
new file mode 100644
index 0000000..5e08e93
--- /dev/null
+++ b/src/android/src/com/google/android/inputmethod/japanese/view/MozcImageView.java
@@ -0,0 +1,104 @@
+// Copyright 2010-2014, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package org.mozc.android.inputmethod.japanese.view;
+
+import com.google.common.base.Preconditions;
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.widget.ImageView;
+
+/**
+ * A ImageView which accepts mozc drawable as src.
+ * <p>
+ * In addition to ImageView, following XML attributes are supported:
+ * <ul>
+ * <li>maxImageWidth(dimension): If set, additional padding (left and right) are automatically
+ * set in order to make drawn image thinner than given width.
+ * {@code setPadding} and {@code setPaddingRelative} are disabled
+ * (UnsupportedOperationException will be thrown}.
+ * <li>maxImageHeight(dimension): Same as maxImageWidth.
+ * </ul>
+ * <p>
+ * This class is not intended to be changed its padding.
+ * There was a warning code for it but on old Android framework setPadding() is always called
+ * so the warning code has been removed.
+ */
+public class MozcImageView extends ImageView implements MozcImageCapableView {
+
+ private final MozcImageCapableViewDelegate delegate = new MozcImageCapableViewDelegate(this);
+
+ public MozcImageView(Context context, AttributeSet attrs, int defStyle) {
+ super(context, attrs, defStyle);
+ Preconditions.checkArgument(
+ MozcImageCapableViewDelegate.assertSrcAttribute(getResources(), attrs));
+ delegate.loadMozcImageSource(attrs);
+ }
+
+ public MozcImageView(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ Preconditions.checkArgument(
+ MozcImageCapableViewDelegate.assertSrcAttribute(getResources(), attrs));
+ delegate.loadMozcImageSource(attrs);
+ }
+
+ public MozcImageView(Context context) {
+ super(context);
+ }
+
+ public void setRawId(int rawId) {
+ delegate.setRawId(rawId);
+ }
+
+ public void setSkin(Skin skin) {
+ delegate.setSkin(skin);
+ }
+
+ @Override
+ protected void onSizeChanged(int width, int height, int oldWidth, int oldHeight) {
+ super.onSizeChanged(width, height, oldWidth, oldHeight);
+ delegate.updateAdditionalPadding();
+ }
+
+ @Override
+ public void setMaxImageWidth(int maxImageWidth) {
+ delegate.setMaxImageWidth(maxImageWidth);
+ }
+
+ @Override
+ public void setMaxImageHeight(int maxImageHeight) {
+ delegate.setMaxImageHeight(maxImageHeight);
+ }
+
+ @Override
+ public ImageView asImageView() {
+ return this;
+ }
+}
diff --git a/src/android/src/com/google/android/inputmethod/japanese/view/MozcPictureDrawable.java b/src/android/src/com/google/android/inputmethod/japanese/view/MozcPictureDrawable.java
index f756296..fc53a43 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/view/MozcPictureDrawable.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/view/MozcPictureDrawable.java
@@ -34,6 +34,7 @@
import android.graphics.Canvas;
import android.graphics.Picture;
import android.graphics.Rect;
+import android.graphics.drawable.Drawable;
import android.graphics.drawable.PictureDrawable;
/**
@@ -48,6 +49,9 @@
@Override
public void draw(Canvas canvas) {
+ Preconditions.checkArgument(!canvas.isHardwareAccelerated(),
+ "MozcPictureDrawable doesn't accept h/w accelerated canvas, "
+ + "which doesn't support drawPicture().");
Picture picture = getPicture();
if (picture == null) {
return;
@@ -65,4 +69,19 @@
canvas.restoreToCount(saveCount);
}
}
+
+ @Override
+ public ConstantState getConstantState() {
+ return new ConstantState() {
+ @Override
+ public int getChangingConfigurations() {
+ return 0;
+ }
+
+ @Override
+ public Drawable newDrawable() {
+ return new MozcPictureDrawable(getPicture());
+ }
+ };
+ }
}
diff --git a/src/android/src/com/google/android/inputmethod/japanese/view/PopUpFrameWindowDrawable.java b/src/android/src/com/google/android/inputmethod/japanese/view/PopUpFrameWindowDrawable.java
deleted file mode 100644
index c2cccd2..0000000
--- a/src/android/src/com/google/android/inputmethod/japanese/view/PopUpFrameWindowDrawable.java
+++ /dev/null
@@ -1,135 +0,0 @@
-// Copyright 2010-2014, Google Inc.
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-package org.mozc.android.inputmethod.japanese.view;
-
-import com.google.common.base.Optional;
-
-import android.graphics.BlurMaskFilter;
-import android.graphics.BlurMaskFilter.Blur;
-import android.graphics.Canvas;
-import android.graphics.LinearGradient;
-import android.graphics.Paint;
-import android.graphics.Paint.Style;
-import android.graphics.Rect;
-import android.graphics.Shader;
-import android.graphics.Shader.TileMode;
-
-/**
- * Drawable to render a popup window with a frame.
- *
- */
-public class PopUpFrameWindowDrawable extends BaseBackgroundDrawable {
-
- private final int frameWidth;
-
- private final int topColor;
- private final int bottomColor;
- private final int borderColor;
- private final int innerPaneColor;
- private final float shadowSize;
-
- private final Rect outerFrameRect = new Rect();
- private final Rect innerFrameRect = new Rect();
- private final Paint paint = new Paint();
- private final BlurMaskFilter blurMaskFilter;
- private Optional<Shader> shader = Optional.absent();
-
- public PopUpFrameWindowDrawable(
- int leftPadding, int topPadding, int rightPadding, int bottomPadding,
- int frameWidth, float shadowSize,
- int topColor, int bottomColor, int borderColor, int innerPaneColor) {
- super(leftPadding, topPadding, rightPadding, bottomPadding);
-
- this.frameWidth = frameWidth;
- this.topColor = topColor;
- this.bottomColor = bottomColor;
- this.borderColor = borderColor;
- this.innerPaneColor = innerPaneColor;
- this.shadowSize = shadowSize;
- this.blurMaskFilter = new BlurMaskFilter(shadowSize, Blur.INNER);
- }
-
- @Override
- public void draw(Canvas canvas) {
- if (isCanvasRectEmpty()) {
- return;
- }
-
- Paint paint = this.paint;
-
- // First of all, render the shadow.
- paint.reset();
- paint.setAntiAlias(true);
- paint.setColor(0x80000000);
- paint.setShadowLayer(shadowSize * 0.6f, shadowSize, shadowSize, 0xFF404040);
- canvas.drawRect(outerFrameRect, paint);
-
- // Draw the main part of the frame.
- if (shader.isPresent()) {
- paint.reset();
- paint.setAntiAlias(true);
- paint.setShader(shader.get());
- canvas.drawRect(outerFrameRect, paint);
- }
-
- // Draw the inner pane.
- paint.reset();
- paint.setAntiAlias(true);
- paint.setColor(0xFF000000);
- canvas.drawRect(innerFrameRect, paint);
-
- paint.setColor(innerPaneColor);
- paint.setMaskFilter(blurMaskFilter);
- canvas.drawRect(innerFrameRect, paint);
-
- // Draw the border.
- paint.reset();
- paint.setAntiAlias(true);
- paint.setColor(borderColor);
- paint.setStyle(Style.STROKE);
-
- canvas.drawRect(outerFrameRect, paint);
- canvas.drawRect(innerFrameRect, paint);
- }
-
- @Override
- protected void onBoundsChange(Rect bounds) {
- super.onBoundsChange(bounds);
-
- Rect canvasRect = getCanvasRect();
-
- outerFrameRect.set(canvasRect);
- innerFrameRect.set(
- canvasRect.left + frameWidth, canvasRect.top + frameWidth,
- canvasRect.right - frameWidth, canvasRect.bottom - frameWidth);
- shader = Optional.<Shader>of(new LinearGradient(
- 0, canvasRect.top, 0, canvasRect.bottom, topColor, bottomColor, TileMode.CLAMP));
- }
-}
diff --git a/src/android/src/com/google/android/inputmethod/japanese/view/QwertySpaceKeyDrawable.java b/src/android/src/com/google/android/inputmethod/japanese/view/QwertySpaceKeyDrawable.java
new file mode 100644
index 0000000..66012f0
--- /dev/null
+++ b/src/android/src/com/google/android/inputmethod/japanese/view/QwertySpaceKeyDrawable.java
@@ -0,0 +1,57 @@
+// Copyright 2010-2014, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package org.mozc.android.inputmethod.japanese.view;
+
+import android.graphics.Rect;
+
+/** The space key implementation for qwerty keyboards. */
+public class QwertySpaceKeyDrawable extends RoundRectKeyDrawable {
+ private static final int UNLIMITED_HEIGHT = 0;
+ private final int height;
+
+ public QwertySpaceKeyDrawable(
+ int height, int leftPadding, int topPadding, int rightPadding, int bottomPadding,
+ int roundSize, int topColor, int bottomColor, int highlightColor, int shadowColor) {
+ super(leftPadding, topPadding, rightPadding, bottomPadding,
+ roundSize, topColor, bottomColor, highlightColor, shadowColor);
+ this.height = height;
+ }
+
+ @Override
+ protected void onBoundsChange(Rect bounds) {
+ if (height != UNLIMITED_HEIGHT && bounds.height() > height) {
+ int topPadding = (bounds.height() - height) / 2;
+ int bottomPadding = (bounds.height() - height) - topPadding;
+ bounds = new Rect(bounds.left, bounds.top + topPadding,
+ bounds.right, bounds.bottom - bottomPadding);
+ }
+ super.onBoundsChange(bounds);
+ }
+}
diff --git a/src/android/src/com/google/android/inputmethod/japanese/view/RoundRectKeyDrawable.java b/src/android/src/com/google/android/inputmethod/japanese/view/RoundRectKeyDrawable.java
index 49fe76c..81c4cab 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/view/RoundRectKeyDrawable.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/view/RoundRectKeyDrawable.java
@@ -34,6 +34,7 @@
import android.graphics.BlurMaskFilter;
import android.graphics.BlurMaskFilter.Blur;
import android.graphics.Canvas;
+import android.graphics.Color;
import android.graphics.LinearGradient;
import android.graphics.Paint;
import android.graphics.Paint.Style;
@@ -55,7 +56,7 @@
private final int bottomColor;
private final Paint basePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
- private final Paint shadowPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
+ private final Optional<Paint> shadowPaint;
private final Optional<Paint> highlightPaint;
private final RectF baseBound = new RectF();
@@ -69,10 +70,15 @@
this.topColor = topColor;
this.bottomColor = bottomColor;
- shadowPaint.setColor(shadowColor);
- shadowPaint.setStyle(Style.FILL);
- shadowPaint.setMaskFilter(new BlurMaskFilter(BLUR_SIZE, Blur.NORMAL));
- if ((highlightColor & 0xFF000000) != 0) {
+ if (Color.alpha(shadowColor) != 0) {
+ shadowPaint = Optional.of(new Paint(Paint.ANTI_ALIAS_FLAG));
+ shadowPaint.get().setColor(shadowColor);
+ shadowPaint.get().setStyle(Style.FILL);
+ shadowPaint.get().setMaskFilter(new BlurMaskFilter(BLUR_SIZE, Blur.NORMAL));
+ } else {
+ shadowPaint = Optional.absent();
+ }
+ if (Color.alpha(highlightColor) != 0) {
highlightPaint = Optional.of(new Paint(Paint.ANTI_ALIAS_FLAG));
highlightPaint.get().setColor(highlightColor);
} else {
@@ -87,7 +93,9 @@
}
// Each qwerty key looks round corner'ed rectangle.
- canvas.drawRoundRect(shadowBound, roundSize, roundSize, shadowPaint);
+ if (shadowPaint.isPresent()) {
+ canvas.drawRoundRect(shadowBound, roundSize, roundSize, shadowPaint.get());
+ }
canvas.drawRoundRect(baseBound, roundSize, roundSize, basePaint);
// Draw 1-px height highlight at the top of key if necessary.
diff --git a/src/android/src/com/google/android/inputmethod/japanese/view/Skin.java b/src/android/src/com/google/android/inputmethod/japanese/view/Skin.java
new file mode 100644
index 0000000..1e8fc74
--- /dev/null
+++ b/src/android/src/com/google/android/inputmethod/japanese/view/Skin.java
@@ -0,0 +1,336 @@
+// Copyright 2010-2014, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package org.mozc.android.inputmethod.japanese.view;
+
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Optional;
+import com.google.common.base.Preconditions;
+
+import android.content.res.Resources;
+import android.graphics.Color;
+import android.graphics.Paint;
+import android.graphics.Paint.Style;
+import android.graphics.drawable.Drawable;
+
+
+/**
+ * Skin data.
+ */
+public class Skin {
+
+ private static final Skin FALLBACK_INSTANCE = new Skin();
+
+ @VisibleForTesting static final int STYLE_CATEGORY_KEYICON_MAIN = 0;
+ @VisibleForTesting static final int STYLE_CATEGORY_KEYICON_GUIDE = 1;
+ @VisibleForTesting static final int STYLE_CATEGORY_KEYICON_GUIDE_LIGHT = 2;
+ @VisibleForTesting static final int STYLE_CATEGORY_KEYICON_MAIN_HIGHLIGHT = 3;
+ @VisibleForTesting static final int STYLE_CATEGORY_KEYICON_GUIDE_HIGHLIGHT = 4;
+ @VisibleForTesting static final int STYLE_CATEGORY_KEYICON_BOUND = 5;
+ @VisibleForTesting static final int STYLE_CATEGORY_KEYICON_TWELVEKEYS_FUNCTION = 6;
+ @VisibleForTesting static final int STYLE_CATEGORY_KEYICON_TWELVEKEYS_GLOBE = 7;
+ @VisibleForTesting static final int STYLE_CATEGORY_KEYICON_QWERTY_FUNCTION = 8;
+ @VisibleForTesting static final int STYLE_CATEGORY_KEYICON_FUNCTION_DARK = 9;
+ @VisibleForTesting static final int STYLE_CATEGORY_KEYICON_ENTER = 10;
+ @VisibleForTesting static final int STYLE_CATEGORY_KEYICON_ENTER_CIRCLE = 11;
+ @VisibleForTesting static final int STYLE_CATEGORY_KEYICON_QWERTY_SHIFT_ON_ARROW = 12;
+ @VisibleForTesting static final int STYLE_CATEGORY_KEYPOPUP_HIGHLIGHT = 13;
+ @VisibleForTesting static final int STYLE_CATEGORY_SYMBOL_MAJOR = 14;
+ @VisibleForTesting static final int STYLE_CATEGORY_SYMBOL_MAJOR_SELECTED = 15;
+ @VisibleForTesting static final int STYLE_CATEGORY_SYMBOL_MAJOR_EMOJI_DISABLE_CIRCLE = 16;
+ @VisibleForTesting static final int STYLE_CATEGORY_SYMBOL_MINOR = 17;
+ @VisibleForTesting static final int STYLE_CATEGORY_SYMBOL_MINOR_SELECTED = 18;
+ @VisibleForTesting
+ static final int STYLE_CATEGORY_KEYBOARD_FOLDING_BUTTON_BACKGROUND_DEFAULT = 19;
+ @VisibleForTesting
+ static final int STYLE_CATEGORY_KEYBOARD_FOLDING_BUTTON_BACKGROUND_SCROLLED = 20;
+
+ public int keyboardSeparatorColor;
+ public int twelvekeysLayoutReleasedKeyTopColor;
+ public int twelvekeysLayoutReleasedKeyBottomColor;
+ public int twelvekeysLayoutReleasedKeyHighlightColor;
+ public int twelvekeysLayoutReleasedKeyLightShadeColor;
+ public int twelvekeysLayoutReleasedKeyDarkShadeColor;
+ public int twelvekeysLayoutReleasedKeyShadowColor;
+
+ public int twelvekeysLayoutPressedKeyTopColor;
+ public int twelvekeysLayoutPressedKeyBottomColor;
+ public int twelvekeysLayoutPressedKeyHighlightColor;
+ public int twelvekeysLayoutPressedKeyLightShadeColor;
+ public int twelvekeysLayoutPressedKeyDarkShadeColor;
+ public int twelvekeysLayoutPressedKeyShadowColor;
+
+ public int twelvekeysLayoutReleasedFunctionKeyTopColor;
+ public int twelvekeysLayoutReleasedFunctionKeyBottomColor;
+ public int twelvekeysLayoutReleasedFunctionKeyHighlightColor;
+ public int twelvekeysLayoutReleasedFunctionKeyLightShadeColor;
+ public int twelvekeysLayoutReleasedFunctionKeyDarkShadeColor;
+ public int twelvekeysLayoutReleasedFunctionKeyShadowColor;
+
+ public int twelvekeysLayoutPressedFunctionKeyTopColor;
+ public int twelvekeysLayoutPressedFunctionKeyBottomColor;
+ public int twelvekeysLayoutPressedFunctionKeyHighlightColor;
+ public int twelvekeysLayoutPressedFunctionKeyLightShadeColor;
+ public int twelvekeysLayoutPressedFunctionKeyDarkShadeColor;
+ public int twelvekeysLayoutPressedFunctionKeyShadowColor;
+
+ public int qwertyLayoutReleasedKeyTopColor;
+ public int qwertyLayoutReleasedKeyBottomColor;
+ public int qwertyLayoutReleasedKeyHighlightColor;
+ public int qwertyLayoutReleasedKeyShadowColor;
+
+ public int qwertyLayoutPressedKeyTopColor;
+ public int qwertyLayoutPressedKeyBottomColor;
+ public int qwertyLayoutPressedKeyHighlightColor;
+ public int qwertyLayoutPressedKeyShadowColor;
+
+ public int qwertyLayoutReleasedFunctionKeyTopColor;
+ public int qwertyLayoutReleasedFunctionKeyBottomColor;
+ public int qwertyLayoutReleasedFunctionKeyHighlightColor;
+ public int qwertyLayoutReleasedFunctionKeyShadowColor;
+
+ public int qwertyLayoutPressedFunctionKeyTopColor;
+ public int qwertyLayoutPressedFunctionKeyBottomColor;
+ public int qwertyLayoutPressedFunctionKeyHighlightColor;
+ public int qwertyLayoutPressedFunctionKeyShadowColor;
+
+ public int qwertyLayoutReleasedSpaceKeyTopColor;
+ public int qwertyLayoutReleasedSpaceKeyBottomColor;
+ public int qwertyLayoutReleasedSpaceKeyHighlightColor;
+ public int qwertyLayoutReleasedSpaceKeyShadowColor;
+
+ public int qwertyLayoutPressedSpaceKeyTopColor;
+ public int qwertyLayoutPressedSpaceKeyBottomColor;
+ public int qwertyLayoutPressedSpaceKeyHighlightColor;
+ public int qwertyLayoutPressedSpaceKeyShadowColor;
+
+ public int flickBaseColor;
+ public int flickShadeColor;
+
+ public int popupFrameWindowTopColor;
+ public int popupFrameWindowBottomColor;
+ public int popupFrameWindowShadowColor;
+
+ public int candidateScrollBarTopColor;
+ public int candidateScrollBarBottomColor;
+ public int candidateBackgroundTopColor;
+ public int candidateBackgroundBottomColor;
+ public int candidateBackgroundSeparatorColor;
+ public int candidateBackgroundHighlightColor;
+ public int candidateBackgroundBorderColor;
+ public int candidateBackgroundFocusedTopColor;
+ public int candidateBackgroundFocusedBottomColor;
+ public int candidateBackgroundFocusedShadowColor;
+
+ public int symbolReleasedFunctionKeyTopColor;
+ public int symbolReleasedFunctionKeyBottomColor;
+ public int symbolReleasedFunctionKeyHighlightColor;
+ public int symbolReleasedFunctionKeyShadowColor;
+
+ public int symbolPressedFunctionKeyTopColor;
+ public int symbolPressedFunctionKeyBottomColor;
+ public int symbolPressedFunctionKeyHighlightColor;
+ public int symbolPressedFunctionKeyShadowColor;
+
+ public int symbolScrollBarTopColor;
+ public int symbolScrollBarBottomColor;
+
+ public int symbolMinorCategoryTabSelectedColor;
+ public int symbolMinorCategoryTabPressedColor;
+
+ public int symbolCandidateBackgroundTopColor;
+ public int symbolCandidateBackgroundBottomColor;
+ public int symbolCandidateBackgroundHighlightColor;
+ public int symbolCandidateBackgroundBorderColor;
+ public int symbolCandidateBackgroundSeparatorColor;
+ public int symbolMinorCategoryVerticalSeparatorColor;
+ public int symbolSeparatorColor;
+
+ public int threeDotsColor;
+
+ public int keyIconMainColor;
+ public int keyIconGuideColor;
+ public int keyIconGuideLightColor;
+ public int keyIconMainHighlightColor;
+ public int keyIconGuideHighlightColor;
+ public int keyIconBoundColor;
+ public int keyIconTwelvekeysFunctionColor;
+ public int keyIconTwelvekeysGlobeColor;
+ public int keyIconQwertyFunctionColor;
+ public int keyIconFunctionDarkColor;
+ public int keyIconEnterColor;
+ public int keyIconEnterCircleColor;
+ public int keyIconQwertyShiftOnArrowColor;
+ public int keyPopupHighlightColor;
+ public int symbolMajorColor;
+ public int symbolMajorSelectedColor;
+ public int symbolMinorColor;
+ public int symbolMinorSelectedColor;
+ public int symbolMajorButtonTopColor;
+ public int symbolMajorButtonBottomColor;
+ public int symbolMajorButtonPressedTopColor;
+ public int symbolMajorButtonPressedBottomColor;
+ public int symbolMajorButtonSelectedTopColor;
+ public int symbolMajorButtonSelectedBottomColor;
+ public int symbolMajorButtonShadowColor;
+ public int keyboardFoldingButtonBackgroundDefaultColor;
+ public int keyboardFoldingButtonBackgroundScrolledColor;
+ public int candidateValueTextColor = Color.BLACK;
+ public int candidateValueFocusedTextColor = Color.BLACK;
+ public int candidateDescriptionTextColor = Color.GRAY;
+ public int buttonFrameButtonPressedColor;
+
+ public float twelvekeysLeftOffsetDimension;
+ public float twelvekeysRightOffsetDimension;
+ public float twelvekeysTopOffsetDimension;
+ public float twelvekeysBottomOffsetDimension;
+ public float qwertyLeftOffsetDimension;
+ public float qwertyRightOffsetDimension;
+ public float qwertyTopOffsetDimension;
+ public float qwertyBottomOffsetDimension;
+ public float qwertyRoundRadiusDimension;
+ public float qwertySpaceKeyHeightDimension;
+ public float qwertySpaceKeyHorizontalOffsetDimension;
+ public float qwertySpaceKeyRoundRadiusDimension;
+ public float symbolMajorButtonRoundDimension;
+ public float symbolMajorButtonPaddingDimension;
+ public float symbolMinorIndicatorHeightDimension;
+
+ public Drawable buttonFrameBackgroundDrawable = DummyDrawable.getInstance();
+ public Drawable narrowFrameBackgroundDrawable = DummyDrawable.getInstance();
+ public Drawable keyboardFrameSeparatorBackgroundDrawable = DummyDrawable.getInstance();
+ public Drawable symbolSeparatorAboveMajorCategoryBackgroundDrawable = DummyDrawable.getInstance();
+ public Drawable windowBackgroundDrawable = DummyDrawable.getInstance();
+ public Drawable conversionCandidateViewBackgroundDrawable = DummyDrawable.getInstance();
+ public Drawable symbolCandidateViewBackgroundDrawable = DummyDrawable.getInstance();
+ public Drawable symbolMajorCategoryBackgroundDrawable = DummyDrawable.getInstance();
+ public Drawable scrollBarBackgroundDrawable = DummyDrawable.getInstance();
+
+ private Optional<MozcDrawableFactory> drawableFactory = Optional.absent();
+
+ public static Skin getFallbackInstance() {
+ return FALLBACK_INSTANCE;
+ }
+
+ public void apply(Paint paint, int category) {
+ Preconditions.checkNotNull(paint);
+
+ // At the moment, caller has responsibility to reset paint.
+ // TODO(matsuzakit): move all style based logic from MozcDrawableFactory to here.
+ paint.setStyle(Style.FILL);
+ switch (category) {
+ case STYLE_CATEGORY_KEYICON_MAIN:
+ paint.setColor(keyIconMainColor);
+ break;
+ case STYLE_CATEGORY_KEYICON_GUIDE:
+ paint.setColor(keyIconGuideColor);
+ break;
+ case STYLE_CATEGORY_KEYICON_GUIDE_LIGHT:
+ paint.setColor(keyIconGuideLightColor);
+ break;
+ case STYLE_CATEGORY_KEYICON_MAIN_HIGHLIGHT:
+ paint.setColor(keyIconMainHighlightColor);
+ break;
+ case STYLE_CATEGORY_KEYICON_GUIDE_HIGHLIGHT:
+ paint.setColor(keyIconGuideHighlightColor);
+ break;
+ case STYLE_CATEGORY_KEYICON_BOUND:
+ paint.setColor(keyIconBoundColor);
+ paint.setStyle(Style.STROKE);
+ break;
+ case STYLE_CATEGORY_KEYICON_TWELVEKEYS_FUNCTION:
+ paint.setColor(keyIconTwelvekeysFunctionColor);
+ break;
+ case STYLE_CATEGORY_KEYICON_TWELVEKEYS_GLOBE:
+ paint.setColor(keyIconTwelvekeysGlobeColor);
+ break;
+ case STYLE_CATEGORY_KEYICON_QWERTY_FUNCTION:
+ paint.setColor(keyIconQwertyFunctionColor);
+ break;
+ case STYLE_CATEGORY_KEYICON_FUNCTION_DARK:
+ paint.setColor(keyIconFunctionDarkColor);
+ break;
+ case STYLE_CATEGORY_KEYICON_ENTER:
+ paint.setColor(keyIconEnterColor);
+ break;
+ case STYLE_CATEGORY_KEYICON_ENTER_CIRCLE:
+ paint.setColor(keyIconEnterCircleColor);
+ break;
+ case STYLE_CATEGORY_KEYICON_QWERTY_SHIFT_ON_ARROW:
+ paint.setColor(keyIconQwertyShiftOnArrowColor);
+ break;
+ case STYLE_CATEGORY_KEYPOPUP_HIGHLIGHT:
+ paint.setColor(keyPopupHighlightColor);
+ break;
+ case STYLE_CATEGORY_SYMBOL_MAJOR:
+ paint.setColor(symbolMajorColor);
+ break;
+ case STYLE_CATEGORY_SYMBOL_MAJOR_SELECTED:
+ paint.setColor(symbolMajorSelectedColor);
+ break;
+ case STYLE_CATEGORY_SYMBOL_MAJOR_EMOJI_DISABLE_CIRCLE:
+ paint.setStyle(Style.STROKE);
+ paint.setColor(symbolMajorColor);
+ paint.setStrokeWidth(0.75f);
+ paint.setStrokeMiter(10);
+ break;
+ case STYLE_CATEGORY_SYMBOL_MINOR:
+ paint.setColor(symbolMinorColor);
+ break;
+ case STYLE_CATEGORY_SYMBOL_MINOR_SELECTED:
+ paint.setColor(symbolMinorSelectedColor);
+ break;
+ case STYLE_CATEGORY_KEYBOARD_FOLDING_BUTTON_BACKGROUND_DEFAULT:
+ paint.setColor(keyboardFoldingButtonBackgroundDefaultColor);
+ break;
+ case STYLE_CATEGORY_KEYBOARD_FOLDING_BUTTON_BACKGROUND_SCROLLED:
+ paint.setColor(keyboardFoldingButtonBackgroundScrolledColor);
+ break;
+ default:
+ throw new IllegalStateException("Unknown category: " + category);
+ }
+ }
+
+ public Drawable getDrawable(Resources resources, int resourceId) {
+ Preconditions.checkNotNull(resources);
+ return getDrawableFactory(resources).getDrawable(resourceId).or(DummyDrawable.getInstance());
+ }
+
+ private MozcDrawableFactory getDrawableFactory(Resources resources) {
+ if (!drawableFactory.isPresent()) {
+ drawableFactory = Optional.of(new MozcDrawableFactory(resources, this));
+ }
+ return drawableFactory.get();
+ }
+
+ @VisibleForTesting
+ void resetDrawableFactory() {
+ drawableFactory = Optional.absent();
+ }
+}
diff --git a/src/android/src/com/google/android/inputmethod/japanese/view/SkinParser.java b/src/android/src/com/google/android/inputmethod/japanese/view/SkinParser.java
new file mode 100644
index 0000000..4758e4d
--- /dev/null
+++ b/src/android/src/com/google/android/inputmethod/japanese/view/SkinParser.java
@@ -0,0 +1,229 @@
+// Copyright 2010-2014, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package org.mozc.android.inputmethod.japanese.view;
+
+import org.mozc.android.inputmethod.japanese.resources.R;
+import org.mozc.android.inputmethod.japanese.util.ParserUtil;
+import com.google.common.base.Preconditions;
+import com.google.common.collect.Maps;
+
+import android.content.res.Resources;
+import android.content.res.TypedArray;
+import android.content.res.XmlResourceParser;
+import android.graphics.drawable.Drawable;
+import android.util.AttributeSet;
+import android.util.Xml;
+
+import org.xmlpull.v1.XmlPullParser;
+import org.xmlpull.v1.XmlPullParserException;
+
+import java.io.IOException;
+import java.lang.reflect.Field;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Map;
+
+/**
+ * Parses .xml file for skin and generates {@code Skin} instance.
+ */
+public class SkinParser {
+
+ static class SkinParserException extends Exception {
+
+ public SkinParserException(XmlPullParser parser, Throwable throwable) {
+ super(composeMessage(parser, throwable.getLocalizedMessage()), throwable);
+ }
+
+ public SkinParserException(XmlPullParser parser, String detailMessage) {
+ super(composeMessage(parser, detailMessage));
+ }
+
+ private static String composeMessage(XmlPullParser parser, String message) {
+ return new StringBuffer(parser.getPositionDescription())
+ .append(':').append(message).toString();
+ }
+ }
+
+ private final XmlResourceParser parser;
+ private final Resources resources;
+
+ private static final int[] COLOR_ATTRIBUTES = {
+ android.R.attr.name,
+ android.R.attr.color,
+ };
+ static {
+ Arrays.sort(COLOR_ATTRIBUTES);
+ }
+ private static final int COLOR_KEY_NAME_INDEX =
+ Arrays.binarySearch(COLOR_ATTRIBUTES, android.R.attr.name);
+ private static final int COLOR_KEY_COLOR_INDEX =
+ Arrays.binarySearch(COLOR_ATTRIBUTES, android.R.attr.color);
+
+ private static final int[] DRAWABLE_ATTRIBUTES = {
+ android.R.attr.name,
+ };
+ private static final int DRAWABLE_KEY_NAME_INDEX =
+ Arrays.binarySearch(DRAWABLE_ATTRIBUTES, android.R.attr.name);
+
+ private static final int[] DIMENSION_ATTRIBUTES = {
+ android.R.attr.name,
+ R.attr.dimension,
+ };
+ static {
+ Arrays.sort(DIMENSION_ATTRIBUTES);
+ }
+ private static final int DIMENSION_KEY_NAME_INDEX =
+ Arrays.binarySearch(DIMENSION_ATTRIBUTES, android.R.attr.name);
+ private static final int DIMENSION_KEY_DIMENSION_INDEX =
+ Arrays.binarySearch(DIMENSION_ATTRIBUTES, R.attr.dimension);
+
+ public SkinParser(Resources resources, XmlResourceParser parser) {
+ this.resources = Preconditions.checkNotNull(resources);
+ this.parser = Preconditions.checkNotNull(parser);
+ }
+
+ private static final Map<String, Field> fieldMap;
+ static {
+ Map<String, Field> tempMap = Maps.newHashMapWithExpectedSize(Skin.class.getFields().length);
+ for (Field field : Skin.class.getFields()) {
+ tempMap.put(field.getName(), field);
+ }
+ fieldMap = Collections.unmodifiableMap(tempMap);
+ }
+
+ public Skin parseSkin() throws SkinParserException {
+ XmlResourceParser parser = this.parser;
+ Skin skin = new Skin();
+ AttributeSet attributeSet = Xml.asAttributeSet(parser);
+
+ try {
+ // Initial two events should be START_DOCUMENT and then START_TAG.
+ parser.next();
+ ParserUtil.assertStartDocument(parser);
+ parser.nextTag();
+ if (!"Skin".equals(parser.getName())) {
+ throw new SkinParserException(parser,
+ "<Skin> element is expected but met <" + parser.getName() + ">");
+ }
+
+ while (parser.nextTag() == XmlResourceParser.START_TAG) {
+ String tagName = parser.getName();
+ if ("Color".equals(tagName)) {
+ TypedArray attributes = resources.obtainAttributes(parser, COLOR_ATTRIBUTES);
+ try {
+ String name = attributes.getString(COLOR_KEY_NAME_INDEX);
+ if (name == null) {
+ throw new SkinParserException(parser,
+ "<Color> element's \"name\" attribute is mandatory.");
+ }
+ int color = attributes.getColor(COLOR_KEY_COLOR_INDEX, 0);
+ Field field = fieldMap.get(name);
+ if (field == null) {
+ throw new SkinParserException(parser, name + " is undefined field.");
+ }
+ field.setInt(skin, color);
+ if (parser.nextTag() != XmlResourceParser.END_TAG) {
+ throw new SkinParserException(parser, "</Color> is expected but not found.");
+ }
+ } finally {
+ attributes.recycle();
+ }
+ continue;
+ }
+ if ("Drawable".equals(tagName)) {
+ TypedArray attributes = resources.obtainAttributes(parser, DRAWABLE_ATTRIBUTES);
+ try {
+ String name = attributes.getString(DRAWABLE_KEY_NAME_INDEX);
+ if (name == null) {
+ throw new SkinParserException(parser,
+ "<Drawable> element's \"name\" attribute is mandatory.");
+ }
+ // Go forward to inner drawable tag.
+ if (parser.nextTag() != XmlResourceParser.START_TAG) {
+ throw new SkinParserException(parser, "Start tag for drawable is expected.");
+ }
+ Drawable drawable = Drawable.createFromXmlInner(resources, parser, attributeSet);
+ if (drawable == null) {
+ throw new SkinParserException(parser, "Invalid drawable.");
+ }
+ if (parser.nextTag() != XmlResourceParser.END_TAG) {
+ throw new SkinParserException(parser, "End tag for drawable is expected.");
+ }
+ Field field = fieldMap.get(name);
+ if (field == null) {
+ throw new SkinParserException(parser, name + " is undefined field.");
+ }
+ field.set(skin, drawable);
+ if (parser.nextTag() != XmlResourceParser.END_TAG) { // Skip end tag.
+ throw new SkinParserException(parser, "</Drawable> is expected but not found.");
+ }
+ } finally {
+ attributes.recycle();
+ }
+ continue;
+ }
+ if ("Dimension".equals(tagName)) {
+ TypedArray attributes = resources.obtainAttributes(parser, DIMENSION_ATTRIBUTES);
+ try {
+ String name = attributes.getString(DIMENSION_KEY_NAME_INDEX);
+ if (name == null) {
+ throw new SkinParserException(parser,
+ "<Dimension> element's \"name\" attribute is mandatory.");
+ }
+ float dimension = attributes.getDimension(DIMENSION_KEY_DIMENSION_INDEX, 0);
+ Field field = fieldMap.get(name);
+ if (field == null) {
+ throw new SkinParserException(parser, name + " is undefined field.");
+ }
+ field.setFloat(skin, dimension);
+ if (parser.nextTag() != XmlResourceParser.END_TAG) {
+ throw new SkinParserException(parser, "</Dimension> is expected but not found.");
+ }
+ } finally {
+ attributes.recycle();
+ }
+ continue;
+ }
+ throw new SkinParserException(parser, "Unexpected <" + tagName + "> is found.");
+ }
+ parser.next();
+ ParserUtil.assertEndDocument(parser);
+ } catch (IllegalAccessException e) {
+ throw new SkinParserException(parser, e);
+ } catch (IllegalArgumentException e) {
+ throw new SkinParserException(parser, e);
+ } catch (XmlPullParserException e) {
+ throw new SkinParserException(parser, e);
+ } catch (IOException e) {
+ throw new SkinParserException(parser, e);
+ }
+ return skin;
+ }
+}
diff --git a/src/android/src/com/google/android/inputmethod/japanese/view/SkinType.java b/src/android/src/com/google/android/inputmethod/japanese/view/SkinType.java
index 8919ea2..8f27307 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/view/SkinType.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/view/SkinType.java
@@ -29,765 +29,48 @@
package org.mozc.android.inputmethod.japanese.view;
+import org.mozc.android.inputmethod.japanese.MozcLog;
import org.mozc.android.inputmethod.japanese.resources.R;
+import org.mozc.android.inputmethod.japanese.view.SkinParser.SkinParserException;
+import com.google.common.base.Optional;
import com.google.common.base.Preconditions;
-import android.graphics.Paint;
-import android.graphics.Paint.Style;
+import android.content.res.Resources;
/**
* Type of skins.
*/
public enum SkinType {
- ORANGE_LIGHTGRAY(
- // 12keys layout regular released key config.
- 0xFFF5F5F5, 0xFFD2D2D2, 0xFFFAFAFA, 0xFFAFAFAF, 0xFF909090, 0xFF1E1E1E,
- // 12keys layout regular pressed key config.
- 0xFFAAAAAA, 0xFF828282, 0, 0, 0, 0,
-
- // 12keys layout function released key config.
- 0xFF858087, 0xFF67645F, 0xFF898588, 0xFF5C5759, 0xFF555555, 0xFF1E1E1E,
-
- // 12keys layout regular pressed key config.
- 0xFFBFBFBD, 0xFFF7F5EC, 0, 0, 0, 0,
-
- // Qwerty layout regular released key config.
- 0xFFF5F5F5, 0xFFD2D2D2, 0, 0xFF1E1E1E,
-
- // Qwerty layout regular pressed key config.
- 0xFFCCCCCC, 0xFF797979, 0, 0xFF1E1E1E,
-
- // Qwerty layout function released key config.
- 0xFF858087, 0xFF67645F, 0, 0xFF1E1E1E,
-
- // Qwerty layout function pressed key config.
- 0xFFE9E4E4, 0xFFB2ADAD, 0, 0xFF1E1E1E,
-
- // Flick color config.
- // According to the original design mock, the base color is orange for now.
- // The shade is 25% alpha-black. The following value is offline-calculated to mix base color.
- 0xFFFF9A28, 0xFFC0741e,
-
- // Qwerty light on/off sign config.
- 0xFFFFCC00, 0xFFFF9900, 0xFFFF9966, 0xFF333333, 0xFF333333, 0xFF000000,
-
- // Qwerty round coner radius.
- 3.5f,
-
- // Framed popup window config.
- 0xFFFFB53A, 0xFFFF7A25, 0xFF793D00, 0xFFFFFFFF, 0,
-
- // Candidate scroll indicator config.
- 0xFFFFE39D, 0xFFFFCC33,
-
- // Candidate background config.
- 0xFFE8E8E8, 0xFFDCDCDC, 0xFFFFFFFF, 0xFF8C8C8C,
-
- // Candidate focused background config.
- 0xFFFFC142, 0xFFFFe096, 0x40000000,
-
- // Symbol function released key config.
- 0xFF858087, 0xFF67645F, 0, 0xFF1E1E1E,
-
- // Symbol function pressed key config.
- 0xFFE9E4E4, 0xFFB2ADAD, 0, 0xFF1E1E1E,
-
- // Symbol scroll indicator config.
- 0xFFFFCC00, 0xFFFF9C00,
-
- // Symbol minor category tab config.
- 0xFFFF9200, 0x80FF9200,
-
- // Symbol candidate background config.
- 0xFFFEFEFE, 0xFFECECEC, 0xFFFFFFFF, 0x7C666666,
-
- // Three dots
- 0xFFDDDDDD,
-
- // Window background resource.
- R.drawable.window__background) {
- @Override
- public void apply(Paint paint, int category) {
- Preconditions.checkNotNull(paint);
-
- // At the moment, caller has responsibility to reset paint.
- // TODO(hidehiko): move all style based logic from MozcDrawableFactory to here.
- switch (category) {
- case STYLE_CATEGORY_KEYICON_MAIN:
- case STYLE_CATEGORY_KEYICON_FUNCTION_DARK:
- case STYLE_CATEGORY_KEYICON_POPUP_FUNCTION:
- paint.setStyle(Style.FILL);
- paint.setColor(0xFF272727);
- break;
- case STYLE_CATEGORY_KEYICON_POPUP_FUNCTION_DARK:
- paint.setStyle(Style.FILL);
- paint.setColor(0xFFFFFFFF);
- paint.setShadowLayer(0.5f, 0.f, -1.f, 0xFF404040);
- break;
- case STYLE_CATEGORY_KEYICON_GUIDE:
- case STYLE_CATEGORY_SYMBOL_MAJOR:
- paint.setStyle(Style.FILL);
- paint.setColor(0xFF333333);
- break;
- case STYLE_CATEGORY_KEYICON_GUIDE_LIGHT:
- paint.setStyle(Style.FILL);
- paint.setColor(0xFF999999);
- break;
- case STYLE_CATEGORY_KEYICON_MAIN_HIGHLIGHT:
- case STYLE_CATEGORY_KEYICON_GUIDE_HIGHLIGHT:
- case STYLE_CATEGORY_SYMBOL_MAJOR_SELECTED:
- case STYLE_CATEGORY_SYMBOL_MINOR:
- paint.setStyle(Style.FILL);
- paint.setColor(0xFFFFFFFF);
- break;
- case STYLE_CATEGORY_KEYICON_BOUND:
- paint.setStyle(Style.STROKE);
- paint.setColor(0xFFCCCCCC);
- break;
- case STYLE_CATEGORY_KEYICON_FUNCTION:
- paint.setStyle(Style.FILL);
- paint.setColor(0xFFDDDDDD);
- paint.setShadowLayer(2.f, 0.f, -1.f, 0xFF404040);
- break;
- case SkinType.STYLE_CATEGORY_KEYICON_QWERTY_SHIFT_ON_ARROW:
- paint.setStyle(Style.FILL);
- paint.setColor(0xFFFFB005);
- paint.setShadowLayer(2.f, 0.f, -1.f, 0xFF404040);
- break;
- case SkinType.STYLE_CATEGORY_KEYICON_QWERTY_CAPS_ON_ARROW:
- paint.setStyle(Style.FILL);
- paint.setColor(0xFFC1F300);
- paint.setShadowLayer(2.f, 0.f, -1.f, 0xFF404040);
- break;
- case STYLE_CATEGORY_KEYPOPUP_HIGHLIGHT:
- paint.setStyle(Style.FILL);
- paint.setColor(0xFFF7982d);
- break;
- case STYLE_CATEGORY_SYMBOL_MINOR_SELECTED:
- paint.setStyle(Style.FILL);
- paint.setColor(0xFFFF9a28);
- break;
- case STYLE_CATEGORY_KEYBOARD_FOLDING_BUTTON_BACKGROUND:
- paint.setStyle(Style.FILL);
- paint.setColor(0x8C676767);
- break;
- default:
- throw new IllegalStateException("Unknown category: " + category);
- }
- }
- },
-
- BLUE_LIGHTGRAY(
- // 12keys layout regular released key config.
- 0xFFF5F5F5, 0xFFD2D2D2, 0xFFFAFAFA, 0xFFAFAFAF, 0xFF909090, 0xFF1E1E1E,
-
- // 12keys layout regular pressed key config.
- 0xFFAAAAAA, 0xFF828282, 0, 0, 0, 0,
-
- // 12keys layout function released key config.
- 0xFF858087, 0xFF67645F, 0xFF898588, 0xFF5C5759, 0xFF555555, 0xFF1E1E1E,
-
- // 12keys layout regular pressed key config.
- 0xFFBFBFBD, 0xFFF7F5EC, 0, 0, 0, 0,
-
- // Qwerty layout regular released key config.
- 0xFFF5F5F5, 0xFFD2D2D2, 0, 0xFF1E1E1E,
-
- // Qwerty layout regular pressed key config.
- 0xFFCCCCCC, 0xFF797979, 0, 0xFF1E1E1E,
-
- // Qwerty layout function released key config.
- 0xFF858087, 0xFF67645F, 0, 0xFF1E1E1E,
-
- // Qwerty layout function pressed key config.
- 0xFFE9E4E4, 0xFFB2ADAD, 0, 0xFF1E1E1E,
-
- // Flick color config.
- // According to the original design mock, the base color is orange for now.
- // The shade is 25% alpha-black. The following value is offline-calculated to mix base color.
- 0xFF55C6EE, 0xFF3F94B2,
-
- // Qwerty light on/off sign config.
- 0xFF73DAF7, 0xFF3393E5, 0xFF53B6EE, 0xFF333333, 0xFF333333, 0xFF000000,
-
- // Qwerty round coner radius.
- 3.5f,
-
- // Framed popup window config.
- 0xFFFBFBFB, 0xFFEAEAEA, 0, 0, 0xFF1E1E1E,
-
- // Candidate scroll indicator config.
- 0xFF73DAF7, 0xFF3393E5,
-
- // Candidate background config.
- 0xFFE8E8E8, 0xFFDCDCDC, 0xFFFFFFFF, 0xFF8C8C8C,
-
- // Candidate focused background config.
- 0xFFA5DDF6, 0xFFC1E9F5, 0x40000000,
-
- // Symbol function released key config.
- 0xFF858087, 0xFF67645F, 0, 0xFF1E1E1E,
-
- // Symbol function pressed key config.
- 0xFFE9E4E4, 0xFFB2ADAD, 0, 0xFF1E1E1E,
-
- // Symbol scroll indicator config.
- 0xFF73DAF7, 0xFF53B6EE,
-
- // Symbol minor category tab config.
- 0xFF33B5E5, 0x8033B5E5,
-
- // Symbol candidate background config.
- 0xFFFEFEFE, 0xFFECECEC, 0xFFFFFFFF, 0x7C666666,
-
- // Three dots
- 0xFFDDDDDD,
-
- // Window background resource.
- R.drawable.window__background) {
- @Override
- public void apply(Paint paint, int category) {
- Preconditions.checkNotNull(paint);
-
- // At the moment, caller has responsibility to reset paint.
- // TODO(hidehiko): move all style based logic from MozcDrawableFactory to here.
- switch (category) {
- case STYLE_CATEGORY_KEYICON_MAIN:
- case STYLE_CATEGORY_KEYICON_FUNCTION_DARK:
- case STYLE_CATEGORY_KEYICON_POPUP_FUNCTION:
- paint.setStyle(Style.FILL);
- paint.setColor(0xFF272727);
- break;
- case STYLE_CATEGORY_KEYICON_POPUP_FUNCTION_DARK:
- paint.setStyle(Style.FILL);
- paint.setColor(0xFFFFFFFF);
- paint.setShadowLayer(0.5f, 0.f, -1.f, 0xFF404040);
- break;
- case STYLE_CATEGORY_KEYICON_GUIDE:
- case STYLE_CATEGORY_SYMBOL_MAJOR:
- paint.setStyle(Style.FILL);
- paint.setColor(0xFF333333);
- break;
- case STYLE_CATEGORY_KEYICON_GUIDE_LIGHT:
- paint.setStyle(Style.FILL);
- paint.setColor(0xFF999999);
- break;
- case STYLE_CATEGORY_KEYICON_MAIN_HIGHLIGHT:
- case STYLE_CATEGORY_KEYICON_GUIDE_HIGHLIGHT:
- case STYLE_CATEGORY_SYMBOL_MAJOR_SELECTED:
- case STYLE_CATEGORY_SYMBOL_MINOR:
- paint.setStyle(Style.FILL);
- paint.setColor(0xFFFFFFFF);
- break;
- case STYLE_CATEGORY_KEYICON_BOUND:
- paint.setStyle(Style.STROKE);
- paint.setColor(0xFFCCCCCC);
- break;
- case STYLE_CATEGORY_KEYICON_FUNCTION:
- paint.setStyle(Style.FILL);
- paint.setColor(0xFFDDDDDD);
- paint.setShadowLayer(2.f, 0.f, -1.f, 0xFF404040);
- break;
- case SkinType.STYLE_CATEGORY_KEYICON_QWERTY_SHIFT_ON_ARROW:
- paint.setStyle(Style.FILL);
- paint.setColor(0xFF55C6EE);
- paint.setShadowLayer(2.f, 0.f, -1.f, 0xFF404040);
- break;
- case SkinType.STYLE_CATEGORY_KEYICON_QWERTY_CAPS_ON_ARROW:
- paint.setStyle(Style.FILL);
- paint.setColor(0xFFC1F300);
- paint.setShadowLayer(2.f, 0.f, -1.f, 0xFF404040);
- break;
- case STYLE_CATEGORY_KEYPOPUP_HIGHLIGHT:
- paint.setStyle(Style.FILL);
- paint.setColor(0xFF57B8E5);
- break;
- case STYLE_CATEGORY_SYMBOL_MINOR_SELECTED:
- paint.setStyle(Style.FILL);
- paint.setColor(0xFF63CFFF);
- break;
- case STYLE_CATEGORY_KEYBOARD_FOLDING_BUTTON_BACKGROUND:
- paint.setStyle(Style.FILL);
- paint.setColor(0x8C676767);
- break;
- default:
- throw new IllegalStateException("Unknown category: " + category);
- }
- }
- },
-
- BLUE_DARKGRAY(
- // 12keys layout regular released key config.
- 0xFF656565, 0xFF656565, 0xFF8E8E8E, 0xFF535353, 0xFF535353, 0xFF1E1E1E,
-
- // 12keys layout regular pressed key config.
- 0xFFAAAAAA, 0xFF828282, 0, 0, 0, 0,
-
- // 12keys layout function released key config.
- 0xFF222222, 0xFF222222, 0xFF535353, 0xFF000000, 0xFF000000, 0xFF1E1E1E,
-
- // 12keys layout function pressed key config.
- 0xFF066696, 0xDD066696, 0, 0, 0, 0,
-
- // Qwerty layout regular released key config.
- 0xFF656565, 0xFF656565, 0xFF8E8E8E, 0xFF1E1E1E,
-
- // Qwerty layout regular pressed key config.
- 0xFF066696, 0xDD066696, 0, 0xFF1E1E1E,
-
- // Qwerty layout function released key config.
- 0xFF222222, 0xFF222222, 0xFF535353, 0xFF1E1E1E,
-
- // Qwerty layout function pressed key config.
- 0xFF066696, 0xDD066696, 0, 0xFF1E1E1E,
-
- // Flick color config.
- // According to the original design mock, the base color is orange for now.
- // The shade is 25% alpha-black. The following value is offline-calculated to mix base color.
- 0xFF1B78A3, 0xFF145A7A,
-
- // Qwerty light on/off sign config.
- 0xFF73DAF7, 0xFF3393E5, 0xFF53B6EE, 0xFF333333, 0xFF333333, 0xFF000000,
-
- // Qwerty round corner radius.
- 2.0f,
-
- // Framed popup window config.
- 0xFF066696, 0xDD066696, 0, 0, 0xFF1E1E1E,
-
- // Candidate scroll indicator config.
- 0xFF73DAF7, 0xFF3393E5,
-
- // Candidate background config.
- 0xFFE8E8E8, 0xFFDCDCDC, 0xFFFFFFFF, 0xFF8C8C8C,
-
- // Candidate focused background config.
- 0xFFA5DDF6, 0xFFC1E9F5, 0x40000000,
-
- // Symbol function released key config.
- 0xFF656565, 0xFF656565, 0xFF8E8E8E, 0xFF1E1E1E,
-
- // Symbol function pressed key config.
- 0xFF066696, 0xDD066696, 0, 0xFF1E1E1E,
-
- // Symbol scroll indicator config.
- 0xFF73DAF7, 0xFF53B6EE,
-
- // Symbol minor category tab config.
- 0xFF33B5E5, 0x8033B5E5,
-
- // Symbol candidate background config.
- 0xFFFEFEFE, 0xFFECECEC, 0xFFFFFFFF, 0x7C666666,
-
- // Three dots
- 0xFFF7F7F7,
-
- // Window background resource.
- R.drawable.window_background_black) {
- @Override
- public void apply(Paint paint, int category) {
- Preconditions.checkNotNull(paint);
-
- // At the moment, caller has responsibility to reset paint.
- // TODO(hidehiko): move all style based logic from MozcDrawableFactory to here.
- switch (category) {
- case STYLE_CATEGORY_KEYICON_MAIN:
- case STYLE_CATEGORY_KEYICON_POPUP_FUNCTION:
- paint.setStyle(Style.FILL);
- paint.setColor(0xFFFFFFFF);
- break;
- case STYLE_CATEGORY_KEYICON_FUNCTION_DARK:
- paint.setStyle(Style.FILL);
- paint.setColor(0xFF868686);
- break;
- case STYLE_CATEGORY_KEYICON_GUIDE:
- paint.setStyle(Style.FILL);
- paint.setColor(0xFFBEBEBE);
- break;
- case STYLE_CATEGORY_KEYICON_GUIDE_LIGHT:
- paint.setStyle(Style.FILL);
- paint.setColor(0xFF999999);
- break;
- case STYLE_CATEGORY_KEYICON_MAIN_HIGHLIGHT:
- case STYLE_CATEGORY_KEYICON_GUIDE_HIGHLIGHT:
- case STYLE_CATEGORY_SYMBOL_MAJOR_SELECTED:
- case STYLE_CATEGORY_SYMBOL_MINOR:
- paint.setStyle(Style.FILL);
- paint.setColor(0xFFFFFFFF);
- break;
- case STYLE_CATEGORY_KEYICON_BOUND:
- paint.setStyle(Style.STROKE);
- paint.setColor(0xFFCCCCCC);
- break;
- case STYLE_CATEGORY_KEYICON_FUNCTION:
- paint.setStyle(Style.FILL);
- paint.setColor(0xFFF7F7F7);
- paint.setShadowLayer(2.f, 0.f, -1.f, 0xFF404040);
- break;
- case SkinType.STYLE_CATEGORY_KEYICON_QWERTY_SHIFT_ON_ARROW:
- paint.setStyle(Style.FILL);
- paint.setColor(0xFF55C6EE);
- paint.setShadowLayer(2.f, 0.f, -1.f, 0xFF404040);
- break;
- case SkinType.STYLE_CATEGORY_KEYICON_QWERTY_CAPS_ON_ARROW:
- paint.setStyle(Style.FILL);
- paint.setColor(0xFFC1F300);
- paint.setShadowLayer(2.f, 0.f, -1.f, 0xFF404040);
- break;
- case STYLE_CATEGORY_KEYPOPUP_HIGHLIGHT:
- paint.setStyle(Style.FILL);
- paint.setColor(0xFF4DA7CF);
- break;
- case STYLE_CATEGORY_SYMBOL_MAJOR:
- case STYLE_CATEGORY_KEYICON_POPUP_FUNCTION_DARK:
- paint.setStyle(Style.FILL);
- paint.setColor(0xFF333333);
- break;
- case STYLE_CATEGORY_SYMBOL_MINOR_SELECTED:
- paint.setStyle(Style.FILL);
- paint.setColor(0xFF63CFFF);
- break;
- case STYLE_CATEGORY_KEYBOARD_FOLDING_BUTTON_BACKGROUND:
- paint.setStyle(Style.FILL);
- paint.setColor(0x8C676767);
- break;
- default:
- throw new IllegalStateException("Unknown category: " + category);
- }
- }
- },
-
+ ORANGE_LIGHTGRAY(R.xml.skin_orange_lightgray),
+ BLUE_LIGHTGRAY(R.xml.skin_blue_lightgray),
+ BLUE_DARKGRAY(R.xml.skin_blue_darkgray),
+ MATERIAL_DESIGN_LIGHT(R.xml.skin_material_design_light),
+ MATERIAL_DESIGN_DARK(R.xml.skin_material_design_dark),
// This is an instance for testing of skin support in some classes.
- // TODO(hidehiko): remove this value when other skin types (described in above TODO)
- // are supported.
- TEST(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) {
- @Override
- public void apply(Paint paint, int category) {
- // Do nothing.
- }
- }
+ // TODO(matsuzakit): No more required. Remove.
+ TEST(R.xml.skin_orange_lightgray)
;
- public static final int STYLE_CATEGORY_KEYICON_MAIN = 0;
- public static final int STYLE_CATEGORY_KEYICON_GUIDE = 1;
- public static final int STYLE_CATEGORY_KEYICON_GUIDE_LIGHT = 2;
- public static final int STYLE_CATEGORY_KEYICON_MAIN_HIGHLIGHT = 3;
- public static final int STYLE_CATEGORY_KEYICON_GUIDE_HIGHLIGHT = 4;
- public static final int STYLE_CATEGORY_KEYICON_BOUND = 5;
- public static final int STYLE_CATEGORY_KEYICON_FUNCTION = 6;
- public static final int STYLE_CATEGORY_KEYICON_FUNCTION_DARK = 7;
- public static final int STYLE_CATEGORY_KEYICON_QWERTY_SHIFT_ON_ARROW = 8;
- public static final int STYLE_CATEGORY_KEYICON_QWERTY_CAPS_ON_ARROW = 9;
- public static final int STYLE_CATEGORY_KEYPOPUP_HIGHLIGHT = 10;
- public static final int STYLE_CATEGORY_KEYICON_POPUP_FUNCTION = 11;
- public static final int STYLE_CATEGORY_KEYICON_POPUP_FUNCTION_DARK = 12;
- public static final int STYLE_CATEGORY_SYMBOL_MAJOR = 13;
- public static final int STYLE_CATEGORY_SYMBOL_MAJOR_SELECTED = 14;
- public static final int STYLE_CATEGORY_SYMBOL_MINOR = 15;
- public static final int STYLE_CATEGORY_SYMBOL_MINOR_SELECTED = 16;
- public static final int STYLE_CATEGORY_KEYBOARD_FOLDING_BUTTON_BACKGROUND = 17;
+ private Optional<Skin> skin = Optional.absent();
+ private final int resourceId;
- public final int twelvekeysLayoutReleasedKeyTopColor;
- public final int twelvekeysLayoutReleasedKeyBottomColor;
- public final int twelvekeysLayoutReleasedKeyHighlightColor;
- public final int twelvekeysLayoutReleasedKeyLightShadeColor;
- public final int twelvekeysLayoutReleasedKeyDarkShadeColor;
- public final int twelvekeysLayoutReleasedKeyShadowColor;
+ private SkinType(int resourceId) {
+ this.resourceId = resourceId;
+ }
- public final int twelvekeysLayoutPressedKeyTopColor;
- public final int twelvekeysLayoutPressedKeyBottomColor;
- public final int twelvekeysLayoutPressedKeyHighlightColor;
- public final int twelvekeysLayoutPressedKeyLightShadeColor;
- public final int twelvekeysLayoutPressedKeyDarkShadeColor;
- public final int twelvekeysLayoutPressedKeyShadowColor;
-
- public final int twelvekeysLayoutReleasedFunctionKeyTopColor;
- public final int twelvekeysLayoutReleasedFunctionKeyBottomColor;
- public final int twelvekeysLayoutReleasedFunctionKeyHighlightColor;
- public final int twelvekeysLayoutReleasedFunctionKeyLightShadeColor;
- public final int twelvekeysLayoutReleasedFunctionKeyDarkShadeColor;
- public final int twelvekeysLayoutReleasedFunctionKeyShadowColor;
-
- public final int twelvekeysLayoutPressedFunctionKeyTopColor;
- public final int twelvekeysLayoutPressedFunctionKeyBottomColor;
- public final int twelvekeysLayoutPressedFunctionKeyHighlightColor;
- public final int twelvekeysLayoutPressedFunctionKeyLightShadeColor;
- public final int twelvekeysLayoutPressedFunctionKeyDarkShadeColor;
- public final int twelvekeysLayoutPressedFunctionKeyShadowColor;
-
- public final int qwertyLayoutReleasedKeyTopColor;
- public final int qwertyLayoutReleasedKeyBottomColor;
- public final int qwertyLayoutReleasedKeyHighlightColor;
- public final int qwertyLayoutReleasedKeyShadowColor;
-
- public final int qwertyLayoutPressedKeyTopColor;
- public final int qwertyLayoutPressedKeyBottomColor;
- public final int qwertyLayoutPressedKeyHighlightColor;
- public final int qwertyLayoutPressedKeyShadowColor;
-
- public final int qwertyLayoutReleasedFunctionKeyTopColor;
- public final int qwertyLayoutReleasedFunctionKeyBottomColor;
- public final int qwertyLayoutReleasedFunctionKeyHighlightColor;
- public final int qwertyLayoutReleasedFunctionKeyShadowColor;
-
- public final int qwertyLayoutPressedFunctionKeyTopColor;
- public final int qwertyLayoutPressedFunctionKeyBottomColor;
- public final int qwertyLayoutPressedFunctionKeyHighlightColor;
- public final int qwertyLayoutPressedFunctionKeyShadowColor;
-
- public final int flickBaseColor;
- public final int flickShadeColor;
-
- public final int qwertyLightOnSignLightColor;
- public final int qwertyLightOnSignDarkColor;
- public final int qwertyLightOnSignShadeColor;
-
- public final int qwertyLightOffSignLightColor;
- public final int qwertyLightOffSignDarkColor;
- public final int qwertyLightOffSignShadeColor;
-
- public final float qwertyKeyRoundRadius;
-
- public final int popupFrameWindowTopColor;
- public final int popupFrameWindowBottomColor;
- public final int popupFrameWindowBorderColor;
- public final int popupFrameWindowInnerPaneColor;
- public final int popupFrameWindowShadowColor;
-
- public final int candidateScrollBarTopColor;
- public final int candidateScrollBarBottomColor;
- public final int candidateBackgroundTopColor;
- public final int candidateBackgroundBottomColor;
- public final int candidateBackgroundHighlightColor;
- public final int candidateBackgroundBorderColor;
- public final int candidateBackgroundFocusedTopColor;
- public final int candidateBackgroundFocusedBottomColor;
- public final int candidateBackgroundFocusedShadowColor;
-
- public final int symbolReleasedFunctionKeyTopColor;
- public final int symbolReleasedFunctionKeyBottomColor;
- public final int symbolReleasedFunctionKeyHighlightColor;
- public final int symbolReleasedFunctionKeyShadowColor;
-
- public final int symbolPressedFunctionKeyTopColor;
- public final int symbolPressedFunctionKeyBottomColor;
- public final int symbolPressedFunctionKeyHighlightColor;
- public final int symbolPressedFunctionKeyShadowColor;
-
- public final int symbolScrollBarTopColor;
- public final int symbolScrollBarBottomColor;
-
- public final int symbolMinorCategoryTabSelectedColor;
- public final int symbolMinorCategoryTabPressedColor;
-
- public final int symbolCandidateBackgroundTopColor;
- public final int symbolCandidateBackgroundBottomColor;
- public final int symbolCandidateBackgroundHighlightColor;
- public final int symbolCandidateBackgroundBorderColor;
-
- public final int threeDotsColor;
-
- public final int windowBackgroundResourceId;
-
- public abstract void apply(Paint paint, int category);
-
- private SkinType(
- int twelvekeysLayoutReleasedKeyTopColor,
- int twelvekeysLayoutReleasedKeyBottomColor,
- int twelvekeysLayoutReleasedKeyHighlightColor,
- int twelvekeysLayoutReleasedKeyLightShadeColor,
- int twelvekeysLayoutReleasedKeyDarkShadeColor,
- int twelvekeysLayoutReleasedKeyShadowColor,
- int twelvekeysLayoutPressedKeyTopColor,
- int twelvekeysLayoutPressedKeyBottomColor,
- int twelvekeysLayoutPressedKeyHighlightColor,
- int twelvekeysLayoutPressedKeyLightShadeColor,
- int twelvekeysLayoutPressedKeyDarkShadeColor,
- int twelvekeysLayoutPressedKeyShadowColor,
- int twelvekeysLayoutReleasedFunctionKeyTopColor,
- int twelvekeysLayoutReleasedFunctionKeyBottomColor,
- int twelvekeysLayoutReleasedFunctionKeyHighlightColor,
- int twelvekeysLayoutReleasedFunctionKeyLightShadeColor,
- int twelvekeysLayoutReleasedFunctionKeyDarkShadeColor,
- int twelvekeysLayoutReleasedFunctionKeyShadowColor,
- int twelvekeysLayoutPressedFunctionKeyTopColor,
- int twelvekeysLayoutPressedFunctionKeyBottomColor,
- int twelvekeysLayoutPressedFunctionKeyHighlightColor,
- int twelvekeysLayoutPressedFunctionKeyLightShadeColor,
- int twelvekeysLayoutPressedFunctionKeyDarkShadeColor,
- int twelvekeysLayoutPressedFunctionKeyShadowColor,
- int qwertyLayoutReleasedKeyTopColor,
- int qwertyLayoutReleasedKeyBottomColor,
- int qwertyLayoutReleasedKeyHighlightColor,
- int qwertyLayoutReleasedKeyShadowColor,
- int qwertyLayoutPressedKeyTopColor,
- int qwertyLayoutPressedKeyBottomColor,
- int qwertyLayoutPressedKeyHighlightColor,
- int qwertyLayoutPressedKeyShadowColor,
- int qwertyLayoutReleasedFunctionKeyTopColor,
- int qwertyLayoutReleasedFunctionKeyBottomColor,
- int qwertyLayoutReleasedFunctionKeyHighlightColor,
- int qwertyLayoutReleasedFunctionKeyShadowColor,
- int qwertyLayoutPressedFunctionKeyTopColor,
- int qwertyLayoutPressedFunctionKeyBottomColor,
- int qwertyLayoutPressedFunctionKeyHighlightColor,
- int qwertyLayoutPressedFunctionKeyShadowColor,
- int flickBaseColor,
- int flickShadeColor,
- int qwertyLightOnSignLightColor,
- int qwertyLightOnSignDarkColor,
- int qwertyLightOnSignShadeColor,
- int qwertyLightOffSignLightColor,
- int qwertyLightOffSignDarkColor,
- int qwertyLightOffSignShadeColor,
- float qwertyKeyRoundRadius,
- int popupFrameWindowTopColor,
- int popupFrameWindowBottomColor,
- int popupFrameWindowBorderColor,
- int popupFrameWindowInnerPaneColor,
- int popupFrameWindowShadowColor,
- int candidateScrollBarTopColor,
- int candidateScrollBarBottomColor,
- int candidateBackgroundTopColor,
- int candidateBackgroundBottomColor,
- int candidateBackgroundHighlightColor,
- int candidateBackgroundBorderColor,
- int candidateBackgroundFocusedTopColor,
- int candidateBackgroundFocusedBottomColor,
- int candidateBackgroundFocusedShadowColor,
- int symbolReleasedFunctionKeyTopColor,
- int symbolReleasedFunctionKeyBottomColor,
- int symbolReleasedFunctionKeyHighlightColor,
- int symbolReleasedFunctionKeyShadowColor,
- int symbolPressedFunctionKeyTopColor,
- int symbolPressedFunctionKeyBottomColor,
- int symbolPressedFunctionKeyHighlightColor,
- int symbolPressedFunctionKeyShadowColor,
- int symbolScrollBarTopColor,
- int symbolScrollBarBottomColor,
- int symbolMinorCategoryTabSelectedColor,
- int symbolMinorCategoryTabPressedColor,
- int symbolCandidateBackgroundTopColor,
- int symbolCandidateBackgroundBottomColor,
- int symbolCandidateBackgroundHighlightColor,
- int symbolCandidateBackgroundBorderColor,
- int threeDotsColor,
- int windowBackgroundResourceId) {
- this.twelvekeysLayoutReleasedKeyTopColor = twelvekeysLayoutReleasedKeyTopColor;
- this.twelvekeysLayoutReleasedKeyBottomColor = twelvekeysLayoutReleasedKeyBottomColor;
- this.twelvekeysLayoutReleasedKeyHighlightColor = twelvekeysLayoutReleasedKeyHighlightColor;
- this.twelvekeysLayoutReleasedKeyLightShadeColor = twelvekeysLayoutReleasedKeyLightShadeColor;
- this.twelvekeysLayoutReleasedKeyDarkShadeColor = twelvekeysLayoutReleasedKeyDarkShadeColor;
- this.twelvekeysLayoutReleasedKeyShadowColor = twelvekeysLayoutReleasedKeyShadowColor;
-
- this.twelvekeysLayoutPressedKeyTopColor = twelvekeysLayoutPressedKeyTopColor;
- this.twelvekeysLayoutPressedKeyBottomColor = twelvekeysLayoutPressedKeyBottomColor;
- this.twelvekeysLayoutPressedKeyHighlightColor = twelvekeysLayoutPressedKeyHighlightColor;
- this.twelvekeysLayoutPressedKeyLightShadeColor = twelvekeysLayoutPressedKeyLightShadeColor;
- this.twelvekeysLayoutPressedKeyDarkShadeColor = twelvekeysLayoutPressedKeyDarkShadeColor;
- this.twelvekeysLayoutPressedKeyShadowColor = twelvekeysLayoutPressedKeyShadowColor;
-
- this.twelvekeysLayoutReleasedFunctionKeyTopColor = twelvekeysLayoutReleasedFunctionKeyTopColor;
- this.twelvekeysLayoutReleasedFunctionKeyBottomColor =
- twelvekeysLayoutReleasedFunctionKeyBottomColor;
- this.twelvekeysLayoutReleasedFunctionKeyHighlightColor =
- twelvekeysLayoutReleasedFunctionKeyHighlightColor;
- this.twelvekeysLayoutReleasedFunctionKeyLightShadeColor =
- twelvekeysLayoutReleasedFunctionKeyLightShadeColor;
- this.twelvekeysLayoutReleasedFunctionKeyDarkShadeColor =
- twelvekeysLayoutReleasedFunctionKeyDarkShadeColor;
- this.twelvekeysLayoutReleasedFunctionKeyShadowColor =
- twelvekeysLayoutReleasedFunctionKeyShadowColor;
-
- this.twelvekeysLayoutPressedFunctionKeyTopColor = twelvekeysLayoutPressedFunctionKeyTopColor;
- this.twelvekeysLayoutPressedFunctionKeyBottomColor =
- twelvekeysLayoutPressedFunctionKeyBottomColor;
- this.twelvekeysLayoutPressedFunctionKeyHighlightColor =
- twelvekeysLayoutPressedFunctionKeyHighlightColor;
- this.twelvekeysLayoutPressedFunctionKeyLightShadeColor =
- twelvekeysLayoutPressedFunctionKeyLightShadeColor;
- this.twelvekeysLayoutPressedFunctionKeyDarkShadeColor =
- twelvekeysLayoutPressedFunctionKeyDarkShadeColor;
- this.twelvekeysLayoutPressedFunctionKeyShadowColor =
- twelvekeysLayoutPressedFunctionKeyShadowColor;
-
- this.qwertyLayoutReleasedKeyTopColor = qwertyLayoutReleasedKeyTopColor;
- this.qwertyLayoutReleasedKeyBottomColor = qwertyLayoutReleasedKeyBottomColor;
- this.qwertyLayoutReleasedKeyHighlightColor = qwertyLayoutReleasedKeyHighlightColor;
- this.qwertyLayoutReleasedKeyShadowColor = qwertyLayoutReleasedKeyShadowColor;
-
- this.qwertyLayoutPressedKeyTopColor = qwertyLayoutPressedKeyTopColor;
- this.qwertyLayoutPressedKeyBottomColor = qwertyLayoutPressedKeyBottomColor;
- this.qwertyLayoutPressedKeyHighlightColor = qwertyLayoutPressedKeyHighlightColor;
- this.qwertyLayoutPressedKeyShadowColor = qwertyLayoutPressedKeyShadowColor;
-
- this.qwertyLayoutReleasedFunctionKeyTopColor = qwertyLayoutReleasedFunctionKeyTopColor;
- this.qwertyLayoutReleasedFunctionKeyBottomColor = qwertyLayoutReleasedFunctionKeyBottomColor;
- this.qwertyLayoutReleasedFunctionKeyHighlightColor =
- qwertyLayoutReleasedFunctionKeyHighlightColor;
- this.qwertyLayoutReleasedFunctionKeyShadowColor = qwertyLayoutReleasedFunctionKeyShadowColor;
-
- this.qwertyLayoutPressedFunctionKeyTopColor = qwertyLayoutPressedFunctionKeyTopColor;
- this.qwertyLayoutPressedFunctionKeyBottomColor = qwertyLayoutPressedFunctionKeyBottomColor;
- this.qwertyLayoutPressedFunctionKeyHighlightColor =
- qwertyLayoutPressedFunctionKeyHighlightColor;
- this.qwertyLayoutPressedFunctionKeyShadowColor = qwertyLayoutPressedFunctionKeyShadowColor;
-
- this.flickBaseColor = flickBaseColor;
- this.flickShadeColor = flickShadeColor;
-
- this.qwertyLightOnSignLightColor = qwertyLightOnSignLightColor;
- this.qwertyLightOnSignDarkColor = qwertyLightOnSignDarkColor;
- this.qwertyLightOnSignShadeColor = qwertyLightOnSignShadeColor;
-
- this.qwertyLightOffSignLightColor = qwertyLightOffSignLightColor;
- this.qwertyLightOffSignDarkColor = qwertyLightOffSignDarkColor;
- this.qwertyLightOffSignShadeColor = qwertyLightOffSignShadeColor;
-
- this.qwertyKeyRoundRadius = qwertyKeyRoundRadius;
-
- this.popupFrameWindowTopColor = popupFrameWindowTopColor;
- this.popupFrameWindowBottomColor = popupFrameWindowBottomColor;
- this.popupFrameWindowBorderColor = popupFrameWindowBorderColor;
- this.popupFrameWindowInnerPaneColor = popupFrameWindowInnerPaneColor;
- this.popupFrameWindowShadowColor = popupFrameWindowShadowColor;
-
- this.candidateScrollBarTopColor = candidateScrollBarTopColor;
- this.candidateScrollBarBottomColor = candidateScrollBarBottomColor;
- this.candidateBackgroundTopColor = candidateBackgroundTopColor;
- this.candidateBackgroundBottomColor = candidateBackgroundBottomColor;
- this.candidateBackgroundHighlightColor = candidateBackgroundHighlightColor;
- this.candidateBackgroundBorderColor = candidateBackgroundBorderColor;
- this.candidateBackgroundFocusedTopColor = candidateBackgroundFocusedTopColor;
- this.candidateBackgroundFocusedBottomColor = candidateBackgroundFocusedBottomColor;
- this.candidateBackgroundFocusedShadowColor = candidateBackgroundFocusedShadowColor;
-
- this.symbolReleasedFunctionKeyTopColor = symbolReleasedFunctionKeyTopColor;
- this.symbolReleasedFunctionKeyBottomColor = symbolReleasedFunctionKeyBottomColor;
- this.symbolReleasedFunctionKeyHighlightColor = symbolReleasedFunctionKeyHighlightColor;
- this.symbolReleasedFunctionKeyShadowColor = symbolReleasedFunctionKeyShadowColor;
- this.symbolPressedFunctionKeyTopColor = symbolPressedFunctionKeyTopColor;
- this.symbolPressedFunctionKeyBottomColor = symbolPressedFunctionKeyBottomColor;
- this.symbolPressedFunctionKeyHighlightColor = symbolPressedFunctionKeyHighlightColor;
- this.symbolPressedFunctionKeyShadowColor = symbolPressedFunctionKeyShadowColor;
-
- this.symbolScrollBarTopColor = symbolScrollBarTopColor;
- this.symbolScrollBarBottomColor = symbolScrollBarBottomColor;
-
- this.symbolMinorCategoryTabSelectedColor = symbolMinorCategoryTabSelectedColor;
- this.symbolMinorCategoryTabPressedColor = symbolMinorCategoryTabPressedColor;
-
- this.symbolCandidateBackgroundTopColor = symbolCandidateBackgroundTopColor;
- this.symbolCandidateBackgroundBottomColor = symbolCandidateBackgroundBottomColor;
- this.symbolCandidateBackgroundHighlightColor = symbolCandidateBackgroundHighlightColor;
- this.symbolCandidateBackgroundBorderColor = symbolCandidateBackgroundBorderColor;
-
- this.threeDotsColor = threeDotsColor;
-
- this.windowBackgroundResourceId = windowBackgroundResourceId;
+ public Skin getSkin(Resources resources) {
+ Preconditions.checkNotNull(resources);
+ if (skin.isPresent()) {
+ return skin.get();
+ }
+ SkinParser parser = new SkinParser(resources, resources.getXml(resourceId));
+ try {
+ skin = Optional.of(parser.parseSkin());
+ } catch (SkinParserException e) {
+ MozcLog.e(e.getLocalizedMessage());
+ skin = Optional.of(new Skin()); // Fall-back skin.
+ }
+ return skin.get();
}
}
diff --git a/src/android/src/com/google/android/inputmethod/japanese/view/SymbolMajorCategoryButtonDrawableFactory.java b/src/android/src/com/google/android/inputmethod/japanese/view/SymbolMajorCategoryButtonDrawableFactory.java
index 2ed0987..133c648 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/view/SymbolMajorCategoryButtonDrawableFactory.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/view/SymbolMajorCategoryButtonDrawableFactory.java
@@ -34,6 +34,7 @@
import com.google.common.base.Optional;
import com.google.common.base.Preconditions;
+import android.content.res.Resources;
import android.graphics.Canvas;
import android.graphics.LinearGradient;
import android.graphics.Paint;
@@ -57,20 +58,23 @@
}
private static class LeftButtonPathFactory implements PathFactory {
-
+ private final float padding;
private final float round;
- LeftButtonPathFactory(float round) {
+ // Padding is applied to left, top and bottom.
+ // Right doesn't have padding in order to center left/right buttons.
+ LeftButtonPathFactory(float padding, float round) {
+ this.padding = padding;
this.round = round;
}
@Override
public Path newInstance(Rect bounds) {
Preconditions.checkNotNull(bounds);
- float left = bounds.left;
- float top = bounds.top;
+ float left = bounds.left + padding;
+ float top = bounds.top + padding;
float right = bounds.right - 2;
- float bottom = bounds.bottom - 1;
+ float bottom = bounds.bottom - 1 - padding;
Path path = new Path();
path.moveTo(right, bottom);
@@ -84,14 +88,20 @@
}
private static class CenterButtonPathFactory implements PathFactory {
+ private final float padding;
+
+ // Padding is applied only to top and bottom.
+ CenterButtonPathFactory(float padding) {
+ this.padding = padding;
+ }
@Override
public Path newInstance(Rect bounds) {
Preconditions.checkNotNull(bounds);
float left = bounds.left;
- float top = bounds.top;
+ float top = bounds.top + padding;
float right = bounds.right - 2;
- float bottom = bounds.bottom - 1;
+ float bottom = bounds.bottom - 1 - padding;
Path path = new Path();
path.addRect(left, top, right, bottom, Direction.CW);
@@ -100,9 +110,13 @@
}
private static class RightButtonPathFactory implements PathFactory {
+ private final float padding;
private final float round;
- RightButtonPathFactory(float round) {
+ // Padding is applied to right, top and bottom.
+ // Left doesn't have padding in order to center left/right buttons.
+ RightButtonPathFactory(float padding, float round) {
+ this.padding = padding;
this.round = round;
}
@@ -110,9 +124,9 @@
public Path newInstance(Rect bounds) {
Preconditions.checkNotNull(bounds);
float left = bounds.left;
- float top = bounds.top;
- float right = bounds.right - 1;
- float bottom = bounds.bottom - 1;
+ float top = bounds.top + padding;
+ float right = bounds.right - 1 - padding;
+ float bottom = bounds.bottom - 1 - padding;
Path path = new Path();
path.moveTo(left, top);
@@ -190,10 +204,14 @@
private static class EmojiDisableIconDrawable extends BaseBackgroundDrawable {
+ private final int size;
private final Drawable sourceDrawable;
- EmojiDisableIconDrawable(Drawable sourceDrawable) {
+ EmojiDisableIconDrawable(Resources resources, Drawable sourceDrawable) {
super(0, 0, 0, 0);
+ size = Preconditions.checkNotNull(resources).getDimensionPixelSize(
+ R.dimen.symbol_major_emoji_disable_icon_height);
+ sourceDrawable.setBounds(0, 0, size, size);
this.sourceDrawable = Preconditions.checkNotNull(sourceDrawable);
}
@@ -201,9 +219,6 @@
public void draw(Canvas canvas) {
Rect bounds = getBounds();
- // Heuristically, the size is 1/3 of the height.
- int size = bounds.height() / 3;
- sourceDrawable.setBounds(0, 0, size, size);
int saveCount = canvas.save();
try {
@@ -216,56 +231,55 @@
}
}
- private final MozcDrawableFactory factory;
+ private Skin skin = Skin.getFallbackInstance();
- private final int topColor;
- private final int bottomColor;
- private final int pressedTopColor;
- private final int pressedBottomColor;
- private final int shadowColor;
+ private final Resources resources;
- private final PathFactory leftButtonPathFactory;
- private final PathFactory centerButtonPathFactory;
- private final PathFactory rightButtonPathFactory;
-
- public SymbolMajorCategoryButtonDrawableFactory(
- MozcDrawableFactory factory, int topColor, int bottomColor,
- int pressedTopColor, int pressedBottomColor, int shadowColor,
- float round) {
- this.factory = Preconditions.checkNotNull(factory);
- this.topColor = topColor;
- this.bottomColor = bottomColor;
- this.pressedTopColor = pressedTopColor;
- this.pressedBottomColor = pressedBottomColor;
- this.shadowColor = shadowColor;
-
- this.leftButtonPathFactory = new LeftButtonPathFactory(round);
- this.centerButtonPathFactory = new CenterButtonPathFactory();
- this.rightButtonPathFactory = new RightButtonPathFactory(round);
+ public SymbolMajorCategoryButtonDrawableFactory(Resources resources) {
+ this.resources = Preconditions.checkNotNull(resources);
}
public Drawable createLeftButtonDrawable() {
- return BackgroundDrawableFactory.createSelectableDrawable(
- new ButtonDrawable(leftButtonPathFactory, pressedTopColor, pressedBottomColor, 0),
- new ButtonDrawable(leftButtonPathFactory, topColor, bottomColor, shadowColor));
+ return createSelectableDrawableWithPathFactory(
+ new LeftButtonPathFactory(skin.symbolMajorButtonPaddingDimension,
+ skin.symbolMajorButtonRoundDimension));
}
public Drawable createCenterButtonDrawable() {
- return BackgroundDrawableFactory.createSelectableDrawable(
- new ButtonDrawable(centerButtonPathFactory, pressedTopColor, pressedBottomColor, 0),
- new ButtonDrawable(centerButtonPathFactory, topColor, bottomColor, shadowColor));
+ return createSelectableDrawableWithPathFactory(
+ new CenterButtonPathFactory(skin.symbolMajorButtonPaddingDimension));
}
public Drawable createRightButtonDrawable(boolean emojiEnabled) {
- Drawable drawable = BackgroundDrawableFactory.createSelectableDrawable(
- new ButtonDrawable(rightButtonPathFactory, pressedTopColor, pressedBottomColor, 0),
- new ButtonDrawable(rightButtonPathFactory, topColor, bottomColor, shadowColor));
+ Drawable drawable = createSelectableDrawableWithPathFactory(
+ new RightButtonPathFactory(skin.symbolMajorButtonPaddingDimension,
+ skin.symbolMajorButtonRoundDimension));
if (emojiEnabled) {
return drawable;
}
return new LayerDrawable(new Drawable[] {
drawable,
- new EmojiDisableIconDrawable(factory.getDrawable(R.raw.emoji_disable_icon).orNull()),
+ new EmojiDisableIconDrawable(
+ resources, skin.getDrawable(resources, R.raw.emoji_disable_icon)),
});
}
+
+ private Drawable createSelectableDrawableWithPathFactory(PathFactory pathFactory) {
+ return BackgroundDrawableFactory.createSelectableDrawable(
+ new ButtonDrawable(pathFactory,
+ skin.symbolMajorButtonSelectedTopColor,
+ skin.symbolMajorButtonSelectedBottomColor, 0),
+ Optional.<Drawable>of(BackgroundDrawableFactory.createPressableDrawable(
+ new ButtonDrawable(pathFactory,
+ skin.symbolMajorButtonPressedTopColor,
+ skin.symbolMajorButtonPressedBottomColor, 0),
+ Optional.<Drawable>of(new ButtonDrawable(pathFactory,
+ skin.symbolMajorButtonTopColor,
+ skin.symbolMajorButtonBottomColor,
+ skin.symbolMajorButtonShadowColor)))));
+ }
+
+ public void setSkin(Skin skin) {
+ this.skin = Preconditions.checkNotNull(skin);
+ }
}
diff --git a/src/android/src/com/google/android/inputmethod/japanese/view/TabSelectedBackgroundDrawable.java b/src/android/src/com/google/android/inputmethod/japanese/view/TabSelectedBackgroundDrawable.java
index c202471..23bd470 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/view/TabSelectedBackgroundDrawable.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/view/TabSelectedBackgroundDrawable.java
@@ -31,6 +31,7 @@
import android.graphics.Canvas;
import android.graphics.Paint;
+import android.graphics.Rect;
/**
* Selected tab highlight implementation.
@@ -54,6 +55,7 @@
}
// Paint the rectangle.
- canvas.drawRect(0, 0, getBounds().right, highlightHeight, paint);
+ Rect bounds = getBounds();
+ canvas.drawRect(0, bounds.bottom - highlightHeight, bounds.right, bounds.bottom, paint);
}
}
diff --git a/src/android/src/com/google/android/inputmethod/japanese/view/VerticalInnerDropShadowDrawable.java b/src/android/src/com/google/android/inputmethod/japanese/view/VerticalInnerDropShadowDrawable.java
deleted file mode 100644
index ac626c7..0000000
--- a/src/android/src/com/google/android/inputmethod/japanese/view/VerticalInnerDropShadowDrawable.java
+++ /dev/null
@@ -1,92 +0,0 @@
-// Copyright 2010-2014, Google Inc.
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-package org.mozc.android.inputmethod.japanese.view;
-
-import com.google.common.base.Optional;
-
-import android.graphics.Canvas;
-import android.graphics.LinearGradient;
-import android.graphics.Paint;
-import android.graphics.Rect;
-import android.graphics.Shader.TileMode;
-
-/**
- * Drawable for drop shadow on top and bottom of the boundary.
- */
-public class VerticalInnerDropShadowDrawable extends BaseBackgroundDrawable {
-
- private final int shadowSize;
- private Optional<LinearGradient> topShadow = Optional.absent();
- private Optional<LinearGradient> bottomShadow = Optional.absent();
- private final Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
-
- public VerticalInnerDropShadowDrawable(
- int leftPadding, int topPadding, int rightPadding, int bottomPadding,
- int shadowSize) {
- super(leftPadding, topPadding, rightPadding, bottomPadding);
- this.shadowSize = shadowSize;
- }
-
- @Override
- public void draw(Canvas canvas) {
- if (isCanvasRectEmpty()) {
- return;
- }
-
- Rect rect = getCanvasRect();
- if (topShadow.isPresent()) {
- paint.setShader(topShadow.get());
- canvas.drawRect(rect, paint);
- }
-
- if (bottomShadow.isPresent()) {
- paint.setShader(bottomShadow.get());
- canvas.drawRect(rect, paint);
- }
- }
-
- @Override
- protected void onBoundsChange(Rect bounds) {
- super.onBoundsChange(bounds);
- if (isCanvasRectEmpty()) {
- topShadow = Optional.absent();
- bottomShadow = Optional.absent();
- return;
- }
-
- Rect canvasRect = getCanvasRect();
- topShadow = Optional.of(new LinearGradient(
- 0, canvasRect.top, 0, Math.min(canvasRect.bottom, canvasRect.top + shadowSize),
- 0xA6000000, 0x00000000, TileMode.CLAMP));
- bottomShadow = Optional.of(new LinearGradient(
- 0, Math.max(canvasRect.top, canvasRect.bottom - shadowSize), 0, canvasRect.bottom,
- 0x00000000, 0xA6000000, TileMode.CLAMP));
- }
-}
diff --git a/src/android/static_resources/resources_oss/res/drawable-hdpi/application_icon.png b/src/android/static_resources/application_icon/oss_icon/drawable-hdpi/application_icon.png
similarity index 100%
rename from src/android/static_resources/resources_oss/res/drawable-hdpi/application_icon.png
rename to src/android/static_resources/application_icon/oss_icon/drawable-hdpi/application_icon.png
Binary files differ
diff --git a/src/android/static_resources/application_icon/oss_icon/drawable-mdpi/application_icon.png b/src/android/static_resources/application_icon/oss_icon/drawable-mdpi/application_icon.png
new file mode 100644
index 0000000..47689b6
--- /dev/null
+++ b/src/android/static_resources/application_icon/oss_icon/drawable-mdpi/application_icon.png
Binary files differ
diff --git a/src/android/static_resources/resources_oss/res/drawable-xhdpi/application_icon.png b/src/android/static_resources/application_icon/oss_icon/drawable-xhdpi/application_icon.png
similarity index 100%
rename from src/android/static_resources/resources_oss/res/drawable-xhdpi/application_icon.png
rename to src/android/static_resources/application_icon/oss_icon/drawable-xhdpi/application_icon.png
Binary files differ
diff --git a/src/android/static_resources/application_icon/oss_icon/drawable-xxhdpi/application_icon.png b/src/android/static_resources/application_icon/oss_icon/drawable-xxhdpi/application_icon.png
new file mode 100644
index 0000000..f3f3055
--- /dev/null
+++ b/src/android/static_resources/application_icon/oss_icon/drawable-xxhdpi/application_icon.png
Binary files differ
diff --git a/src/android/static_resources/application_icon/oss_icon/drawable-xxxhdpi/application_icon.png b/src/android/static_resources/application_icon/oss_icon/drawable-xxxhdpi/application_icon.png
new file mode 100644
index 0000000..2b6f59c
--- /dev/null
+++ b/src/android/static_resources/application_icon/oss_icon/drawable-xxxhdpi/application_icon.png
Binary files differ
diff --git a/src/android/static_resources/launcher_icon_resources/launcher_icon_preinstall_bools.xml b/src/android/static_resources/launcher_icon_resources/launcher_icon_preinstall_bools.xml
new file mode 100644
index 0000000..0cf1ea8
--- /dev/null
+++ b/src/android/static_resources/launcher_icon_resources/launcher_icon_preinstall_bools.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<resources>
+
+ <bool name="show_launcher_icon">false</bool>
+
+</resources>
diff --git a/src/android/static_resources/launcher_icon_resources/launcher_icon_standard_bools.xml b/src/android/static_resources/launcher_icon_resources/launcher_icon_standard_bools.xml
new file mode 100644
index 0000000..0675dd7
--- /dev/null
+++ b/src/android/static_resources/launcher_icon_resources/launcher_icon_standard_bools.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<resources>
+
+ <bool name="show_launcher_icon">true</bool>
+
+</resources>
diff --git a/src/android/static_resources/resources_oss/AndroidManifest.xml b/src/android/static_resources/resources_oss/AndroidManifest.xml
deleted file mode 100644
index e391761..0000000
--- a/src/android/static_resources/resources_oss/AndroidManifest.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<manifest
- xmlns:android="http://schemas.android.com/apk/res/android"
- package="org.mozc.android.inputmethod.japanese.resources">
- <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="19" />
-</manifest>
diff --git a/src/android/static_resources/resources_oss/project.properties b/src/android/static_resources/resources_oss/project.properties
deleted file mode 100644
index bc02349..0000000
--- a/src/android/static_resources/resources_oss/project.properties
+++ /dev/null
@@ -1,44 +0,0 @@
-# Copyright 2010-2014, Google Inc.
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions are
-# met:
-#
-# * Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-# * Redistributions in binary form must reproduce the above
-# copyright notice, this list of conditions and the following disclaimer
-# in the documentation and/or other materials provided with the
-# distribution.
-# * Neither the name of Google Inc. nor the names of its
-# contributors may be used to endorse or promote products derived from
-# this software without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-# This file is automatically generated by Android Tools.
-# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
-#
-# This file must be checked in Version Control Systems.
-#
-# To customize properties used by the Ant build system edit
-# "ant.properties", and override values to adapt the script to your
-# project structure.
-#
-# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
-#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
-
-# Project target.
-target=android-19
-android.library=true
diff --git a/src/android/static_resources/resources_oss/res/drawable-hdpi/status_icon_image_alphabet.png b/src/android/static_resources/resources_oss/res/drawable-hdpi/status_icon_image_alphabet.png
index 727894f..da1b4f1 100644
--- a/src/android/static_resources/resources_oss/res/drawable-hdpi/status_icon_image_alphabet.png
+++ b/src/android/static_resources/resources_oss/res/drawable-hdpi/status_icon_image_alphabet.png
Binary files differ
diff --git a/src/android/static_resources/resources_oss/res/drawable-hdpi/status_icon_image_hiragana.png b/src/android/static_resources/resources_oss/res/drawable-hdpi/status_icon_image_hiragana.png
index 990fc93..672aa8e 100644
--- a/src/android/static_resources/resources_oss/res/drawable-hdpi/status_icon_image_hiragana.png
+++ b/src/android/static_resources/resources_oss/res/drawable-hdpi/status_icon_image_hiragana.png
Binary files differ
diff --git a/src/android/static_resources/resources_oss/res/drawable-hdpi/window__background_dark.png b/src/android/static_resources/resources_oss/res/drawable-hdpi/window__background_dark.png
new file mode 100644
index 0000000..1601d35
--- /dev/null
+++ b/src/android/static_resources/resources_oss/res/drawable-hdpi/window__background_dark.png
Binary files differ
diff --git a/src/android/static_resources/resources_oss/res/drawable-xhdpi/status_icon_image_alphabet.png b/src/android/static_resources/resources_oss/res/drawable-xhdpi/status_icon_image_alphabet.png
index 63f9978..3bedc40 100644
--- a/src/android/static_resources/resources_oss/res/drawable-xhdpi/status_icon_image_alphabet.png
+++ b/src/android/static_resources/resources_oss/res/drawable-xhdpi/status_icon_image_alphabet.png
Binary files differ
diff --git a/src/android/static_resources/resources_oss/res/drawable-xhdpi/status_icon_image_hiragana.png b/src/android/static_resources/resources_oss/res/drawable-xhdpi/status_icon_image_hiragana.png
index 484d244..fbfe3fc 100644
--- a/src/android/static_resources/resources_oss/res/drawable-xhdpi/status_icon_image_hiragana.png
+++ b/src/android/static_resources/resources_oss/res/drawable-xhdpi/status_icon_image_hiragana.png
Binary files differ
diff --git a/src/android/static_resources/resources_oss/res/drawable/dropshadow_left.xml b/src/android/static_resources/resources_oss/res/drawable/dropshadow_left.xml
deleted file mode 100644
index 39f01ee..0000000
--- a/src/android/static_resources/resources_oss/res/drawable/dropshadow_left.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<shape xmlns:android="http://schemas.android.com/apk/res/android">
- <gradient android:startColor="@color/dropshadow_start"
- android:endColor="@color/dropshadow_end"
- android:angle="180" />
-</shape>
diff --git a/src/android/static_resources/resources_oss/res/drawable/dropshadow_right.xml b/src/android/static_resources/resources_oss/res/drawable/dropshadow_right.xml
deleted file mode 100644
index 97527b3..0000000
--- a/src/android/static_resources/resources_oss/res/drawable/dropshadow_right.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<shape xmlns:android="http://schemas.android.com/apk/res/android">
- <gradient android:startColor="@color/dropshadow_start"
- android:endColor="@color/dropshadow_end"
- android:angle="0" />
-</shape>
diff --git a/src/android/static_resources/resources_oss/res/drawable/dropshadow_top.xml b/src/android/static_resources/resources_oss/res/drawable/dropshadow_top.xml
deleted file mode 100644
index 4a4cc80..0000000
--- a/src/android/static_resources/resources_oss/res/drawable/dropshadow_top.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<shape xmlns:android="http://schemas.android.com/apk/res/android">
- <gradient android:startColor="@color/dropshadow_start"
- android:endColor="@color/dropshadow_end"
- android:angle="90" />
-</shape>
diff --git a/src/android/static_resources/resources_oss/res/layout/button_frame.xml b/src/android/static_resources/resources_oss/res/layout/button_frame.xml
new file mode 100644
index 0000000..c72c400
--- /dev/null
+++ b/src/android/static_resources/resources_oss/res/layout/button_frame.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:mozc="http://schemas.android.com/apk/res-auto"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:gravity="end"
+ android:orientation="horizontal" >
+
+ <org.mozc.android.inputmethod.japanese.view.MozcImageView
+ android:id="@+id/microphone_button"
+ android:layout_width="@dimen/button_frame_button_width"
+ android:layout_height="@dimen/button_frame_button_height"
+ android:layout_marginEnd="2dip"
+ android:layout_gravity="center_vertical"
+ android:contentDescription="@string/cd_voice_input"
+ android:paddingEnd="5dip"
+ android:paddingStart="5dip"
+ android:soundEffectsEnabled="false"
+ mozc:rawSrc="@raw/microphone"
+ mozc:maxImageHeight="@dimen/button_frame_microphone_height"
+ android:visibility="gone" />
+
+</LinearLayout>
diff --git a/src/android/static_resources/resources_oss/res/layout/candidate_view.xml b/src/android/static_resources/resources_oss/res/layout/candidate_view.xml
index 51080af..35b7dd6 100644
--- a/src/android/static_resources/resources_oss/res/layout/candidate_view.xml
+++ b/src/android/static_resources/resources_oss/res/layout/candidate_view.xml
@@ -30,8 +30,7 @@
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-->
<!-- This file is a part of CandidateView so please maintain in parallel. -->
-<org.mozc.android.inputmethod.japanese.CandidateView xmlns:android="http://schemas.android.com/apk/res/android"
- android:background="@color/candidate_background" >
+<org.mozc.android.inputmethod.japanese.CandidateView xmlns:android="http://schemas.android.com/apk/res/android" >
<LinearLayout
android:id="@+id/candidate_word_frame"
@@ -63,7 +62,7 @@
android:layout_height="0dip"
class="org.mozc.android.inputmethod.japanese.CandidateView$ConversionCandidateWordView" />
- <ToggleButton
+ <org.mozc.android.inputmethod.japanese.ui.InputFrameFoldButtonView
android:id="@+id/input_frame_fold_button"
android:layout_width="0dip"
android:layout_height="0dip"
@@ -72,6 +71,7 @@
android:minWidth="0dip"
android:textOff=""
android:textOn=""
+ android:soundEffectsEnabled="false"
android:contentDescription="@string/cd_keyboard_fold_button" />
</view>
@@ -79,8 +79,7 @@
android:id="@+id/candidate_scroll_guide_view"
android:layout_width="@dimen/candidate_scrollbar_width"
android:layout_height="fill_parent"
- android:layout_weight="0"
- android:background="@drawable/candidate__slidebar_background" />
+ android:layout_weight="0" />
</LinearLayout>
</org.mozc.android.inputmethod.japanese.CandidateView>
diff --git a/src/android/static_resources/resources_oss/res/layout/first_time_launch.xml b/src/android/static_resources/resources_oss/res/layout/first_time_launch.xml
index ee64b84..9cff310 100644
--- a/src/android/static_resources/resources_oss/res/layout/first_time_launch.xml
+++ b/src/android/static_resources/resources_oss/res/layout/first_time_launch.xml
@@ -31,8 +31,7 @@
-->
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:background="@android:color/black" >
+ android:layout_height="wrap_content" >
<LinearLayout
android:layout_width="fill_parent"
diff --git a/src/android/static_resources/resources_oss/res/layout/left_frame.xml b/src/android/static_resources/resources_oss/res/layout/left_frame.xml
index eb569b1..e7afed0 100644
--- a/src/android/static_resources/resources_oss/res/layout/left_frame.xml
+++ b/src/android/static_resources/resources_oss/res/layout/left_frame.xml
@@ -36,59 +36,10 @@
android:layout_gravity="right"
android:visibility="gone" >
- <FrameLayout
- android:id="@+id/left_dropshadow"
- android:layout_width="@dimen/translucent_border_height"
- android:layout_height="fill_parent"
- android:layout_gravity="bottom|right"
- android:orientation="vertical" >
-
- <LinearLayout
- android:id="@+id/left_dropshadow_short"
- android:layout_width="fill_parent"
- android:layout_height="@dimen/input_frame_height_with_shadow"
- android:layout_gravity="bottom"
- android:orientation="vertical" >
-
- <ImageView
- android:id="@+id/dropshadow_left_short_top"
- android:layout_width="fill_parent"
- android:layout_height="@dimen/translucent_border_height" />
-
- <ImageView
- android:id="@+id/dropshadow_left_short_bottom"
- android:layout_width="fill_parent"
- android:layout_height="0dip"
- android:layout_weight="1"
- android:background="@drawable/dropshadow_left" />
- </LinearLayout>
-
- <LinearLayout
- android:id="@+id/left_dropshadow_long"
- android:layout_width="fill_parent"
- android:layout_height="@dimen/ime_window_height"
- android:layout_gravity="bottom"
- android:orientation="vertical"
- android:visibility="gone" >
-
- <ImageView
- android:id="@+id/dropshadow_left_long_top"
- android:layout_width="fill_parent"
- android:layout_height="@dimen/translucent_border_height" />
-
- <ImageView
- android:id="@+id/dropshadow_left_long_bottom"
- android:layout_width="fill_parent"
- android:layout_height="0dip"
- android:layout_weight="1"
- android:background="@drawable/dropshadow_left" />
- </LinearLayout>
- </FrameLayout>
-
<ImageView
android:id="@+id/left_adjust_button"
android:layout_width="@dimen/side_adjust_button_width"
android:layout_height="@dimen/side_adjust_button_height"
android:layout_gravity="bottom|right"
android:layout_marginBottom="100dip" />
-</FrameLayout>
\ No newline at end of file
+</FrameLayout>
diff --git a/src/android/static_resources/resources_oss/res/layout/mozc_view.xml b/src/android/static_resources/resources_oss/res/layout/mozc_view.xml
index 2d780b5..2825438 100644
--- a/src/android/static_resources/resources_oss/res/layout/mozc_view.xml
+++ b/src/android/static_resources/resources_oss/res/layout/mozc_view.xml
@@ -30,7 +30,8 @@
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-->
<!-- This file is a part of ViewManager so please maintain in parallel. -->
-<!-- MozcView hierarchy
+<!--
+MozcView hierarchy
Syntax:
"Type parent-id
@@ -44,213 +45,232 @@
Linear-H: LinearLayout orientation=horizontal
Image: ImageView
-MozcView(Linear-V)
- View overlay_view
+MozcView(Frame)
+ Linear-V
+ View overlay_view
- Frame bottom_frame
- View bottom_background
+ Frame bottom_frame
+ View bottom_background
- Linear-H foreground_frame
- Frame left_frame
- Frame left_dropshadow
- Linear left_dropshadow_short
- Image dropshadow_left_short_top
- Image dropshadow_left_short_bottom
- Linear left_dropshadow_long
- Image dropshadow_left_long_top
- Image dropshadow_left_long_bottom
- Image left_adjust_botton
+ Linear-H foreground_frame
+ Frame left_frame
+ Image left_adjust_botton
- Linear-V center_frame
- Image dropshadow_top
- Frame input_frame
- Linear-V textinput_frame
- Frame
- CandidateView candidate_view
- Image dropshadow
+ Linear-V center_frame
+ Frame input_frame
+ Linear-V textinput_frame
+ Frame
+ Linear-H button_frame
+ CandidateView candidate_view
- Frame narrow_frame
- Image hardware_composition_button
- Image widen_button
+ NarrowFrameView narrow_frame
+ View narrow_frame_separator
+ Frame
+ Image hardware_composition_button
+ Image widen_button
- Frame keyboard_frame
- JapaneseKeyboardView keyboard_view
+ Frame keyboard_frame
+ JapaneseKeyboardView keyboard_view
- SymbolInputView symbol_input_view
+ SymbolInputView symbol_input_view
- Frame right_frame
- Linear right_dropshadow
- Linear right_dropshadow_short
- Image dropshadow_right_short_top
- Image dropshadow_right_short_bottom
- Linear right_dropshadow_long
- Image dropshadow_right_long_top
- Image dropshadow_right_long_bottom
- Image right_adjust_botton
- -->
-<org.mozc.android.inputmethod.japanese.MozcView xmlns:android="http://schemas.android.com/apk/res/android"
+ Frame right_frame
+ Image right_adjust_botton
+
+ FloatingCandidateView floating_candidate_view
+-->
+<org.mozc.android.inputmethod.japanese.MozcView
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:mozc="http://schemas.android.com/apk/res-auto"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
- android:layout_gravity="bottom"
- android:gravity="bottom"
- android:orientation="vertical"
android:visibility="gone" >
-<!--
+
+ <LinearLayout
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:layout_gravity="bottom"
+ android:gravity="bottom"
+ android:orientation="vertical" >
+
+ <!--
This invisible view overlays on target activity
and makes a touchable region during candidate dragging.
- -->
-
- <View
- android:id="@+id/overlay_view"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:visibility="invisible" />
-
- <FrameLayout
- android:id="@+id/bottom_frame"
- android:layout_width="fill_parent"
- android:layout_height="@dimen/ime_window_height"
- android:gravity="bottom" >
-
+ TODO(hsumita): Remove overlay view if it is no longer necessary.
+ -->
<View
- android:id="@+id/bottom_background"
+ android:id="@+id/overlay_view"
android:layout_width="fill_parent"
- android:layout_height="@dimen/input_frame_height"
- android:layout_gravity="bottom" />
+ android:layout_height="0dip"
+ android:layout_weight="1" />
- <LinearLayout
- android:id="@+id/foreground_frame"
+ <FrameLayout
+ android:id="@+id/bottom_frame"
android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:layout_gravity="bottom"
+ android:layout_height="@dimen/ime_window_height"
android:gravity="bottom"
- android:orientation="horizontal" >
+ android:layout_weight="0" >
- <ViewStub
- android:id="@+id/stub_left_frame"
- android:inflatedId="@+id/left_frame"
- android:layout="@layout/left_frame"
- android:layout_width="@dimen/side_frame_width"
- android:layout_height="fill_parent"
- android:layout_gravity="right"
- android:visibility="gone" />
+ <View
+ android:id="@+id/bottom_background"
+ android:layout_width="fill_parent"
+ android:layout_height="@dimen/input_frame_height"
+ android:layout_gravity="bottom" />
<LinearLayout
- android:id="@+id/center_frame"
- android:layout_width="0dip"
- android:layout_weight="1"
+ android:id="@+id/foreground_frame"
+ android:layout_width="fill_parent"
android:layout_height="fill_parent"
+ android:layout_gravity="bottom"
android:gravity="bottom"
- android:orientation="vertical" >
+ android:orientation="horizontal" >
- <ImageView
- android:id="@+id/dropshadow_top"
- android:layout_width="fill_parent"
- android:layout_height="@dimen/translucent_border_height"
- android:background="@drawable/dropshadow_top"
- android:visibility="invisible" />
-
- <FrameLayout
- android:id="@+id/input_frame"
- android:layout_width="fill_parent"
+ <ViewStub
+ android:id="@+id/stub_left_frame"
+ android:layout_width="@dimen/side_frame_width"
android:layout_height="fill_parent"
- android:gravity="bottom" >
+ android:layout_gravity="right"
+ android:inflatedId="@+id/left_frame"
+ android:layout="@layout/left_frame"
+ android:visibility="gone" />
- <LinearLayout
- android:id="@+id/textinput_frame"
+ <LinearLayout
+ android:id="@+id/center_frame"
+ android:layout_width="0dip"
+ android:layout_height="fill_parent"
+ android:layout_weight="1"
+ android:gravity="bottom"
+ android:orientation="vertical" >
+
+ <FrameLayout
+ android:id="@+id/input_frame"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
- android:layout_gravity="bottom"
- android:baselineAligned="false"
- android:gravity="bottom"
- android:orientation="vertical" >
+ android:gravity="bottom" >
+
+ <LinearLayout
+ android:id="@+id/textinput_frame"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"
+ android:layout_gravity="bottom"
+ android:baselineAligned="false"
+ android:gravity="bottom"
+ android:orientation="vertical" >
+
+ <!--
+ An include tag must have the attributes which the included tag has,
+ otherwise LayoutInflator.inflate causes memory leak.
+ -->
+
+ <FrameLayout
+ android:layout_width="fill_parent"
+ android:layout_height="0dip"
+ android:layout_weight="1" >
+
+ <include
+ android:id="@+id/button_frame"
+ android:layout_width="fill_parent"
+ android:layout_height="@dimen/button_frame_height"
+ android:layout_gravity="fill_horizontal|bottom"
+ layout="@layout/button_frame" />
+
+ <include
+ android:id="@+id/candidate_view"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"
+ layout="@layout/candidate_view" />
+ </FrameLayout>
+
+ <org.mozc.android.inputmethod.japanese.NarrowFrameView
+ android:id="@+id/narrow_frame"
+ android:layout_width="fill_parent"
+ android:layout_height="@dimen/narrow_frame_height"
+ android:layout_gravity="bottom"
+ android:orientation="vertical"
+ android:visibility="gone" >
+
+ <View
+ android:id="@+id/narrow_frame_separator"
+ android:layout_width="fill_parent"
+ android:layout_height="1dip"
+ android:layout_gravity="top" />
+
+ <FrameLayout
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"
+ android:layout_gravity="bottom" >
+
+ <org.mozc.android.inputmethod.japanese.view.MozcImageView
+ android:id="@+id/hardware_composition_button"
+ android:layout_width="64dip"
+ android:layout_height="fill_parent"
+ android:layout_gravity="left|bottom"
+ android:soundEffectsEnabled="false"
+ mozc:maxImageHeight="@dimen/default_function_icon_height" />
+
+ <org.mozc.android.inputmethod.japanese.view.MozcImageView
+ android:id="@+id/widen_button"
+ android:layout_width="64dip"
+ android:layout_height="fill_parent"
+ android:layout_gravity="right|bottom"
+ android:soundEffectsEnabled="false"
+ android:contentDescription="@string/cd_narrow_frame_widen_button"
+ mozc:maxImageHeight="@dimen/default_function_icon_height" />
+ </FrameLayout>
+ </org.mozc.android.inputmethod.japanese.NarrowFrameView>
+
+ <FrameLayout
+ android:id="@+id/keyboard_frame"
+ android:layout_width="fill_parent"
+ android:layout_height="@dimen/input_frame_height" >
+
+ <org.mozc.android.inputmethod.japanese.keyboard.KeyboardView
+ android:id="@+id/keyboard_view"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent" />
+
+ <View
+ android:id="@+id/keyboard_frame_separator"
+ android:layout_width="fill_parent"
+ android:layout_height="1dip"
+ android:layout_gravity="top" />
+ </FrameLayout>
+ </LinearLayout>
<!--
- An include tag must have the attributes which the
- included tag has, otherwise LayoutInflator.inflate
- causes memory leak.
- -->
+ In order not to send tapping events of "unclickable region" on
+ SymbolInputView to behind views (usually keyboard view), we set
+ "clickable=true" to this view, so that this view consumes click
+ events. -->
- <FrameLayout
+ <org.mozc.android.inputmethod.japanese.SymbolInputView
+ android:id="@+id/symbol_input_view"
android:layout_width="fill_parent"
- android:layout_height="0dip"
- android:layout_weight="1" >
-
- <include
- android:id="@+id/candidate_view"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- layout="@layout/candidate_view" />
-
- <ImageView
- android:layout_width="fill_parent"
- android:layout_height="@dimen/translucent_border_height"
- android:layout_gravity="fill_horizontal|bottom"
- android:background="@drawable/dropshadow_top" />
- </FrameLayout>
-
- <FrameLayout
- android:id="@+id/narrow_frame"
- android:layout_width="fill_parent"
- android:layout_height="@dimen/narrow_frame_height"
+ android:layout_height="@dimen/symbol_view_height"
android:layout_gravity="bottom"
- android:background="@color/keyboard_background"
- android:visibility="gone" >
+ android:clickable="true"
+ android:visibility="gone"
+ android:soundEffectsEnabled="false" />
+ </FrameLayout>
+ </LinearLayout>
- <ImageView
- android:id="@+id/hardware_composition_button"
- android:layout_width="64dip"
- android:layout_height="fill_parent"
- android:layout_gravity="left|bottom" />
-
- <ImageView
- android:id="@+id/widen_button"
- android:layout_width="64dip"
- android:layout_height="fill_parent"
- android:layout_gravity="right|bottom" />
- </FrameLayout>
-
- <FrameLayout
- android:id="@+id/keyboard_frame"
- android:layout_width="fill_parent"
- android:layout_height="@dimen/input_frame_height" >
-
- <org.mozc.android.inputmethod.japanese.JapaneseKeyboardView
- android:id="@+id/keyboard_view"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent" />
- </FrameLayout>
- </LinearLayout>
-
- <!--
- In order not to send tapping events of "unclickable region" on
- SymbolInputView to behind views (usually keyboard view), we set
- "clickable=true" to this view, so that this view consumes click
- events. Otherwise, for example, assuming a user uses
- qwerty-layout and opens symbol input view connecting to a text
- field which doesn't support emoji, user can open CursorView
- by tapping (a part of) emoji-major-category-button (because
- the cursor view open button is very "close" to the major category
- button, regardless of the keyboard view's visibility).
- -->
-
- <org.mozc.android.inputmethod.japanese.SymbolInputView
- android:id="@+id/symbol_input_view"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:clickable="true"
- android:visibility="gone" />
- </FrameLayout>
+ <ViewStub
+ android:id="@+id/stub_right_frame"
+ android:layout_width="@dimen/side_frame_width"
+ android:layout_height="fill_parent"
+ android:layout_gravity="right"
+ android:inflatedId="@+id/right_frame"
+ android:layout="@layout/right_frame"
+ android:visibility="gone" />
</LinearLayout>
+ </FrameLayout>
+ </LinearLayout>
- <ViewStub
- android:id="@+id/stub_right_frame"
- android:inflatedId="@+id/right_frame"
- android:layout="@layout/right_frame"
- android:layout_width="@dimen/side_frame_width"
- android:layout_height="fill_parent"
- android:layout_gravity="right"
- android:visibility="gone" />
- </LinearLayout>
- </FrameLayout>
+ <!-- TODO(hsumita): Replace this view by ViewStub for performance. -->
+ <org.mozc.android.inputmethod.japanese.FloatingCandidateView
+ android:id="@+id/floating_candidate_view"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"
+ android:visibility="gone" />
+
</org.mozc.android.inputmethod.japanese.MozcView>
diff --git a/src/android/static_resources/resources_oss/res/layout/right_frame.xml b/src/android/static_resources/resources_oss/res/layout/right_frame.xml
index 2ba07eb..55931ac 100644
--- a/src/android/static_resources/resources_oss/res/layout/right_frame.xml
+++ b/src/android/static_resources/resources_oss/res/layout/right_frame.xml
@@ -31,66 +31,15 @@
-->
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/right_frame"
android:layout_width="@dimen/side_frame_width"
android:layout_height="fill_parent"
android:layout_gravity="left"
android:visibility="gone" >
- <FrameLayout
- android:id="@+id/right_dropshadow"
- android:layout_width="@dimen/translucent_border_height"
- android:layout_height="fill_parent"
- android:layout_gravity="bottom|left"
- android:orientation="vertical" >
-
- <LinearLayout
- android:id="@+id/right_dropshadow_short"
- android:layout_width="fill_parent"
- android:layout_height="@dimen/input_frame_height_with_shadow"
- android:layout_gravity="bottom"
- android:orientation="vertical" >
-
- <ImageView
- android:id="@+id/dropshadow_right_short_top"
- android:layout_width="fill_parent"
- android:layout_height="@dimen/translucent_border_height" />
-
- <ImageView
- android:id="@+id/dropshadow_right_short_bottom"
- android:layout_width="fill_parent"
- android:layout_height="0dip"
- android:layout_weight="1"
- android:background="@drawable/dropshadow_right" />
- </LinearLayout>
-
- <LinearLayout
- android:id="@+id/right_dropshadow_long"
- android:layout_width="fill_parent"
- android:layout_height="@dimen/ime_window_height"
- android:layout_gravity="bottom"
- android:orientation="vertical"
- android:visibility="gone" >
-
- <ImageView
- android:id="@+id/dropshadow_right_long_top"
- android:layout_width="fill_parent"
- android:layout_height="@dimen/translucent_border_height" />
-
- <ImageView
- android:id="@+id/dropshadow_right_long_bottom"
- android:layout_width="fill_parent"
- android:layout_height="0dip"
- android:layout_weight="1"
- android:background="@drawable/dropshadow_right" />
- </LinearLayout>
- </FrameLayout>
-
<ImageView
android:id="@+id/right_adjust_button"
android:layout_width="@dimen/side_adjust_button_width"
android:layout_height="@dimen/side_adjust_button_height"
android:layout_gravity="bottom|left"
android:layout_marginBottom="100dip" />
-
-</FrameLayout>
\ No newline at end of file
+</FrameLayout>
diff --git a/src/android/static_resources/resources_oss/res/layout/symbol_candidate_view.xml b/src/android/static_resources/resources_oss/res/layout/symbol_candidate_view.xml
index a45a8fe..9f7718e 100644
--- a/src/android/static_resources/resources_oss/res/layout/symbol_candidate_view.xml
+++ b/src/android/static_resources/resources_oss/res/layout/symbol_candidate_view.xml
@@ -40,7 +40,6 @@
android:orientation="horizontal" >
<view
android:id="@+id/symbol_input_candidate_view"
- android:background="@color/input_frame_background"
android:layout_width="0dip"
android:layout_height="fill_parent"
android:layout_weight="1"
@@ -50,8 +49,7 @@
android:id="@+id/symbol_input_scroll_guide_view"
android:layout_width="@dimen/candidate_scrollbar_width"
android:layout_height="fill_parent"
- android:layout_weight="0"
- android:background="@drawable/candidate__slidebar_background" />
+ android:layout_weight="0" />
</LinearLayout>
<!-- Following LinearLayout is shown only when there is no candidate. -->
@@ -69,7 +67,6 @@
android:layout_height="fill_parent"
android:gravity="center"
android:text="@string/symbol_input_no_history"
- android:textColor="@android:color/black"
android:textSize="@dimen/symbol_view_no_history_text_size" />
<ImageView
@@ -79,10 +76,4 @@
android:background="@drawable/symbol__category_indicator_right" />
</FrameLayout>
- <!-- Drop shadow between candidates and minor category tabs. -->
- <View
- android:layout_width="fill_parent"
- android:layout_height="@dimen/translucent_border_height"
- android:background="@drawable/dropshadow_top"
- android:layout_gravity="bottom" />
</FrameLayout>
\ No newline at end of file
diff --git a/src/android/static_resources/resources_oss/res/layout/symbol_view.xml b/src/android/static_resources/resources_oss/res/layout/symbol_view.xml
index 5b5c728..9e26336 100644
--- a/src/android/static_resources/resources_oss/res/layout/symbol_view.xml
+++ b/src/android/static_resources/resources_oss/res/layout/symbol_view.xml
@@ -30,7 +30,9 @@
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-->
-<merge xmlns:android="http://schemas.android.com/apk/res/android"
+<merge
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:mozc="http://schemas.android.com/apk/res-auto"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:clickable="true" >
@@ -54,18 +56,60 @@
<TabHost
android:id="@android:id/tabhost"
android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:background="@android:color/white" >
+ android:layout_height="fill_parent" >
- <RelativeLayout
+ <LinearLayout
android:layout_width="fill_parent"
- android:layout_height="fill_parent" >
+ android:layout_height="fill_parent"
+ android:orientation="vertical" >
+
+ <FrameLayout
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content" >
+
+ <LinearLayout
+ android:id="@+id/symbol_minor_category"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal" >
+
+ <TabWidget
+ android:id="@android:id/tabs"
+ android:layout_width="0dip"
+ android:layout_height="@dimen/button_frame_height"
+ android:layout_weight="6"
+ android:showDividers="none" />
+
+ <View
+ android:id="@+id/symbol_view_backspace_separator"
+ android:layout_width="1dip"
+ android:layout_height="fill_parent"
+ android:layout_weight="0" />
+
+ <org.mozc.android.inputmethod.japanese.view.MozcImageView
+ android:id="@+id/symbol_view_delete_button"
+ android:layout_width="0dip"
+ android:layout_height="fill_parent"
+ android:layout_gravity="center"
+ android:layout_weight="1"
+ android:contentDescription="@string/cd_symbol_window_backspace"
+ android:focusable="true"
+ android:scaleType="fitCenter"
+ mozc:rawSrc="@raw/twelvekeys__function__delete__icon"
+ mozc:maxImageHeight="@dimen/default_function_icon_height" />
+ </LinearLayout>
+ </FrameLayout>
+
+ <View
+ android:id="@+id/symbol_separator_1"
+ android:layout_width="fill_parent"
+ android:layout_height="1dip" />
<android.support.v4.view.ViewPager
android:id="@+id/symbol_input_candidate_view_pager"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
- android:layout_above="@android:id/tabs" >
+ android:soundEffectsEnabled="false" >
<FrameLayout
android:id="@android:id/tabcontent"
@@ -73,31 +117,70 @@
android:layout_height="fill_parent"
android:visibility="gone" >
- <View
- android:id="@+id/symbol_input_dummy"
- android:layout_width="0dip"
- android:layout_height="0dip"
- android:minHeight="0dip"
- android:minWidth="0dip" />
+ <View
+ android:id="@+id/symbol_input_dummy"
+ android:layout_width="0dip"
+ android:layout_height="0dip"
+ android:minHeight="0dip"
+ android:minWidth="0dip" />
</FrameLayout>
</android.support.v4.view.ViewPager>
-
- <TabWidget
- android:id="@android:id/tabs"
- android:layout_width="fill_parent"
- android:layout_height="@dimen/symbol_view_minor_category_tab_widget_height"
- android:layout_alignParentBottom="true"
- android:background="@color/symbol_view_tab_background" />
- </RelativeLayout>
+ </LinearLayout>
</TabHost>
- <!-- Drop shadow between minor category tabs and major category buttons. -->
-
- <View
+ <FrameLayout
+ android:id="@+id/number_frame"
android:layout_width="fill_parent"
- android:layout_height="@dimen/translucent_border_height"
- android:layout_gravity="bottom"
- android:background="@drawable/dropshadow_top" />
+ android:layout_height="fill_parent">
+
+ <LinearLayout
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"
+ android:layout_gravity="bottom"
+ android:orientation="vertical" >
+
+ <FrameLayout
+ android:layout_width="fill_parent"
+ android:layout_height="0dip"
+ android:layout_weight="1" >
+
+ <!--
+ An include tag must have the attributes which the included tag has,
+ otherwise LayoutInflator.inflate causes memory leak.
+ -->
+
+ <include
+ android:id="@+id/button_frame_in_symbol_view"
+ android:layout_width="fill_parent"
+ android:layout_height="@dimen/button_frame_height"
+ layout="@layout/button_frame" />
+
+ <include
+ android:id="@+id/candidate_view_in_symbol_view"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"
+ layout="@layout/candidate_view" />
+ </FrameLayout>
+
+ <FrameLayout
+ android:id="@+id/number_keyboard_frame"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content" >
+
+ <org.mozc.android.inputmethod.japanese.keyboard.KeyboardView
+ android:id="@+id/number_keyboard"
+ android:layout_width="fill_parent"
+ android:layout_height="@dimen/symbol_view_number_keyboard_height" />
+
+ <View
+ android:id="@+id/symbol_separator_3"
+ android:layout_width="fill_parent"
+ android:layout_height="1dip"
+ android:layout_gravity="top" />
+ </FrameLayout>
+
+ </LinearLayout>
+ </FrameLayout>
<!-- Displayed when emoji major category is selected on the non-emoji-allowed text view. -->
@@ -114,6 +197,12 @@
android:textColor="@android:color/white"
android:textSize="20dip"
android:visibility="gone" />
+
+ <View
+ android:id="@+id/symbol_separator_2"
+ android:layout_width="fill_parent"
+ android:layout_height="1dip"
+ android:layout_gravity="bottom" />
</FrameLayout>
<LinearLayout
@@ -124,70 +213,89 @@
android:paddingBottom="2dip"
android:paddingLeft="1dip"
android:paddingRight="1dip"
- android:paddingTop="2dip" >
+ android:paddingTop="2dip"
+ android:soundEffectsEnabled="false" >
- <ImageButton
+ <org.mozc.android.inputmethod.japanese.view.MozcImageView
android:id="@+id/symbol_view_close_button"
android:layout_width="0dip"
android:layout_height="fill_parent"
android:layout_gravity="center"
- android:layout_weight="1"
+ android:layout_weight="17.3"
android:contentDescription="@string/cd_close_symbol_window"
- android:scaleType="fitCenter" />
+ android:scaleType="fitCenter"
+ android:soundEffectsEnabled="false"
+ mozc:rawSrc="@raw/symbol__function__close"
+ mozc:maxImageWidth="@dimen/symbol_close_button_width" />
- <!--
- TODO(matsuzakit): padding{Bottom,Top} is just a work around.
- Fixing the images themselves might be preferable.
- -->
+ <View
+ android:id="@+id/symbol_view_close_button_separator"
+ android:layout_width="1dip"
+ android:layout_height="fill_parent"
+ android:layout_weight="0" />
- <LinearLayout
- android:id="@+id/category_selector_major"
+ <org.mozc.android.inputmethod.japanese.view.MozcImageButton
+ android:id="@+id/category_selector_major_number"
android:layout_width="0dip"
android:layout_height="fill_parent"
- android:layout_marginLeft="3dip"
- android:layout_marginRight="3dip"
- android:layout_weight="5"
- android:gravity="center"
- android:paddingBottom="1dip"
- android:paddingTop="2dip" >
+ android:layout_weight="16.55"
+ android:contentDescription="@string/cd_symbol_window_number"
+ android:padding="0dip"
+ android:scaleType="fitCenter"
+ android:soundEffectsEnabled="false"
+ mozc:maxImageHeight="@dimen/symbol_major_number_height" />
- <ImageButton
- android:id="@+id/category_selector_major_symbol"
- android:layout_width="0dip"
- android:layout_height="fill_parent"
- android:layout_weight="1"
- android:contentDescription="@string/cd_symbol_window_symbol"
- android:padding="0dip"
- android:scaleType="fitCenter" />
+ <org.mozc.android.inputmethod.japanese.view.MozcImageButton
+ android:id="@+id/category_selector_major_symbol"
+ android:layout_width="0dip"
+ android:layout_height="fill_parent"
+ android:layout_weight="16.55"
+ android:contentDescription="@string/cd_symbol_window_symbol"
+ android:padding="0dip"
+ android:scaleType="fitCenter"
+ android:soundEffectsEnabled="false"
+ mozc:maxImageHeight="@dimen/symbol_major_symbol_height" />
- <ImageButton
- android:id="@+id/category_selector_major_emoticon"
- android:layout_width="0dip"
- android:layout_height="fill_parent"
- android:layout_weight="1"
- android:contentDescription="@string/cd_symbol_window_emoticon"
- android:padding="0dip"
- android:scaleType="fitCenter" />
+ <org.mozc.android.inputmethod.japanese.view.MozcImageButton
+ android:id="@+id/category_selector_major_emoticon"
+ android:layout_width="0dip"
+ android:layout_height="fill_parent"
+ android:layout_weight="16.55"
+ android:contentDescription="@string/cd_symbol_window_emoticon"
+ android:padding="0dip"
+ android:scaleType="fitCenter"
+ android:soundEffectsEnabled="false"
+ mozc:maxImageHeight="@dimen/symbol_major_emoticon_height" />
- <ImageButton
- android:id="@+id/category_selector_major_emoji"
- android:layout_width="0dip"
- android:layout_height="fill_parent"
- android:layout_weight="1"
- android:contentDescription="@string/cd_symbol_window_emoji"
- android:padding="0dip"
- android:scaleType="fitCenter" />
- </LinearLayout>
+ <org.mozc.android.inputmethod.japanese.view.MozcImageButton
+ android:id="@+id/category_selector_major_emoji"
+ android:layout_width="0dip"
+ android:layout_height="fill_parent"
+ android:layout_weight="16.55"
+ android:contentDescription="@string/cd_symbol_window_emoji"
+ android:padding="0dip"
+ android:scaleType="fitCenter"
+ android:soundEffectsEnabled="false"
+ mozc:maxImageHeight="@dimen/symbol_major_emoji_height" />
- <ImageButton
- android:id="@+id/symbol_view_delete_button"
+ <View
+ android:id="@+id/symbol_view_enter_button_separator"
+ android:layout_width="1dip"
+ android:layout_height="fill_parent"
+ android:layout_weight="0" />
+
+ <org.mozc.android.inputmethod.japanese.view.MozcImageView
+ android:id="@+id/symbol_view_enter_button"
android:layout_width="0dip"
android:layout_height="fill_parent"
android:layout_gravity="center"
- android:layout_weight="1"
- android:contentDescription="@string/cd_symbol_window_backspace"
- android:scaleType="fitCenter" />
+ android:layout_weight="17.3"
+ android:contentDescription="@string/cd_symbol_window_enter"
+ android:focusable="true"
+ android:scaleType="fitCenter"
+ mozc:rawSrc="@raw/function__enter__icon"
+ mozc:maxImageWidth="@dimen/keyboard_enter_width" />
</LinearLayout>
</LinearLayout>
-</merge>
\ No newline at end of file
+</merge>
diff --git a/src/android/static_resources/resources_oss/res/layout/user_dictionary_tool_action_bar_view.xml b/src/android/static_resources/resources_oss/res/layout/user_dictionary_tool_action_bar_view.xml
deleted file mode 100644
index 47db29a..0000000
--- a/src/android/static_resources/resources_oss/res/layout/user_dictionary_tool_action_bar_view.xml
+++ /dev/null
@@ -1,76 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/actionbar_compatibility"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:background="@color/action_bar_background"
- android:orientation="horizontal">
- <!-- Application icon and title. -->
- <ImageView
- android:src="@drawable/application_icon"
- android:scaleType="center"
- android:layout_width="56dp"
- android:layout_height="fill_parent" />
-
- <TextView
- android:text="@string/user_dictionary_tool_app_name"
- android:layout_width="0dip"
- android:layout_height="fill_parent"
- android:layout_weight="1"
- android:gravity="center_vertical"
- android:textSize="18sp"
- android:paddingLeft="6dp"
- android:paddingRight="6dp"
- android:singleLine="true"
- android:ellipsize="marquee"
- android:textColor="@android:color/black" />
-
- <!-- Menu icons. -->
- <ImageView
- android:id="@+id/user_dictionary_tool_action_bar_add_entry"
- android:src="@android:drawable/ic_menu_add"
- android:clickable="true"
- android:layout_width="48dp"
- android:layout_height="fill_parent"
- android:gravity="center_vertical"
- android:background="@drawable/action_bar_item_background" />
-
- <ImageView
- android:id="@+id/user_dictionary_tool_action_bar_delete_entry"
- android:src="@android:drawable/ic_menu_delete"
- android:clickable="true"
- android:layout_width="48dp"
- android:layout_height="fill_parent"
- android:gravity="center_vertical"
- android:background="@drawable/action_bar_item_background" />
-</LinearLayout>
diff --git a/src/android/static_resources/resources_oss/res/layout/user_dictionary_tool_dictionary_name_dialog_view.xml b/src/android/static_resources/resources_oss/res/layout/user_dictionary_tool_dictionary_name_dialog_view.xml
index 6a77280..d73ae87 100644
--- a/src/android/static_resources/resources_oss/res/layout/user_dictionary_tool_dictionary_name_dialog_view.xml
+++ b/src/android/static_resources/resources_oss/res/layout/user_dictionary_tool_dictionary_name_dialog_view.xml
@@ -35,7 +35,6 @@
android:orientation="vertical" >
<TextView
- style="@style/MozcDialogTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingLeft="8dip"
diff --git a/src/android/static_resources/resources_oss/res/layout/user_dictionary_tool_empty_scrollview.xml b/src/android/static_resources/resources_oss/res/layout/user_dictionary_tool_empty_scrollview.xml
deleted file mode 100644
index c638060..0000000
--- a/src/android/static_resources/resources_oss/res/layout/user_dictionary_tool_empty_scrollview.xml
+++ /dev/null
@@ -1,65 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- An empty ScrollView to wrap content view of dialogs.
- It is necessary to set scrollbars="none" in order to make scroll bar
- invisible. -->
-<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:fillViewport="true"
- android:scrollbars="none">
- <!-- Note: there is a bug on ScrollView to put the content in the center of the pane.
- What we want to do here is:
- - Show the content with "wrap_content" size at the (vertically) center of ScrollView
- if it's large enough.
- - Otherwise, show the simple ScrollView as usual.
- This is the work around of the bug.
- -->
- <LinearLayout
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:orientation="vertical">
- <View
- android:layout_width="fill_parent"
- android:layout_height="0dip"
- android:layout_weight="1" />
- <FrameLayout
- android:id="@+id/user_dictionary_tool_empty_scroll_view_content"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:layout_gravity="center" />
- <View
- android:layout_width="fill_parent"
- android:layout_height="0dip"
- android:layout_weight="1" />
- </LinearLayout>
-</ScrollView>
diff --git a/src/android/static_resources/resources_oss/res/layout/user_dictionary_tool_view.xml b/src/android/static_resources/resources_oss/res/layout/user_dictionary_tool_view.xml
index 9d4367f..709cc0e 100644
--- a/src/android/static_resources/resources_oss/res/layout/user_dictionary_tool_view.xml
+++ b/src/android/static_resources/resources_oss/res/layout/user_dictionary_tool_view.xml
@@ -45,43 +45,4 @@
android:layout_height="fill_parent"
android:layout_below="@+id/user_dictionary_tool_dictionary_name_spinner"
android:layout_above="@+id/user_dictionary_tool_split_action_bar" />
-
- <!-- Self implementation of SplitActionBar for older devices, such as Android 2.3 or earlier. -->
- <LinearLayout
- android:id="@+id/user_dictionary_tool_split_action_bar"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:layout_alignParentBottom="true"
- android:background="@color/action_bar_background"
- android:orientation="vertical"
- android:visibility="gone">
- <!-- Thin shade of Split action bar. -->
- <View
- android:layout_width="fill_parent"
- android:layout_height="1dip"
- android:background="@color/action_bar_background_shade" />
-
- <RelativeLayout
- android:layout_width="fill_parent"
- android:layout_height="48dip"
- android:orientation="horizontal">
- <ImageView
- android:id="@+id/user_dictionary_tool_split_action_bar_add_entry"
- android:src="@android:drawable/ic_menu_add"
- android:clickable="true"
- android:layout_alignParentLeft="true"
- android:layout_width="48dip"
- android:layout_height="fill_parent"
- android:background="@drawable/action_bar_item_background" />
-
- <ImageView
- android:id="@+id/user_dictionary_tool_split_action_bar_delete_entry"
- android:src="@android:drawable/ic_menu_delete"
- android:clickable="true"
- android:layout_alignParentRight="true"
- android:layout_width="48dip"
- android:layout_height="fill_parent"
- android:background="@drawable/action_bar_item_background"/>
- </RelativeLayout>
- </LinearLayout>
</RelativeLayout>
diff --git a/src/android/static_resources/resources_oss/res/layout/user_dictionary_tool_word_register_dialog_view.xml b/src/android/static_resources/resources_oss/res/layout/user_dictionary_tool_word_register_dialog_view.xml
index a0c77b5..30f51ee 100644
--- a/src/android/static_resources/resources_oss/res/layout/user_dictionary_tool_word_register_dialog_view.xml
+++ b/src/android/static_resources/resources_oss/res/layout/user_dictionary_tool_word_register_dialog_view.xml
@@ -39,7 +39,6 @@
android:paddingTop="9dip" >
<TextView
- style="@style/MozcDialogTextView"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:paddingLeft="8dip"
@@ -57,7 +56,6 @@
</EditText>
<TextView
- style="@style/MozcDialogTextView"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:paddingLeft="8dip"
@@ -72,7 +70,6 @@
android:selectAllOnFocus="true" />
<TextView
- style="@style/MozcDialogTextView"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:paddingLeft="8dip"
diff --git a/src/android/static_resources/resources_oss/res/menu/user_dictionary_tool_menu.xml b/src/android/static_resources/resources_oss/res/menu/user_dictionary_tool_menu.xml
index 861ec54..3ee86c5 100644
--- a/src/android/static_resources/resources_oss/res/menu/user_dictionary_tool_menu.xml
+++ b/src/android/static_resources/resources_oss/res/menu/user_dictionary_tool_menu.xml
@@ -51,7 +51,9 @@
android:showAsAction="never" />
<item android:id="@+id/user_dictionary_tool_menu_export_dictionary"
android:title="@string/user_dictionary_tool_menu_export_dictionary_title"
- android:showAsAction="never" />
+ android:showAsAction="never"
+ android:enabled="@bool/enable_user_dictionary_export"
+ android:visible="@bool/enable_user_dictionary_export" />
<item android:id="@+id/user_dictionary_tool_menu_undo"
android:icon="@android:drawable/ic_menu_revert"
diff --git a/src/android/static_resources/resources_oss/res/values-h380dp-land/dimens.xml b/src/android/static_resources/resources_oss/res/values-h380dp-land/dimens.xml
new file mode 100644
index 0000000..e31f03c
--- /dev/null
+++ b/src/android/static_resources/resources_oss/res/values-h380dp-land/dimens.xml
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- This is intended to be used for:
+ - Shamu (728.57 x 411.43 dp, screenHeightDp: 380+? dp)
+ NOTE: This size is recgnized as a kind of phones.
+ Don't apply table setting.
+-->
+<resources>
+
+ <dimen name="input_frame_height">186.3dip</dimen>
+ <dimen name="ime_window_height">226.3dip</dimen>
+
+ <!-- symbol_view_height = input_frame_height + (candidate_text_size + candidate_vertical_padding_size * 2) -->
+ <dimen name="symbol_view_height">226.3dip</dimen>
+ <!-- symbol_view_major_category_height = input_frame_height / 4 (3 is for candidate rows, 1 is for major category) -->
+ <dimen name="symbol_view_major_category_height">46.575dip</dimen>
+ <!-- symbol_view_number_keyboard_height = input_frame_height - symbol_view_major_category_height -->
+ <dimen name="symbol_view_number_keyboard_height">139.725dip</dimen>
+
+</resources>
diff --git a/src/android/static_resources/resources_oss/res/values-h500dp-land/config.xml b/src/android/static_resources/resources_oss/res/values-h500dp-land/config.xml
new file mode 100644
index 0000000..d791beb
--- /dev/null
+++ b/src/android/static_resources/resources_oss/res/values-h500dp-land/config.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<resources>
+
+ <!-- Candidate window scroll animation : Velocity decay rate in ppm -->
+ <integer name="candidate_scroller_velocity_decay_rate">696845</integer>
+
+</resources>
diff --git a/src/android/static_resources/resources_oss/res/values-h500dp-land/dimens.xml b/src/android/static_resources/resources_oss/res/values-h500dp-land/dimens.xml
new file mode 100644
index 0000000..e8bac4e
--- /dev/null
+++ b/src/android/static_resources/resources_oss/res/values-h500dp-land/dimens.xml
@@ -0,0 +1,101 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- This is intended to be used for:
+ - Nexus7 (2012) (961 x 600 dp, screenHeightDp: 528 dp)
+ - Nexus7 (2013) (960 x 600 dp, screenHeightDp: 528 dp)
+ And larger ones than above.
+-->
+<resources>
+
+ <dimen name="pref_inputstyle_description_width">150dip</dimen>
+
+ <dimen name="key_preview_height">75dip</dimen>
+ <dimen name="key_preview_icon_height">75dip</dimen>
+ <dimen name="popup_width_limitation">75dip</dimen>
+ <dimen name="candidate_text_size">26dip</dimen>
+ <dimen name="candidate_horizontal_padding_size">14dip</dimen>
+ <dimen name="candidate_vertical_padding_size">12dip</dimen>
+ <dimen name="candidate_description_text_size">12dip</dimen>
+ <dimen name="candidate_text_size_aligned_layout">20dip</dimen>
+ <dimen name="candidate_description_text_size_aligned_layout">10dip</dimen>
+ <dimen name="candidate_fold_icon_width">29dip</dimen>
+
+ <!-- symbol_view_major_category_height = input_frame_height / 4 (3 is for candidate rows, 1 is for major category) -->
+ <dimen name="symbol_view_major_category_height">63.75dip</dimen>
+
+ <!--
+ ime_window_height = input_frame_height + (candidate_text_size + candidate_vertical_padding_size * 2) * n
+ n = 2 for portrait. Otherwise n = 1.
+ -->
+ <dimen name="ime_window_height">305dip</dimen>
+ <dimen name="input_frame_height">255dip</dimen>
+ <!-- partial_width >= 7 * (candidate_text_size + candidate_vertical_padding_size * 2) -->
+ <dimen name="ime_window_partial_width">350dip</dimen>
+
+ <dimen name="firsttime_app_name_text_size">32dip</dimen>
+ <dimen name="firsttime_description_text_size">25dip</dimen>
+ <dimen name="firsttime_padding_height">28dip</dimen>
+ <dimen name="firsttime_padding_width">40dip</dimen>
+
+ <!-- 3.5 Rows of candidates -->
+ <!-- (candidate_text_size + candidate_vertical_padding_size * 2) * 3.5
+ + narrow_frame_height -->
+ <dimen name="narrow_ime_window_height">221dip</dimen>
+ <dimen name="narrow_frame_height">46dip</dimen>
+ <!-- symbol_view_height = input_frame_height + (candidate_text_size + candidate_vertical_padding_size * 2) -->
+ <dimen name="symbol_view_height">305dip</dimen>
+ <!-- symbol_view_number_keyboard_height = input_frame_height - symbol_view_major_category_height -->
+ <dimen name="symbol_view_number_keyboard_height">191.25dip</dimen>
+ <!-- button_frame_height = candidate_text_size + candidate_vertical_padding_size * 2 -->
+ <dimen name="button_frame_height">50dip</dimen>
+
+ <!-- Character size of keyboard, depending on the screen size. -->
+ <dimen name="keyboard_godan_default_height">47dip</dimen>
+ <dimen name="keyboard_twelvekeys_default_height">75dip</dimen>
+ <dimen name="keyboard_qwerty_default_height">43dip</dimen>
+
+ <!-- 15% bigger than default. -->
+ <dimen name="symbol_close_button_width">39dip</dimen>
+ <dimen name="symbol_major_emoji_disable_icon_height">18dip</dimen>
+ <dimen name="symbol_major_emoji_height">23dip</dimen>
+ <dimen name="symbol_major_emoticon_height">20dip</dimen>
+ <dimen name="symbol_major_number_height">16dip</dimen>
+ <dimen name="symbol_major_symbol_height">20dip</dimen>
+ <dimen name="symbol_minor_default_height">23dip</dimen>
+ <dimen name="symbol_minor_emoticon_height">18dip</dimen>
+
+ <dimen name="symbol_view_symbol_min_column_width">100dip</dimen>
+ <dimen name="symbol_view_emoticon_min_column_width">145dip</dimen>
+ <dimen name="symbol_view_emoji_min_column_width">100dip</dimen>
+ <dimen name="symbol_candidate_horizontal_padding_size">18dip</dimen>
+
+</resources>
diff --git a/src/android/static_resources/resources_oss/res/values-h570dp-land/config.xml b/src/android/static_resources/resources_oss/res/values-h570dp-land/config.xml
new file mode 100644
index 0000000..97186d8
--- /dev/null
+++ b/src/android/static_resources/resources_oss/res/values-h570dp-land/config.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<resources>
+
+ <integer name="floating_candidate_candidate_num">9</integer>
+
+</resources>
diff --git a/src/android/static_resources/resources_oss/res/values-h570dp-land/dimens.xml b/src/android/static_resources/resources_oss/res/values-h570dp-land/dimens.xml
new file mode 100644
index 0000000..75a14e7
--- /dev/null
+++ b/src/android/static_resources/resources_oss/res/values-h570dp-land/dimens.xml
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- This is intended to be used for:
+ - Volantis (1024 x 768 dp, screenHeightDp: 695 dp)
+ And larger ones than above.
+-->
+<resources>
+
+ <!-- symbol_view_major_category_height = input_frame_height / 4 (3 is for candidate rows, 1 is for major category) -->
+ <dimen name="symbol_view_major_category_height">68.25dip</dimen>
+
+ <!--
+ ime_window_height = input_frame_height + (candidate_text_size + candidate_vertical_padding_size * 2) * n
+ n = 2 for portrait. Otherwise n = 1.
+ -->
+ <dimen name="ime_window_height">323dip</dimen>
+ <dimen name="input_frame_height">273dip</dimen>
+
+ <!-- symbol_view_height = input_frame_height + (candidate_text_size + candidate_vertical_padding_size * 2) -->
+ <dimen name="symbol_view_height">323dip</dimen>
+ <!-- symbol_view_number_keyboard_height = input_frame_height - symbol_view_major_category_height -->
+ <dimen name="symbol_view_number_keyboard_height">204.75dip</dimen>
+ <!-- button_frame_height = candidate_text_size + candidate_vertical_padding_size * 2 -->
+ <dimen name="button_frame_height">50dip</dimen>
+
+ <!-- Character size of keyboard, depending on the screen size. -->
+ <dimen name="keyboard_qwerty_default_height">47dip</dimen>
+ <dimen name="keyboard_twelvekeys_default_height">75dip</dimen>
+ <dimen name="keyboard_godan_default_height">51dip</dimen>
+
+ <!-- 20% bigger than default. -->
+ <dimen name="symbol_close_button_width">41dip</dimen>
+ <dimen name="symbol_major_emoji_disable_icon_height">19dip</dimen>
+ <dimen name="symbol_major_emoji_height">24dip</dimen>
+ <dimen name="symbol_major_emoticon_height">20dip</dimen>
+ <dimen name="symbol_major_number_height">17dip</dimen>
+ <dimen name="symbol_major_symbol_height">20dip</dimen>
+ <dimen name="symbol_minor_default_height">24dip</dimen>
+ <dimen name="symbol_minor_emoticon_height">19dip</dimen>
+
+</resources>
diff --git a/src/android/static_resources/resources_oss/res/values-h570dp-land/raws.xml b/src/android/static_resources/resources_oss/res/values-h570dp-land/raws.xml
new file mode 100644
index 0000000..a22c5fa
--- /dev/null
+++ b/src/android/static_resources/resources_oss/res/values-h570dp-land/raws.xml
@@ -0,0 +1,150 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<resources>
+
+ <item name="optional__qwerty__keyicon__ampersand" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__apostrophe" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__asterisk" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__circumflex_accent" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__colon" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__comma" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__commercial_at" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__digit_eight" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__digit_five" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__digit_four" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__digit_nine" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__digit_one" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__digit_seven" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__digit_six" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__digit_three" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__digit_two" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__digit_zero" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__dollar_sign" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__equals_sign" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__exclamation_mark" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__full_stop" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__grave_accent" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__greater_than_sign" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__hyphen_minus" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__ideographic_comma" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__ideographic_full_stop" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__latin_capital_letter_a" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__latin_capital_letter_b" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__latin_capital_letter_c" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__latin_capital_letter_d" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__latin_capital_letter_f" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__latin_capital_letter_g" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__latin_capital_letter_h" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__latin_capital_letter_j" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__latin_capital_letter_k" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__latin_capital_letter_l" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__latin_capital_letter_m" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__latin_capital_letter_n" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__latin_capital_letter_s" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__latin_capital_letter_v" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__latin_capital_letter_x" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__latin_capital_letter_z" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__latin_small_letter_a" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__latin_small_letter_b" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__latin_small_letter_c" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__latin_small_letter_d" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__latin_small_letter_f" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__latin_small_letter_g" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__latin_small_letter_h" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__latin_small_letter_j" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__latin_small_letter_k" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__latin_small_letter_l" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__latin_small_letter_m" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__latin_small_letter_n" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__latin_small_letter_s" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__latin_small_letter_v" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__latin_small_letter_x" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__latin_small_letter_z" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__left_curly_bracket" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__left_parenthesis" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__left_square_bracket" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__less_than_sign" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__low_line" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__minus_sign" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__number_sign" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__percent_sign" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__plus_sign" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__question_mark" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__quotation_mark" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__reverse_solidus" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__right_curly_bracket" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__right_parenthesis" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__right_square_bracket" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__semicolon" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__solidus" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__tilde" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__vertical_line" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__popup__latin_capital_letter_e" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__popup__latin_capital_letter_i" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__popup__latin_capital_letter_o" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__popup__latin_capital_letter_p" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__popup__latin_capital_letter_q" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__popup__latin_capital_letter_r" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__popup__latin_capital_letter_t" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__popup__latin_capital_letter_u" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__popup__latin_capital_letter_w" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__popup__latin_capital_letter_y" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__popup__latin_small_letter_e" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__popup__latin_small_letter_i" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__popup__latin_small_letter_o" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__popup__latin_small_letter_p" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__popup__latin_small_letter_q" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__popup__latin_small_letter_r" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__popup__latin_small_letter_t" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__popup__latin_small_letter_u" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__popup__latin_small_letter_w" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__popup__latin_small_letter_y" format="reference" type="raw">@null</item>
+ <item name="optional__twelvekeys__popup__zero" format="reference" type="raw">@null</item>
+ <item name="optional__twelvekeys__popup__one" format="reference" type="raw">@null</item>
+ <item name="optional__twelvekeys__popup__two" format="reference" type="raw">@null</item>
+ <item name="optional__twelvekeys__popup__three" format="reference" type="raw">@null</item>
+ <item name="optional__twelvekeys__popup__four" format="reference" type="raw">@null</item>
+ <item name="optional__twelvekeys__popup__five" format="reference" type="raw">@null</item>
+ <item name="optional__twelvekeys__popup__six" format="reference" type="raw">@null</item>
+ <item name="optional__twelvekeys__popup__seven" format="reference" type="raw">@null</item>
+ <item name="optional__twelvekeys__popup__eight" format="reference" type="raw">@null</item>
+ <item name="optional__twelvekeys__popup__nine" format="reference" type="raw">@null</item>
+ <item name="optional__twelvekeys__popup__asterisk" format="reference" type="raw">@null</item>
+ <item name="optional__twelvekeys__popup__number_sign" format="reference" type="raw">@null</item>
+ <item name="optional__twelvekeys__popup__plus_sign" format="reference" type="raw">@null</item>
+ <item name="optional__twelvekeys__popup__hyphen_minus" format="reference" type="raw">@null</item>
+ <item name="optional__twelvekeys__popup__comma" format="reference" type="raw">@null</item>
+ <item name="optional__twelvekeys__popup__full_stop" format="reference" type="raw">@null</item>
+ <item name="optional__twelvekeys__popup__solidus" format="reference" type="raw">@null</item>
+ <item name="optional__twelvekeys__popup__equals_sign" format="reference" type="raw">@null</item>
+
+</resources>
diff --git a/src/android/static_resources/resources_oss/res/values-h650dp-port/dimens.xml b/src/android/static_resources/resources_oss/res/values-h650dp-port/dimens.xml
new file mode 100644
index 0000000..0e0f3df
--- /dev/null
+++ b/src/android/static_resources/resources_oss/res/values-h650dp-port/dimens.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- This is intended to be used for:
+ - Shamu (728.57 x 411.43 dp, screenHeightDp: 650+? dp)
+ NOTE: This size is recgnized as a kind of phones.
+ Don't apply table setting.
+-->
+<resources>
+
+ <!-- symbol_view_major_category_height = input_frame_height / 4 (3 is for candidate rows, 1 is for major category) -->
+ <dimen name="symbol_view_major_category_height">63.775dip</dimen>
+
+ <!--
+ ime_window_height = input_frame_height + (candidate_text_size + candidate_vertical_padding_size * 2) * n
+ n = 2 for portrait. Otherwise n = 1.
+ -->
+ <dimen name="ime_window_height">335.1dip</dimen>
+ <dimen name="input_frame_height">255.1dip</dimen>
+
+ <!-- symbol_view_height = input_frame_height + (candidate_text_size + candidate_vertical_padding_size * 2) -->
+ <dimen name="symbol_view_height">295.1dip</dimen>
+ <!-- symbol_view_number_keyboard_height = input_frame_height - symbol_view_major_category_height -->
+ <dimen name="symbol_view_number_keyboard_height">191.325dip</dimen>
+
+</resources>
diff --git a/src/android/static_resources/resources_oss/res/values-h720dp-land/dimens.xml b/src/android/static_resources/resources_oss/res/values-h720dp-land/dimens.xml
new file mode 100644
index 0000000..cf5ae4b
--- /dev/null
+++ b/src/android/static_resources/resources_oss/res/values-h720dp-land/dimens.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- This is intended to be used for:
+ - Nexus10 (1280 x 800 dp, screenHeightDp: 727 dp)
+ And larger ones than above.
+-->
+<resources>
+
+ <!-- symbol_view_major_category_height = input_frame_height / 4 (3 is for candidate rows, 1 is for major category) -->
+ <dimen name="symbol_view_major_category_height">86.25dip</dimen>
+
+ <!--
+ ime_window_height = input_frame_height + (candidate_text_size + candidate_vertical_padding_size * 2) * n
+ n = 2 for portrait. Otherwise n = 1.
+ -->
+ <dimen name="ime_window_height">396.5dip</dimen>
+ <dimen name="input_frame_height">346.5dip</dimen>
+
+ <!-- symbol_view_height = input_frame_height + (candidate_text_size + candidate_vertical_padding_size * 2) -->
+ <dimen name="symbol_view_height">396.5dip</dimen>
+ <!-- symbol_view_number_keyboard_height = input_frame_height - symbol_view_major_category_height -->
+ <dimen name="symbol_view_number_keyboard_height">259.875dip</dimen>
+
+</resources>
diff --git a/src/android/static_resources/resources_oss/res/values-h800dp-port/config.xml b/src/android/static_resources/resources_oss/res/values-h800dp-port/config.xml
new file mode 100644
index 0000000..20bb02b
--- /dev/null
+++ b/src/android/static_resources/resources_oss/res/values-h800dp-port/config.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<resources>
+
+ <!-- Candidate window scroll animation : Velocity decay rate in ppm -->
+ <integer name="candidate_scroller_velocity_decay_rate">696845</integer>
+
+ <integer name="floating_candidate_candidate_num">9</integer>
+
+</resources>
diff --git a/src/android/static_resources/resources_oss/res/values-h800dp-port/dimens.xml b/src/android/static_resources/resources_oss/res/values-h800dp-port/dimens.xml
new file mode 100644
index 0000000..82a9b57
--- /dev/null
+++ b/src/android/static_resources/resources_oss/res/values-h800dp-port/dimens.xml
@@ -0,0 +1,100 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- This is intended to be used for:
+ - Nexus7 (2012) (961 x 600 dp, screenHeightDp: 880 dp)
+ - Nexus7 (2013) (960 x 600 dp, screenHeightDp: ? dp)
+ From this size the devices are recognized as a kind of tables.
+-->
+<resources>
+
+ <dimen name="pref_inputstyle_description_width">150dip</dimen>
+
+ <dimen name="key_preview_height">75dip</dimen>
+ <dimen name="key_preview_icon_height">75dip</dimen>
+ <dimen name="popup_width_limitation">75dip</dimen>
+ <dimen name="candidate_text_size">26dip</dimen>
+ <dimen name="candidate_horizontal_padding_size">14dip</dimen>
+ <dimen name="candidate_vertical_padding_size">12dip</dimen>
+ <dimen name="candidate_description_text_size">12dip</dimen>
+ <dimen name="candidate_text_size_aligned_layout">20dip</dimen>
+ <dimen name="candidate_description_text_size_aligned_layout">10dip</dimen>
+ <dimen name="candidate_fold_icon_width">29dip</dimen>
+
+ <!-- symbol_view_major_category_height = input_frame_height / 4 (3 is for candidate rows, 1 is for major category) -->
+ <dimen name="symbol_view_major_category_height">75.6dip</dimen>
+
+ <!--
+ ime_window_height = input_frame_height + (candidate_text_size + candidate_vertical_padding_size * 2) * n
+ n = 2 for portrait. Otherwise n = 1.
+ -->
+ <dimen name="ime_window_height">402.4dip</dimen>
+ <dimen name="input_frame_height">302.4dip</dimen>
+ <!-- partial_width >= 7 * (candidate_text_size + candidate_vertical_padding_size * 2) -->
+ <dimen name="ime_window_partial_width">350dip</dimen>
+
+ <dimen name="firsttime_app_name_text_size">32dip</dimen>
+ <dimen name="firsttime_description_text_size">25dip</dimen>
+ <dimen name="firsttime_padding_height">28dip</dimen>
+ <dimen name="firsttime_padding_width">40dip</dimen>
+
+ <!-- 3.5 Rows of candidates -->
+ <!-- (candidate_text_size + candidate_vertical_padding_size * 2) * 3.5
+ + narrow_frame_height -->
+ <dimen name="narrow_ime_window_height">221dip</dimen>
+ <!-- symbol_view_height = input_frame_height + (candidate_text_size + candidate_vertical_padding_size * 2) -->
+ <dimen name="symbol_view_height">352.4dip</dimen>
+ <!-- symbol_view_number_keyboard_height = input_frame_height - symbol_view_major_category_height -->
+ <dimen name="symbol_view_number_keyboard_height">226.8dip</dimen>
+ <!-- button_frame_height = candidate_text_size + candidate_vertical_padding_size * 2 -->
+ <dimen name="button_frame_height">50dip</dimen>
+
+ <!-- Character size of keyboard, depending on the screen size. -->
+ <dimen name="keyboard_godan_default_height">47dip</dimen>
+ <dimen name="keyboard_twelvekeys_default_height">75dip</dimen>
+ <dimen name="keyboard_qwerty_default_height">43dip</dimen>
+
+ <!-- 15% bigger than default. -->
+ <dimen name="symbol_close_button_width">39dip</dimen>
+ <dimen name="symbol_major_emoji_disable_icon_height">18dip</dimen>
+ <dimen name="symbol_major_emoji_height">23dip</dimen>
+ <dimen name="symbol_major_emoticon_height">20dip</dimen>
+ <dimen name="symbol_major_number_height">16dip</dimen>
+ <dimen name="symbol_major_symbol_height">20dip</dimen>
+ <dimen name="symbol_minor_default_height">23dip</dimen>
+ <dimen name="symbol_minor_emoticon_height">18dip</dimen>
+
+ <dimen name="symbol_view_symbol_min_column_width">80dip</dimen>
+ <dimen name="symbol_view_emoticon_min_column_width">120dip</dimen>
+ <dimen name="symbol_view_emoji_min_column_width">80dip</dimen>
+ <dimen name="symbol_candidate_horizontal_padding_size">15dip</dimen>
+
+</resources>
diff --git a/src/android/static_resources/resources_oss/res/values-h800dp-port/raws.xml b/src/android/static_resources/resources_oss/res/values-h800dp-port/raws.xml
new file mode 100644
index 0000000..a22c5fa
--- /dev/null
+++ b/src/android/static_resources/resources_oss/res/values-h800dp-port/raws.xml
@@ -0,0 +1,150 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<resources>
+
+ <item name="optional__qwerty__keyicon__ampersand" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__apostrophe" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__asterisk" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__circumflex_accent" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__colon" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__comma" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__commercial_at" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__digit_eight" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__digit_five" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__digit_four" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__digit_nine" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__digit_one" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__digit_seven" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__digit_six" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__digit_three" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__digit_two" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__digit_zero" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__dollar_sign" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__equals_sign" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__exclamation_mark" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__full_stop" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__grave_accent" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__greater_than_sign" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__hyphen_minus" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__ideographic_comma" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__ideographic_full_stop" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__latin_capital_letter_a" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__latin_capital_letter_b" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__latin_capital_letter_c" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__latin_capital_letter_d" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__latin_capital_letter_f" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__latin_capital_letter_g" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__latin_capital_letter_h" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__latin_capital_letter_j" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__latin_capital_letter_k" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__latin_capital_letter_l" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__latin_capital_letter_m" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__latin_capital_letter_n" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__latin_capital_letter_s" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__latin_capital_letter_v" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__latin_capital_letter_x" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__latin_capital_letter_z" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__latin_small_letter_a" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__latin_small_letter_b" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__latin_small_letter_c" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__latin_small_letter_d" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__latin_small_letter_f" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__latin_small_letter_g" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__latin_small_letter_h" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__latin_small_letter_j" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__latin_small_letter_k" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__latin_small_letter_l" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__latin_small_letter_m" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__latin_small_letter_n" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__latin_small_letter_s" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__latin_small_letter_v" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__latin_small_letter_x" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__latin_small_letter_z" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__left_curly_bracket" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__left_parenthesis" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__left_square_bracket" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__less_than_sign" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__low_line" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__minus_sign" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__number_sign" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__percent_sign" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__plus_sign" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__question_mark" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__quotation_mark" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__reverse_solidus" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__right_curly_bracket" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__right_parenthesis" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__right_square_bracket" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__semicolon" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__solidus" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__tilde" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__keyicon__vertical_line" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__popup__latin_capital_letter_e" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__popup__latin_capital_letter_i" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__popup__latin_capital_letter_o" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__popup__latin_capital_letter_p" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__popup__latin_capital_letter_q" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__popup__latin_capital_letter_r" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__popup__latin_capital_letter_t" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__popup__latin_capital_letter_u" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__popup__latin_capital_letter_w" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__popup__latin_capital_letter_y" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__popup__latin_small_letter_e" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__popup__latin_small_letter_i" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__popup__latin_small_letter_o" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__popup__latin_small_letter_p" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__popup__latin_small_letter_q" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__popup__latin_small_letter_r" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__popup__latin_small_letter_t" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__popup__latin_small_letter_u" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__popup__latin_small_letter_w" format="reference" type="raw">@null</item>
+ <item name="optional__qwerty__popup__latin_small_letter_y" format="reference" type="raw">@null</item>
+ <item name="optional__twelvekeys__popup__zero" format="reference" type="raw">@null</item>
+ <item name="optional__twelvekeys__popup__one" format="reference" type="raw">@null</item>
+ <item name="optional__twelvekeys__popup__two" format="reference" type="raw">@null</item>
+ <item name="optional__twelvekeys__popup__three" format="reference" type="raw">@null</item>
+ <item name="optional__twelvekeys__popup__four" format="reference" type="raw">@null</item>
+ <item name="optional__twelvekeys__popup__five" format="reference" type="raw">@null</item>
+ <item name="optional__twelvekeys__popup__six" format="reference" type="raw">@null</item>
+ <item name="optional__twelvekeys__popup__seven" format="reference" type="raw">@null</item>
+ <item name="optional__twelvekeys__popup__eight" format="reference" type="raw">@null</item>
+ <item name="optional__twelvekeys__popup__nine" format="reference" type="raw">@null</item>
+ <item name="optional__twelvekeys__popup__asterisk" format="reference" type="raw">@null</item>
+ <item name="optional__twelvekeys__popup__number_sign" format="reference" type="raw">@null</item>
+ <item name="optional__twelvekeys__popup__plus_sign" format="reference" type="raw">@null</item>
+ <item name="optional__twelvekeys__popup__hyphen_minus" format="reference" type="raw">@null</item>
+ <item name="optional__twelvekeys__popup__comma" format="reference" type="raw">@null</item>
+ <item name="optional__twelvekeys__popup__full_stop" format="reference" type="raw">@null</item>
+ <item name="optional__twelvekeys__popup__solidus" format="reference" type="raw">@null</item>
+ <item name="optional__twelvekeys__popup__equals_sign" format="reference" type="raw">@null</item>
+
+</resources>
diff --git a/src/android/static_resources/resources_oss/res/values-h900dp-port/dimens.xml b/src/android/static_resources/resources_oss/res/values-h900dp-port/dimens.xml
new file mode 100644
index 0000000..d9eb9b6
--- /dev/null
+++ b/src/android/static_resources/resources_oss/res/values-h900dp-port/dimens.xml
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- This is intended to be used for:
+ - Volantis (1024 x 768 dp, screenHeightDp: 951 dp)
+ - Nexus10 (1280 x 800 dp, screenHeightDp: 1207 dp)
+ And larger ones than above.
+-->
+<resources>
+
+ <!-- symbol_view_major_category_height = input_frame_height / 4 (3 is for candidate rows, 1 is for major category) -->
+ <dimen name="symbol_view_major_category_height">75.75dip</dimen>
+
+ <!--
+ ime_window_height = input_frame_height + (candidate_text_size + candidate_vertical_padding_size * 2) * n
+ n = 2 for portrait. Otherwise n = 1.
+ -->
+ <dimen name="ime_window_height">403dip</dimen>
+ <dimen name="input_frame_height">303dip</dimen>
+
+ <!-- symbol_view_height = input_frame_height + (candidate_text_size + candidate_vertical_padding_size * 2) -->
+ <dimen name="symbol_view_height">353dip</dimen>
+ <!-- symbol_view_number_keyboard_height = input_frame_height - symbol_view_major_category_height -->
+ <dimen name="symbol_view_number_keyboard_height">227.25dip</dimen>
+
+ <!-- Character size of keyboard, depending on the screen size. -->
+ <dimen name="keyboard_qwerty_default_height">47dip</dimen>
+ <dimen name="keyboard_twelvekeys_default_height">75dip</dimen>
+ <dimen name="keyboard_godan_default_height">51dip</dimen>
+
+ <!-- 20% bigger than default. -->
+ <dimen name="symbol_close_button_width">41dip</dimen>
+ <dimen name="symbol_major_emoji_disable_icon_height">19dip</dimen>
+ <dimen name="symbol_major_emoji_height">24dip</dimen>
+ <dimen name="symbol_major_emoticon_height">20dip</dimen>
+ <dimen name="symbol_major_number_height">17dip</dimen>
+ <dimen name="symbol_major_symbol_height">20dip</dimen>
+ <dimen name="symbol_minor_default_height">24dip</dimen>
+ <dimen name="symbol_minor_emoticon_height">19dip</dimen>
+
+</resources>
diff --git a/src/android/static_resources/resources_oss/res/values-ja/contentdescription.xml b/src/android/static_resources/resources_oss/res/values-ja/contentdescription.xml
index eacf9cd..5a442a5 100644
--- a/src/android/static_resources/resources_oss/res/values-ja/contentdescription.xml
+++ b/src/android/static_resources/resources_oss/res/values-ja/contentdescription.xml
@@ -50,9 +50,7 @@
<string name="cd_key_right">右</string>
<string name="cd_key_down">下</string>
<string name="cd_key_chartype_to_kana">かなへ切り替え</string>
- <string name="cd_key_chartype_to_123">数字に切り替え</string>
<string name="cd_key_chartype_to_abc">アルファベットに切り替え</string>
- <string name="cd_key_chartype_to_kana_123">記号に切り替え</string>
<string name="cd_key_chartype_to_abc_123">記号に切り替え</string>
<string name="cd_key_undo">アンドゥ</string>
<string name="cd_key_symbol">記号入力画面</string>
@@ -61,7 +59,7 @@
<string name="cd_key_capslock">キャプスロック</string>
<string name="cd_key_capsunlock">シフトを解除</string>
<string name="cd_key_menu_dialog">メニューを開く</string>
- <string name="cd_key_ime_picker_dialog">入力方法切り替え</string>
+ <string name="cd_key_globe">入力方法の切り替え</string>
<string name="cd_key_uchar_backspace">バックスペース</string>
<string name="cd_key_uchar_linefeed">改行</string>
<string name="cd_key_uchar_space">スペース</string>
@@ -163,6 +161,13 @@
<string name="cd_key_uchar_vertical_line">縦線</string>
<string name="cd_key_uchar_right_curly_bracket">終わり波括弧</string>
<string name="cd_key_uchar_tilde">チルダ</string>
+ <string name="cd_key_action_done">完了</string>
+ <string name="cd_key_action_go">移動</string>
+ <string name="cd_key_action_next">次へ</string>
+ <string name="cd_key_action_previous">前へ</string>
+ <string name="cd_key_action_search">検索</string>
+ <string name="cd_key_action_send">送信</string>
+ <string name="cd_key_composing_done">確定</string>
<!-- Keys in Kana keyboard -->
<string name="cd_key_kana_line_a">ア行</string>
@@ -177,37 +182,11 @@
<string name="cd_key_kana_modifier">濁点</string>
<string name="cd_key_kana_line_wa">ワ行</string>
<string name="cd_key_kana_punctuation">句読点</string>
-
- <!-- Keys in Qwerty-Kana keyboard -->
- <string name="cd_key_uchar_black_star">星</string>
- <string name="cd_key_uchar_black_heart_suit">ハート</string>
- <string name="cd_key_uchar_eighth_note">音符</string>
- <string name="cd_key_uchar_reference_mark">米じるし</string>
- <string name="cd_key_uchar_postal_mark">郵便記号</string>
- <string name="cd_key_uchar_multiplication_sign">掛け算</string>
- <string name="cd_key_uchar_division_sign">割り算</string>
- <string name="cd_key_uchar_left_corner_bracket">始めかぎ括弧</string>
- <string name="cd_key_uchar_right_corner_bracket">終わりかぎ括弧</string>
<string name="cd_key_uchar_katakana_middle_dot">中黒</string>
- <string name="cd_key_uchar_two_dot_leader">二点リーダー</string>
- <string name="cd_key_uchar_three_dot_leader">三点リーダー</string>
- <string name="cd_key_uchar_left_black_lenticular_bracket">始めすみ付き括弧</string>
- <string name="cd_key_uchar_right_black_lenticular_bracket">終わりすみ付き括弧</string>
- <string name="cd_key_uchar_u6642">時</string>
- <string name="cd_key_uchar_u5206">分</string>
- <string name="cd_key_uchar_u6708">月</string>
- <string name="cd_key_uchar_u65e5">日</string>
- <string name="cd_key_uchar_wave_dash">波線</string>
- <string name="cd_key_compound_monday">(月)</string>
- <string name="cd_key_compound_tuesday">(火)</string>
- <string name="cd_key_compound_wednesday">(水)</string>
- <string name="cd_key_compound_thursday">(木)</string>
- <string name="cd_key_compound_friday">(金)</string>
- <string name="cd_key_compound_saturday">(土)</string>
- <string name="cd_key_compound_sunday">(日)</string>
<string name="cd_key_uchar_ideographic_comma">読点</string>
<string name="cd_key_uchar_ideographic_full_stop">句点</string>
<string name="cd_key_uchar_katakana_hiragana_prolonged_sound_mark">長音</string>
+
<!-- Keys in Alphabet keyboard -->
<string name="cd_key_alphabet_abc">ABC</string>
<string name="cd_key_alphabet_def">DEF</string>
@@ -223,11 +202,31 @@
<!-- Views -->
<string name="cd_close_symbol_window">キーボードに戻る</string>
+ <string name="cd_symbol_window_number">数字</string>
<string name="cd_symbol_window_symbol">記号</string>
<string name="cd_symbol_window_emoticon">顔文字</string>
<string name="cd_symbol_window_emoji">絵文字</string>
+ <string name="cd_symbol_window_enter">改行</string>
<string name="cd_symbol_window_backspace">バックスペース</string>
+ <string name="cd_symbol_window_minor_history">履歴</string>
+ <string name="cd_symbol_window_minor_symbol_general">一般記号</string>
+ <string name="cd_symbol_window_minor_symbol_half">全角半角記号</string>
+ <string name="cd_symbol_window_minor_symbol_parenthesis">括弧</string>
+ <string name="cd_symbol_window_minor_symbol_arrow">矢印記号</string>
+ <string name="cd_symbol_window_minor_symbol_math">数学記号</string>
+ <string name="cd_symbol_window_minor_emoticon_smile">笑っている顔文字</string>
+ <string name="cd_symbol_window_minor_emoticon_sweat">汗をかいている顔文字</string>
+ <string name="cd_symbol_window_minor_emoticon_surprise">驚いている顔文字</string>
+ <string name="cd_symbol_window_minor_emoticon_sadness">悲しんでいる顔文字</string>
+ <string name="cd_symbol_window_minor_emoticon_displeasure">怒っている顔文字</string>
+ <string name="cd_symbol_window_minor_emoji_face">顔の絵文字</string>
+ <string name="cd_symbol_window_minor_emoji_food">食べ物の絵文字</string>
+ <string name="cd_symbol_window_minor_emoji_activity">活動の絵文字</string>
+ <string name="cd_symbol_window_minor_emoji_city">街の絵文字</string>
+ <string name="cd_symbol_window_minor_emoji_nature">自然の絵文字</string>
<string name="help_userdictionary_dictionary_name">辞書の名前を入力してください</string>
<string name="help_userdictionary_edit_word_value">単語を入力してください</string>
<string name="help_userdictionary_edit_word_key">よみを入力してください</string>
-</resources>
\ No newline at end of file
+ <string name="cd_voice_input">音声入力</string>
+ <string name="cd_narrow_frame_widen_button">キーボードを表示</string>
+</resources>
diff --git a/src/android/static_resources/resources_oss/res/values-ja/strings.xml b/src/android/static_resources/resources_oss/res/values-ja/strings.xml
index f40592e..5f74409 100644
--- a/src/android/static_resources/resources_oss/res/values-ja/strings.xml
+++ b/src/android/static_resources/resources_oss/res/values-ja/strings.xml
@@ -36,6 +36,15 @@
<string name="pref_software_keyboard_category_title">ソフトウェアキーボードの設定</string>
<string name="pref_software_keyboard_advanced_settings_title">ソフトウェアキーボードの詳細設定</string>
+ <!-- Fragment preference titles -->
+ <string name="pref_fragment_software_keyboard_title">ソフトウェアキーボード</string>
+ <string name="pref_fragment_input_support_title">入力サポート</string>
+ <string name="pref_fragment_conversion_title">変換</string>
+ <string name="pref_fragment_dictionary_title">辞書</string>
+ <string name="pref_fragment_user_feedback_title">ユーザフィードバック</string>
+ <string name="pref_fragment_about_title">概要</string>
+ <string name="pref_fragment_development_title">開発</string>
+
<string name="pref_software_keyboard_preferences_portrait_title">縦画面のソフトウェアキーボード設定</string>
<string name="pref_software_keyboard_preferences_landscape_title">横画面のソフトウェアキーボード設定</string>
<!-- Following entries are for configuration_dependent_preferences -->
@@ -53,8 +62,9 @@
<string name="pref_popup_feedback_title">キー押下時ポップアップ</string>
<string name="pref_other_input_support_preference_category_title">その他の入力サポートの設定</string>
<string name="pref_fullscreen_title">フルスクリーンモード</string>
- <string name="pref_skin_type_title">スキンの選択</string>
+ <string name="pref_skin_type_title">キーボードテーマの選択</string>
<string name="pref_hardware_title">ハードウェアキーボードの設定</string>
+ <string name="pref_voice_input_title">音声入力ボタン</string>
<string name="pref_conversion_category_title">変換の設定</string>
<string name="pref_layout_adjustment_title">左右寄せ</string>
<string name="pref_space_character_form_title">常に半角スペースを使う</string>
@@ -76,6 +86,7 @@
<string name="pref_about_terms_of_service_title">モバイル利用規約</string>
<string name="pref_about_privacy_policy_title">プライバシーポリシー</string>
<string name="pref_about_oss_credits_title">オープンソースソフトウェア</string>
+ <string name="pref_launcher_icon_visibility_title">アイコンを表示する</string>
<!-- Preference description -->
<!-- Configuration Dependent Preferences -->
@@ -100,7 +111,8 @@
<string name="pref_kana_modifier_insensitive_conversion_description">濁点、半濁点、小文字化を省略しても自動的に補って変換します。ケータイ配列とGodanキーボードの時に有効になります。例)かつこう→学校</string>
<string name="pref_typing_correction_description">誤入力を検出して、正しいと思われる候補を表示します。例)すんかい→深海</string>
<string name="pref_emoji_provider_type_description">絵文字を使う際の事業者を選択します。</string>
- <string name="pref_skin_type_description">ソフトウェアキーボードのスキンを選択します。</string>
+ <string name="pref_skin_type_description">ソフトウェアキーボードのテーマを選択します。</string>
+ <string name="pref_voice_input_description">音声入力ボタンをキーボードに表示します。</string>
<!-- Hardware Keyboard -->
<string name="pref_hardware_keymap_description">ハードウェアキーボードの種類を選択します。</string>
<!-- Dictionary -->
@@ -117,6 +129,7 @@
<string name="pref_about_terms_of_service_description">モバイル利用規約を表示します(ウェブページ)。</string>
<string name="pref_about_privacy_policy_description">プライバシーポリシーを表示します(ウェブページ)。</string>
<string name="pref_about_oss_credits_description">本ソフトウェアはオープンソースソフトウェアを利用しています。</string>
+ <string name="pref_launcher_icon_visibility_description">アプリケーション一覧にアイコンを表示します。</string>
<!-- Preference Values -->
<string name="pref_input_style_setting_entry_toggle">ケータイ打ち</string>
@@ -135,14 +148,13 @@
<string name="pref_skin_type_orange_lightgray">オレンジ/ライトグレー</string>
<string name="pref_skin_type_blue_lightgray">ブルー/ライトグレー</string>
<string name="pref_skin_type_blue_darkgray">ブルー/ダークグレー</string>
+ <string name="pref_skin_type_material_design_light">マテリアル デザイン(ライト)</string>
+ <string name="pref_skin_type_material_design_dark">マテリアル デザイン(ダーク)</string>
<string name="pref_hardware_keymap_default">システム配列</string>
<string name="pref_hardware_keymap_japanese109A">日本語109A配列</string>
<string name="pref_hardware_keymap_twelvekey">ケータイ配列</string>
- <!-- Preference url -->
- <string name="pref_oss_credits_url">file:///android_asset/credits_ja.html</string>
-
<string name="pref_layout_adjustment_entry_fill">全幅</string>
<string name="pref_layout_adjustment_entry_right">右寄せ</string>
<string name="pref_layout_adjustment_entry_left">左寄せ</string>
@@ -177,32 +189,10 @@
<string name="symbol_input_no_history">まだ履歴がありません。\n\n右にスライドして\n候補を選んでください。</string>
<string name="symbol_emoji_disabled_message">この入力先には、\n絵文字を入力できません。</string>
- <string name="symbol_minor_symbol_history_title">履歴</string>
- <string name="symbol_minor_symbol_general_title">一般\n記号</string>
- <string name="symbol_minor_symbol_half_title">半角\n全角</string>
- <string name="symbol_minor_symbol_parenthesis_title">括弧\n罫線</string>
- <string name="symbol_minor_symbol_arrow_title">矢印\n数字</string>
- <string name="symbol_minor_symbol_math_title">数式\n単位</string>
-
- <string name="symbol_minor_emoticon_history_title">履歴</string>
- <string name="symbol_minor_emoticon_smile_title">喜\n(^^)</string>
- <string name="symbol_minor_emoticon_sweat_title">焦\n(^^;)</string>
- <string name="symbol_minor_emoticon_surprise_title">驚\n(゜д゜)</string>
- <string name="symbol_minor_emoticon_sadness_title">悲\n(T_T)</string>
- <string name="symbol_minor_emoticon_displeasure_title">怒\n(-_-)</string>
-
- <string name="symbol_minor_emoji_history_title">履歴</string>
- <string name="symbol_minor_emoji_face_title">表情\n感情</string>
- <string name="symbol_minor_emoji_food_title">食事\n遊び</string>
- <string name="symbol_minor_emoji_activity_title">行事\n生活</string>
- <string name="symbol_minor_emoji_city_title">街\n仕事</string>
- <string name="symbol_minor_emoji_nature_title">自然\n図形</string>
-
<!-- Menu dialog -->
<string name="menu_dialog_title">入力オプション</string>
<string name="menu_item_input_method">入力方法の選択</string>
<string name="menu_item_preferences">%sの設定</string>
- <string name="menu_item_voice_input">音声入力</string>
<string name="menu_item_mushroom">マッシュルームの起動</string>
<!-- User Dictionary Tool -->
diff --git a/src/android/static_resources/resources_oss/res/values-land/config.xml b/src/android/static_resources/resources_oss/res/values-land/config.xml
deleted file mode 100644
index 3570aa9..0000000
--- a/src/android/static_resources/resources_oss/res/values-land/config.xml
+++ /dev/null
@@ -1,41 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<resources>
- <!-- Columns per screen in symbol input view (Emoticon). -->
- <integer name="symbol_input_candidate_columns_emoticon">6</integer>
- <!-- Columns per screen in symbol input view (Symbol). -->
- <integer name="symbol_input_candidate_columns_symbol">8</integer>
- <!-- Columns per screen in symbol input view (Emoji). -->
- <integer name="symbol_input_candidate_columns_emoji">8</integer>
- <!-- Rows per screen in symbol input view. -->
- <integer name="symbol_input_candidate_rows">2</integer>
-</resources>
diff --git a/src/android/static_resources/resources_oss/res/values-land/dimens.xml b/src/android/static_resources/resources_oss/res/values-land/dimens.xml
index af4fca5..4340828 100644
--- a/src/android/static_resources/resources_oss/res/values-land/dimens.xml
+++ b/src/android/static_resources/resources_oss/res/values-land/dimens.xml
@@ -30,13 +30,22 @@
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-->
<resources>
- <dimen name="pref_inputstyle_description_width">150dip</dimen>
- <dimen name="ime_window_height">@dimen/ime_window_height_landscape</dimen>
- <dimen name="input_frame_height">165.4dip</dimen>
- <!-- input_frame_height_width_shadow should be input_drame_height + translucent_border_height -->
- <dimen name="input_frame_height_with_shadow">168.8dip</dimen>
+ <dimen name="pref_inputstyle_description_width">150dip</dimen>
- <dimen name="symbol_view_minor_category_tab_widget_height">40dip</dimen>
+ <dimen name="ime_window_height">206dip</dimen>
+
+ <dimen name="input_frame_height">166dip</dimen>
+ <!-- symbol_view_height = input_frame_height + (candidate_text_size + candidate_vertical_padding_size * 2) -->
+ <dimen name="symbol_view_height">206dip</dimen>
+ <!-- symbol_view_number_keyboard_height = input_frame_height - symbol_view_major_category_height -->
+ <dimen name="symbol_view_number_keyboard_height">111dip</dimen>
+ <!-- symbol_view_major_category_height = input_frame_height / 4 (3 is for candidate rows, 1 is for major category) -->
+ <dimen name="symbol_view_major_category_height">41.5dip</dimen>
+
+ <dimen name="symbol_view_symbol_min_column_width">67dip</dimen>
+ <dimen name="symbol_view_emoticon_min_column_width">100dip</dimen>
+ <dimen name="symbol_view_emoji_min_column_width">67dip</dimen>
+ <dimen name="symbol_candidate_horizontal_padding_size">10dip</dimen>
</resources>
diff --git a/src/android/static_resources/resources_oss/res/values-land/strings.xml b/src/android/static_resources/resources_oss/res/values-land/strings.xml
deleted file mode 100644
index 6669e78..0000000
--- a/src/android/static_resources/resources_oss/res/values-land/strings.xml
+++ /dev/null
@@ -1,53 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<resources>
- <string name="symbol_minor_symbol_history_title">History</string>
- <string name="symbol_minor_symbol_general_title">General\nSymbol</string>
- <string name="symbol_minor_symbol_half_title">Half-width\nFull-width</string>
- <string name="symbol_minor_symbol_parenthesis_title">Parenthesis\nRule</string>
- <string name="symbol_minor_symbol_arrow_title">Arrow\nNumber</string>
- <string name="symbol_minor_symbol_math_title">Math\nUnit</string>
-
- <string name="symbol_minor_emoticon_history_title">History</string>
- <string name="symbol_minor_emoticon_smile_title">Smile\n(^^)</string>
- <string name="symbol_minor_emoticon_sweat_title">Sweat\n(^^;)</string>
- <string name="symbol_minor_emoticon_surprise_title">Surprize\n(゜д゜)</string>
- <string name="symbol_minor_emoticon_sadness_title">Sadness\n(T_T)</string>
- <string name="symbol_minor_emoticon_displeasure_title">Displeasure\n(-_-)</string>
-
- <string name="symbol_minor_emoji_history_title">History</string>
- <string name="symbol_minor_emoji_face_title">Face\nEmotion</string>
- <string name="symbol_minor_emoji_food_title">Food\nPlay</string>
- <string name="symbol_minor_emoji_activity_title">Activity\nLife</string>
- <string name="symbol_minor_emoji_city_title">City\nWork</string>
- <string name="symbol_minor_emoji_nature_title">Nature\nFigure</string>
-</resources>
diff --git a/src/android/static_resources/resources_oss/res/values-v16/bools.xml b/src/android/static_resources/resources_oss/res/values-v16/bools.xml
new file mode 100644
index 0000000..cab981a
--- /dev/null
+++ b/src/android/static_resources/resources_oss/res/values-v16/bools.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<resources>
+
+ <bool name="enable_user_dictionary_export">true</bool>
+
+</resources>
diff --git a/src/android/static_resources/resources_oss/res/values-v21/strings.xml b/src/android/static_resources/resources_oss/res/values-v21/strings.xml
new file mode 100644
index 0000000..b750846
--- /dev/null
+++ b/src/android/static_resources/resources_oss/res/values-v21/strings.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<resources>
+ <string name="pref_skin_type_default">MATERIAL_DESIGN_LIGHT</string>
+</resources>
diff --git a/src/android/static_resources/resources_oss/res/values-v21/themes.xml b/src/android/static_resources/resources_oss/res/values-v21/themes.xml
new file mode 100644
index 0000000..5dc78f6
--- /dev/null
+++ b/src/android/static_resources/resources_oss/res/values-v21/themes.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<resources>
+
+ <style name="AppThemeSelector" parent="android:Theme.DeviceDefault.Light"/>
+ <style name="AppThemeSelectorSettings" parent="android:Theme.DeviceDefault.Settings"/>
+
+</resources>
diff --git a/src/android/static_resources/resources_oss/res/values/application.xml b/src/android/static_resources/resources_oss/res/values/application.xml
index 9418083..c9dab5b 100644
--- a/src/android/static_resources/resources_oss/res/values/application.xml
+++ b/src/android/static_resources/resources_oss/res/values/application.xml
@@ -30,26 +30,8 @@
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-->
<resources>
-
<string name="app_name">Mozc</string>
<string name="app_full_name">Mozc for Android</string>
<string name="developer_organization">Mozc Project Team</string>
<string name="mozc_preference">Preferences for Mozc</string>
- <string name="pref_about_terms_of_service_url">http://code.google.com/p/mozc/</string>
- <string name="pref_about_privacy_policy_url">http://code.google.com/p/mozc/</string>
- <!--
- MiniBrowser can access only the url which matches below pattern.
- This restriction is introduced in order not to show unexpected website in "EULA" activity.
- By default no restriction is applied in order to avoid from breaking existing implemntation.
- -->
- <string name="pref_url_restriction_regex">.*</string>
- <string name="user_dictionary_tool_export_provider_name">org.mozc.android.inputmethod.japanese.userdictionary.UserDictionaryExportProvider</string>
-
- <!--
- If you developer want to activate usage stats collection feature, turn the property on
- and change the URL in usage_stats/upload_util.cc.
- However usually you don't need the feature so please keep this false as long as possible.
- -->
- <bool name="sending_information_features_enabled">false</bool>
-
</resources>
diff --git a/src/android/static_resources/resources_oss/res/values/arrays.xml b/src/android/static_resources/resources_oss/res/values/arrays.xml
index 501cc7c..80fa0a9 100644
--- a/src/android/static_resources/resources_oss/res/values/arrays.xml
+++ b/src/android/static_resources/resources_oss/res/values/arrays.xml
@@ -73,28 +73,14 @@
<item>pref_landscape_fullscreen_key</item>
</string-array>
- <string-array name="pref_skin_type_entries">
- <item>@string/pref_skin_type_blue_lightgray</item>
- <item>@string/pref_skin_type_orange_lightgray</item>
- <item>@string/pref_skin_type_blue_darkgray</item>
- </string-array>
-
- <string-array name="pref_skin_type_values">
- <item>BLUE_LIGHTGRAY</item>
- <item>ORANGE_LIGHTGRAY</item>
- <item>BLUE_DARKGRAY</item>
- </string-array>
-
<string-array name="pref_hardware_keymap_entries">
<item>@string/pref_hardware_keymap_default</item>
<item>@string/pref_hardware_keymap_japanese109A</item>
- <item>@string/pref_hardware_keymap_twelvekey</item>
</string-array>
<string-array name="pref_hardware_keymap_values">
<item>DEFAULT</item>
<item>JAPANESE109A</item>
- <item>TWELVEKEY</item>
</string-array>
<string-array name="pref_dictionary_personalization_entries">
diff --git a/src/android/static_resources/resources_oss/res/values/arrays_skin.xml b/src/android/static_resources/resources_oss/res/values/arrays_skin.xml
new file mode 100644
index 0000000..129d651
--- /dev/null
+++ b/src/android/static_resources/resources_oss/res/values/arrays_skin.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+
+<resources>
+
+ <!-- TODO(matsuzakit): Create new arrays_skin.xml into values-v20?v21? and remove material design from this file. -->
+ <string-array name="pref_skin_type_entries">
+ <item>@string/pref_skin_type_blue_lightgray</item>
+ <item>@string/pref_skin_type_orange_lightgray</item>
+ <item>@string/pref_skin_type_blue_darkgray</item>
+ <item>@string/pref_skin_type_material_design_light</item>
+ <item>@string/pref_skin_type_material_design_dark</item>
+ </string-array>
+ <string-array name="pref_skin_type_values">
+ <item>BLUE_LIGHTGRAY</item>
+ <item>ORANGE_LIGHTGRAY</item>
+ <item>BLUE_DARKGRAY</item>
+ <item>MATERIAL_DESIGN_LIGHT</item>
+ <item>MATERIAL_DESIGN_DARK</item>
+ </string-array>
+
+</resources>
diff --git a/src/android/static_resources/resources_oss/res/values/attrs.xml b/src/android/static_resources/resources_oss/res/values/attrs.xml
index 27f26bf..0cd5fec 100644
--- a/src/android/static_resources/resources_oss/res/values/attrs.xml
+++ b/src/android/static_resources/resources_oss/res/values/attrs.xml
@@ -55,20 +55,28 @@
<enum name="qwertyRegular" value="3" />
<enum name="qwertyFunction" value="4" />
<enum name="qwertyFunctionWithThreeDots" value="5" />
- <enum name="qwertyFunctionLightOn" value="6" />
- <enum name="qwertyFunctionLightOff" value="7" />
+ <enum name="qwertyFunctionSpaceWithThreeDots" value="6" />
+ <enum name="keyboardSeparatorTop" value="7" />
+ <enum name="keyboardSeparatorCenter" value="8" />
+ <enum name="keyboardSeparatorBottom" value="9" />
+ <enum name="transparent" value="10" />
</attr>
<attr name="keyWidth" format="dimension|fraction" />
<attr name="keyHeight" format="dimension|fraction" />
+ <attr name="keyHorizontalLayoutWeight" format="integer" />
<attr name="horizontalGap" format="dimension|fraction" />
<attr name="verticalGap" format="dimension|fraction" />
-
- <attr name="popUpWidth" format="dimension|fraction" />
+ <attr name="defaultIconWidth" format="dimension|fraction" />
+ <attr name="defaultIconHeight" format="dimension|fraction" />
+ <attr name="defaultHorizontalPadding" format="dimension|fraction" />
+ <attr name="defaultVerticalPadding" format="dimension|fraction" />
<attr name="popUpHeight" format="dimension|fraction" />
<!-- following offset is diff between a center of a key and a center of the popup window. -->
<attr name="popUpXOffset" format="dimension|fraction" />
<attr name="popUpYOffset" format="dimension|fraction" />
+ <attr name="popUpIconWidth" format="dimension|fraction" />
+ <attr name="popUpIconHeight" format="dimension|fraction" />
</declare-styleable>
<declare-styleable name="Row">
@@ -90,7 +98,6 @@
</attr>
<attr name="isRepeatable" format="boolean" />
<attr name="isModifier" format="boolean" />
- <attr name="isSticky" format="boolean" />
</declare-styleable>
<declare-styleable name="KeyState">
@@ -117,9 +124,19 @@
<flag name="variation_uri" value="1024" />
<flag name="variation_email_address" value="2048" />
+ <!-- globe and no_globe are XOR. -->
<flag name="globe" value="4096" />
+ <flag name="no_globe" value="8192" />
- <flag name="composing" value="8192" />
+ <flag name="composing" value="16384" />
+ <flag name="handling_touch_event" value="32768" />
+
+ <!-- "fallback" works as "catch all" when no other flags are matched.
+ metaState="fallback" equals to metaState="" so typically
+ this flag is not specified explicity.
+ However this is useful when used with logical-OR operator.
+ e.g., metaState="fallback|composing" -->
+ <flag name="fallback" value="1073741824" />
</attr>
<attr name="nextMetaState">
<!-- TODO(matsuzakit): Rename to nextAddedMetaStates -->
@@ -132,7 +149,7 @@
<flag name="capsLock" value="2" />
<flag name="alt" value="4" />
</attr>
- </declare-styleable>
+ </declare-styleable>
<declare-styleable name="Flick">
<attr name="direction">
@@ -149,12 +166,39 @@
<attr name="sourceId" format="integer" />
<attr name="keyCode" format="integer|string" />
<attr name="longPressKeyCode" format="integer|string" />
+ <attr name="longPressTimeoutTrigger" format="boolean" />
<attr name="keyIcon" format="reference" />
<attr name="keyCharacter" format="string" />
<attr name="flickHighlight" format="boolean" />
- </declare-styleable>
+ <attr name="horizontalPadding" format="fraction" />
+ <attr name="verticalPadding" format="fraction" />
+ <!-- iconWidth/Height are used to control the size of shown icon.
+ The region on which an icon is shown is detemined in below way:
+ 1. The region is initially given by keyboard parser (Size: Key width x Row height).
+ 2. The region is shrinked by horizontal/verticalPadding.
+ 3. If (iconWidth > region_width OR iconHeight > region_height),
+ the icon is drawn in the region (iconWidth/Height is not used).
+ If not, the icon is shown in the size (iconHeight, iconWidth).
+ 4. Aspect ratio is always kept.
+ The default values are too large so
+ if not provided the icon is drawn as large as possible. -->
+ <attr name="iconHeight" format="fraction|dimension" />
+ <attr name="iconWidth" format="fraction|dimension" />
+ </declare-styleable>
<declare-styleable name="PopUp">
<attr name="popUpIcon" format="reference" />
+ <attr name="popUpLongPressIcon" format="reference" />
+ </declare-styleable>
+
+ <declare-styleable name="Skin">
+ <attr name="dimension" format="dimension|fraction|reference" />
+ </declare-styleable>
+
+ <declare-styleable name="MozcImageView">
+ <!-- Drawable represened as raw resource must be specified through "rawSrc" attribute. -->
+ <attr name="rawSrc" format="reference" />
+ <attr name="maxImageWidth" format="dimension" />
+ <attr name="maxImageHeight" format="dimension" />
</declare-styleable>
</resources>
diff --git a/src/android/static_resources/resources_oss/res/values/bools.xml b/src/android/static_resources/resources_oss/res/values/bools.xml
index 3417c7f..c4279eb 100644
--- a/src/android/static_resources/resources_oss/res/values/bools.xml
+++ b/src/android/static_resources/resources_oss/res/values/bools.xml
@@ -32,6 +32,8 @@
<resources>
<bool name="im_is_default">false</bool>
- <bool name="enable_user_dictionary_tools_activity">true</bool>
+ <!-- Note: User dictionary export is enabled from v16 due to the bug in v14 framework. -->
+ <!-- See values-v16/bools.xml. -->
+ <bool name="enable_user_dictionary_export">false</bool>
</resources>
diff --git a/src/android/static_resources/resources_oss/res/values/colors.xml b/src/android/static_resources/resources_oss/res/values/colors.xml
index 5fea831..bd40aa8 100644
--- a/src/android/static_resources/resources_oss/res/values/colors.xml
+++ b/src/android/static_resources/resources_oss/res/values/colors.xml
@@ -34,13 +34,6 @@
<color name="pref_inputstyle_title_disabled">#80D8D8D8</color>
<color name="symbol_input_background_top" >#D8D8D8</color>
<color name="symbol_input_background_bottom" >#ABABAB</color>
- <color name="symbol_view_tab_background">#E5E5E5</color>
-
- <!-- This color is used only by QWERTY keyboard
- because only it has span between keys. -->
- <color name="keyboard_background">#524C51</color>
- <!-- TODO(matsuzakit): Background color is TBD. -->
- <color name="candidate_background">#C6C6C6</color>
<color name="input_frame_background">#e5e5e5</color>
<!-- Color setting of "action bar"-like UI for User Dictionary Tool. -->
@@ -48,7 +41,17 @@
<color name="action_bar_background_shade">#CCC</color>
<color name="action_bar_pressed_background">#77C5E1</color>
- <color name="dropshadow_start">#50000000</color>
- <color name="dropshadow_end">#00000000</color>
+ <!-- Floating candidate window. -->
+ <color name="floating_candidate_window_background">#eceff1</color>
+ <color name="floating_candidate_text">#cc37474f</color>
+ <color name="floating_candidate_focus_background">#1a37474f</color>
+ <color name="floating_candidate_focused_text">#000</color>
+ <color name="floating_candidate_shortcut_text">#8037474f</color>
+ <color name="floating_candidate_description_text">#8037474f</color>
+ <color name="floating_candidate_footer_icon_pressed_background">#1a37474f</color>
+ <color name="floating_candidate_footer_text">#8037474f</color>
+ <color name="floating_candidate_footer_separator">#4d37474f</color>
+ <color name="floating_candidate_scroll_indicator">#4db6ac</color>
+ <color name="floating_candidate_shadow">#9937474f</color>
</resources>
diff --git a/src/android/static_resources/resources_oss/res/values/config.xml b/src/android/static_resources/resources_oss/res/values/config.xml
index 04f9222..97e8e78 100644
--- a/src/android/static_resources/resources_oss/res/values/config.xml
+++ b/src/android/static_resources/resources_oss/res/values/config.xml
@@ -44,8 +44,6 @@
<integer name="input_frame_expand_overshoot_rate">30000</integer>
<!-- Overshoot duration rate for expanding input frame in ppm -->
<integer name="input_frame_expand_overshoot_duration_rate">400000</integer>
- <!-- The threshold velocity of snapping input window. -->
- <integer name="input_frame_snap_velocity_threshold">100</integer>
<!-- Duration for fading in/out of candidate frame (in pixels/sec). -->
<integer name="candidate_frame_transition_duration">100</integer>
<!-- Candidate window scroll animation : Velocity decay rate in ppm -->
@@ -57,25 +55,9 @@
<!-- Symbol input window scroll animation : Minimum velocity in pixels per sec -->
<integer name="symbol_input_scroller_minimum_velocity">500</integer>
<!-- Symbol input window : The duration of the animation when a sub-category changes, in ms. -->
- <integer name="symbol_input_slide_to_next_category_duration">200</integer>
- <!-- Columns per screen in symbol input view (Emoticon). -->
- <integer name="symbol_input_candidate_columns_emoticon">4</integer>
- <!-- Columns per screen in symbol input view (Symbol). -->
- <integer name="symbol_input_candidate_columns_symbol">5</integer>
- <!-- Columns per screen in symbol input view (Emoji). -->
- <integer name="symbol_input_candidate_columns_emoji">5</integer>
- <!-- Rows per screen in symbol input view. -->
- <integer name="symbol_input_candidate_rows">4</integer>
- <!-- Transition duration of symbol input (in) -->
- <integer name="symbol_input_transition_duration_in">200</integer>
- <!-- Transition duration of symbol input (out) -->
- <integer name="symbol_input_transition_duration_out">100</integer>
- <!-- Configurations used by the classed from LatinIME -->
- <integer name="config_delay_before_preview">0</integer>
- <integer name="config_delay_after_preview">10</integer>
- <integer name="config_keyboard_grid_width">8</integer>
- <integer name="config_keyboard_grid_height">8</integer>
+ <!-- Transition duration of symbol input -->
+ <integer name="symbol_input_transition_duration">50</integer>
<!-- Configurations for key event timing (in milliseconds). -->
<integer name="config_repeat_key_delay">400</integer>
@@ -88,4 +70,9 @@
<!-- Duration for fading in/out of candidate frame (in pixels/sec). -->
<integer name="layout_adjustment_transition_duration">200</integer>
+ <integer name="floating_candidate_candidate_num">5</integer>
+ <integer name="floating_mode_indicator_in_duration">50</integer>
+ <integer name="floating_mode_indicator_out_duration">100</integer>
+ <integer name="floating_mode_indicator_display_time">420</integer>
+
</resources>
diff --git a/src/android/static_resources/resources_oss/res/values/contentdescription.xml b/src/android/static_resources/resources_oss/res/values/contentdescription.xml
index 7bd3534..b9f9d54 100644
--- a/src/android/static_resources/resources_oss/res/values/contentdescription.xml
+++ b/src/android/static_resources/resources_oss/res/values/contentdescription.xml
@@ -44,186 +44,185 @@
so explicitly "じー" is used instead.
-->
- <string name="cd_key_shift">shift</string>
- <string name="cd_key_up">up</string>
- <string name="cd_key_left">left</string>
- <string name="cd_key_right">right</string>
- <string name="cd_key_down">down</string>
- <string name="cd_key_chartype_to_kana">switch to Kana keyboard</string>
- <string name="cd_key_chartype_to_123">switch to number keyboard</string>
- <string name="cd_key_chartype_to_abc">switch to Alphabet keyboard</string>
- <string name="cd_key_chartype_to_kana_123">switch to symbol keyboard</string>
- <string name="cd_key_chartype_to_abc_123">switch to symbol keyboard</string>
- <string name="cd_key_undo">undo</string>
- <string name="cd_key_symbol">symbol input screen</string>
- <string name="cd_key_alt">alternative symbols</string>
- <string name="cd_key_alt_unmodified">normal symbols</string>
- <string name="cd_key_capslock">caps lock</string>
- <string name="cd_key_capsunlock">caps unlock</string>
- <string name="cd_key_menu_dialog">open menu</string>
- <string name="cd_key_ime_picker_dialog">switch input method</string>
- <string name="cd_key_uchar_backspace">backspace</string>
- <string name="cd_key_uchar_linefeed">linefeed</string>
- <string name="cd_key_uchar_space">space</string>
- <string name="cd_key_uchar_exclamation_mark">exclamation mark</string>
- <string name="cd_key_uchar_quotation_mark">quotation mark</string>
- <string name="cd_key_uchar_number_sign">number sign</string>
- <string name="cd_key_uchar_dollar_sign">dollar sign</string>
- <string name="cd_key_uchar_percent_sign">percent sign</string>
- <string name="cd_key_uchar_ampersand">ampersand</string>
- <string name="cd_key_uchar_apostrophe">apostrophe</string>
- <string name="cd_key_uchar_left_parenthesis">left parenthesis</string>
- <string name="cd_key_uchar_right_parenthesis">right parenthesis</string>
- <string name="cd_key_uchar_asterisk">asterisk</string>
- <string name="cd_key_uchar_plus_sign">plus sign</string>
- <string name="cd_key_uchar_comma">comma</string>
- <string name="cd_key_uchar_hyphen_minus">hyphen</string>
- <string name="cd_key_uchar_full_stop">period</string>
- <string name="cd_key_uchar_solidus">slash</string>
- <string name="cd_key_uchar_digit_zero">0</string>
- <string name="cd_key_uchar_digit_one">1</string>
- <string name="cd_key_uchar_digit_two">2</string>
- <string name="cd_key_uchar_digit_three">3</string>
- <string name="cd_key_uchar_digit_four">4</string>
- <string name="cd_key_uchar_digit_five">5</string>
- <string name="cd_key_uchar_digit_six">6</string>
- <string name="cd_key_uchar_digit_seven">7</string>
- <string name="cd_key_uchar_digit_eight">8</string>
- <string name="cd_key_uchar_digit_nine">9</string>
- <string name="cd_key_uchar_colon">colon</string>
- <string name="cd_key_uchar_semicolon">semicolon</string>
- <string name="cd_key_uchar_less_than_sign">less than sign</string>
- <string name="cd_key_uchar_equals_sign">equals sign</string>
- <string name="cd_key_uchar_greater_than_sign">greater than sign</string>
- <string name="cd_key_uchar_question_mark">question mark</string>
- <string name="cd_key_uchar_commercial_at">at mark</string>
- <string name="cd_key_uchar_latin_capital_letter_a">A</string>
- <string name="cd_key_uchar_latin_capital_letter_b">B</string>
- <string name="cd_key_uchar_latin_capital_letter_c">C</string>
- <string name="cd_key_uchar_latin_capital_letter_d">D</string>
- <string name="cd_key_uchar_latin_capital_letter_e">E</string>
- <string name="cd_key_uchar_latin_capital_letter_f">F</string>
- <string name="cd_key_uchar_latin_capital_letter_g">G</string>
- <string name="cd_key_uchar_latin_capital_letter_h">H</string>
- <string name="cd_key_uchar_latin_capital_letter_i">I</string>
- <string name="cd_key_uchar_latin_capital_letter_j">J</string>
- <string name="cd_key_uchar_latin_capital_letter_k">K</string>
- <string name="cd_key_uchar_latin_capital_letter_l">L</string>
- <string name="cd_key_uchar_latin_capital_letter_m">M</string>
- <string name="cd_key_uchar_latin_capital_letter_n">N</string>
- <string name="cd_key_uchar_latin_capital_letter_o">O</string>
- <string name="cd_key_uchar_latin_capital_letter_p">P</string>
- <string name="cd_key_uchar_latin_capital_letter_q">Q</string>
- <string name="cd_key_uchar_latin_capital_letter_r">R</string>
- <string name="cd_key_uchar_latin_capital_letter_s">S</string>
- <string name="cd_key_uchar_latin_capital_letter_t">T</string>
- <string name="cd_key_uchar_latin_capital_letter_u">U</string>
- <string name="cd_key_uchar_latin_capital_letter_v">V</string>
- <string name="cd_key_uchar_latin_capital_letter_w">W</string>
- <string name="cd_key_uchar_latin_capital_letter_x">X</string>
- <string name="cd_key_uchar_latin_capital_letter_y">Y</string>
- <string name="cd_key_uchar_latin_capital_letter_z">Z</string>
- <string name="cd_key_uchar_left_square_bracket">left square bracket</string>
- <string name="cd_key_uchar_reverse_solidus">back slash</string>
- <string name="cd_key_uchar_right_square_bracket">right square bracket</string>
- <string name="cd_key_uchar_circumflex_accent">hat</string>
- <string name="cd_key_uchar_low_line">under score</string>
- <string name="cd_key_uchar_grave_accent">grave</string>
- <string name="cd_key_uchar_latin_small_letter_a">a</string>
- <string name="cd_key_uchar_latin_small_letter_b">b</string>
- <string name="cd_key_uchar_latin_small_letter_c">c</string>
- <string name="cd_key_uchar_latin_small_letter_d">d</string>
- <string name="cd_key_uchar_latin_small_letter_e">e</string>
- <string name="cd_key_uchar_latin_small_letter_f">f</string>
- <string name="cd_key_uchar_latin_small_letter_g">g</string>
- <string name="cd_key_uchar_latin_small_letter_h">h</string>
- <string name="cd_key_uchar_latin_small_letter_i">i</string>
- <string name="cd_key_uchar_latin_small_letter_j">j</string>
- <string name="cd_key_uchar_latin_small_letter_k">k</string>
- <string name="cd_key_uchar_latin_small_letter_l">l</string>
- <string name="cd_key_uchar_latin_small_letter_m">m</string>
- <string name="cd_key_uchar_latin_small_letter_n">n</string>
- <string name="cd_key_uchar_latin_small_letter_o">o</string>
- <string name="cd_key_uchar_latin_small_letter_p">p</string>
- <string name="cd_key_uchar_latin_small_letter_q">q</string>
- <string name="cd_key_uchar_latin_small_letter_r">r</string>
- <string name="cd_key_uchar_latin_small_letter_s">s</string>
- <string name="cd_key_uchar_latin_small_letter_t">t</string>
- <string name="cd_key_uchar_latin_small_letter_u">u</string>
- <string name="cd_key_uchar_latin_small_letter_v">v</string>
- <string name="cd_key_uchar_latin_small_letter_w">w</string>
- <string name="cd_key_uchar_latin_small_letter_x">x</string>
- <string name="cd_key_uchar_latin_small_letter_y">y</string>
- <string name="cd_key_uchar_latin_small_letter_z">z</string>
- <string name="cd_key_uchar_left_curly_bracket">left curly bracket</string>
- <string name="cd_key_uchar_vertical_line">vertical line</string>
- <string name="cd_key_uchar_right_curly_bracket">right curly bracket</string>
- <string name="cd_key_uchar_tilde">tilde</string>
+ <string name="cd_key_shift" translation_description="When 'Shift' key in the keyboard is pressed, this string is spoken up for accessibility">shift</string>
+ <string name="cd_key_up" translation_description="When 'Up' arrow key in the keyboard is pressed, this string is spoken up for accessibility">up</string>
+ <string name="cd_key_left" translation_description="When 'Left' arrow key in the keyboard is pressed, this string is spoken up for accessibility">left</string>
+ <string name="cd_key_right" translation_description="When 'Right' arrow key in the keyboard is pressed, this string is spoken up for accessibility">right</string>
+ <string name="cd_key_down" translation_description="When 'Down' arrow key in the keyboard is pressed, this string is spoken up for accessibility">down</string>
+ <string name="cd_key_chartype_to_kana" translation_description="When the keyboard is switched to the 'Kana' (Japanese phonogram) mode, this string is spoken up for accessibility">switch to Kana keyboard</string>
+ <string name="cd_key_chartype_to_abc" translation_description="When the keyboard is switched to the 'Alphabet' mode, this string is spoken up for accessibility">switch to Alphabet keyboard</string>
+ <string name="cd_key_chartype_to_abc_123" translation_description="When the keyboard is switched to the 'Symbol' mode, this string is spoken up for accessibility">switch to symbol keyboard</string>
+ <string name="cd_key_undo" translation_description="When 'Undo' key in the keyboard is pressed, this string is spoken up for accessibility">undo</string>
+ <string name="cd_key_symbol" translation_description="When 'Symbol' key in the keyboard is pressed, this string is spoken up for accessibility">symbol input screen</string>
+ <string name="cd_key_alt" translation_description="When the keyboard is switched into alternative symbol mode, this string is spoken up for accessibility">alternative symbols</string>
+ <string name="cd_key_alt_unmodified" translation_description="When the keyboard is swtiched back from alternative symbol mode to normal symbole mode, this string is spoken up for accessibility">normal symbols</string>
+ <string name="cd_key_capslock" translation_description="When the keyboard is switched into caps lock mode, this string is spoken up for accessibility">caps lock</string>
+ <string name="cd_key_capsunlock" translation_description="When the keyboard is swtiched back from caps lock mode to normal mode, this string is spoken up for accessibility">caps unlock</string>
+ <string name="cd_key_menu_dialog" translation_description="When the menu dialog is opened, this string is spoken up for accessibility. 'Open' is a verb.">open menu</string>
+ <string name="cd_key_globe" translation_description="When the input method is switched to another, this string is spoken up for accessibility">switch input method</string>
+ <string name="cd_key_uchar_backspace" translation_description="When 'Backspace' key in the keyboard is pressed, this string is spoken up for accessibility">backspace</string>
+ <string name="cd_key_uchar_linefeed" translation_description="When 'Linefeed' key in the keyboard is pressed, this string is spoken up for accessibility">linefeed</string>
+ <string name="cd_key_uchar_space" translation_description="When 'Space' key in the keyboard is pressed, this string is spoken up for accessibility">space</string>
+ <string name="cd_key_uchar_exclamation_mark" translation_description="When '!' key in the keyboard is pressed, this string is spoken up for accessibility">exclamation mark</string>
+ <string name="cd_key_uchar_quotation_mark" translation_description="When ["] key in the keyboard is pressed, this string is spoken up for accessibility">quotation mark</string>
+ <string name="cd_key_uchar_number_sign" translation_description="When '#' key in the keyboard is pressed, this string is spoken up for accessibility">number sign</string>
+ <string name="cd_key_uchar_dollar_sign" translation_description="When '$' key in the keyboard is pressed, this string is spoken up for accessibility">dollar sign</string>
+ <string name="cd_key_uchar_percent_sign" translation_description="When '%' key in the keyboard is pressed, this string is spoken up for accessibility">percent sign</string>
+ <string name="cd_key_uchar_ampersand" translation_description="When '&' key in the keyboard is pressed, this string is spoken up for accessibility">ampersand</string>
+ <string name="cd_key_uchar_apostrophe" translation_description="When ['] key in the keyboard is pressed, this string is spoken up for accessibility">apostrophe</string>
+ <string name="cd_key_uchar_left_parenthesis" translation_description="When '(' key in the keyboard is pressed, this string is spoken up for accessibility">left parenthesis</string>
+ <string name="cd_key_uchar_right_parenthesis" translation_description="When ')' key in the keyboard is pressed, this string is spoken up for accessibility">right parenthesis</string>
+ <string name="cd_key_uchar_asterisk" translation_description="When '*' key in the keyboard is pressed, this string is spoken up for accessibility">asterisk</string>
+ <string name="cd_key_uchar_plus_sign" translation_description="When '+' key in the keyboard is pressed, this string is spoken up for accessibility">plus sign</string>
+ <string name="cd_key_uchar_comma" translation_description="When ',' key in the keyboard is pressed, this string is spoken up for accessibility">comma</string>
+ <string name="cd_key_uchar_hyphen_minus" translation_description="When '-' key in the keyboard is pressed, this string is spoken up for accessibility">hyphen</string>
+ <string name="cd_key_uchar_full_stop" translation_description="When '.' key in the keyboard is pressed, this string is spoken up for accessibility">period</string>
+ <string name="cd_key_uchar_solidus" translation_description="When '/' key in the keyboard is pressed, this string is spoken up for accessibility">slash</string>
+ <string name="cd_key_uchar_digit_zero" translation_description="When '0' key in the keyboard is pressed, this string is spoken up for accessibility">0</string>
+ <string name="cd_key_uchar_digit_one" translation_description="When '1' key in the keyboard is pressed, this string is spoken up for accessibility">1</string>
+ <string name="cd_key_uchar_digit_two" translation_description="When '2' key in the keyboard is pressed, this string is spoken up for accessibility">2</string>
+ <string name="cd_key_uchar_digit_three" translation_description="When '3' key in the keyboard is pressed, this string is spoken up for accessibility">3</string>
+ <string name="cd_key_uchar_digit_four" translation_description="When '4' key in the keyboard is pressed, this string is spoken up for accessibility">4</string>
+ <string name="cd_key_uchar_digit_five" translation_description="When '5' key in the keyboard is pressed, this string is spoken up for accessibility">5</string>
+ <string name="cd_key_uchar_digit_six" translation_description="When '6' key in the keyboard is pressed, this string is spoken up for accessibility">6</string>
+ <string name="cd_key_uchar_digit_seven" translation_description="When '7' key in the keyboard is pressed, this string is spoken up for accessibility">7</string>
+ <string name="cd_key_uchar_digit_eight" translation_description="When '8' key in the keyboard is pressed, this string is spoken up for accessibility">8</string>
+ <string name="cd_key_uchar_digit_nine" translation_description="When '9' key in the keyboard is pressed, this string is spoken up for accessibility">9</string>
+ <string name="cd_key_uchar_colon" translation_description="When ':' key in the keyboard is pressed, this string is spoken up for accessibility">colon</string>
+ <string name="cd_key_uchar_semicolon" translation_description="When ';' key in the keyboard is pressed, this string is spoken up for accessibility">semicolon</string>
+ <string name="cd_key_uchar_less_than_sign" translation_description="When '<' key in the keyboard is pressed, this string is spoken up for accessibility">less than sign</string>
+ <string name="cd_key_uchar_equals_sign" translation_description="When '=' key in the keyboard is pressed, this string is spoken up for accessibility">equals sign</string>
+ <string name="cd_key_uchar_greater_than_sign" translation_description="When '>' key in the keyboard is pressed, this string is spoken up for accessibility">greater than sign</string>
+ <string name="cd_key_uchar_question_mark" translation_description="When '?' key in the keyboard is pressed, this string is spoken up for accessibility">question mark</string>
+ <string name="cd_key_uchar_commercial_at" translation_description="When '@' key in the keyboard is pressed, this string is spoken up for accessibility">at mark</string>
+ <string name="cd_key_uchar_latin_capital_letter_a" translation_description="When 'A' key in the keyboard is pressed, this string is spoken up for accessibility">A</string>
+ <string name="cd_key_uchar_latin_capital_letter_b" translation_description="When 'B' key in the keyboard is pressed, this string is spoken up for accessibility">B</string>
+ <string name="cd_key_uchar_latin_capital_letter_c" translation_description="When 'C' key in the keyboard is pressed, this string is spoken up for accessibility">C</string>
+ <string name="cd_key_uchar_latin_capital_letter_d" translation_description="When 'D' key in the keyboard is pressed, this string is spoken up for accessibility">D</string>
+ <string name="cd_key_uchar_latin_capital_letter_e" translation_description="When 'E' key in the keyboard is pressed, this string is spoken up for accessibility">E</string>
+ <string name="cd_key_uchar_latin_capital_letter_f" translation_description="When 'F' key in the keyboard is pressed, this string is spoken up for accessibility">F</string>
+ <string name="cd_key_uchar_latin_capital_letter_g" translation_description="When 'G' key in the keyboard is pressed, this string is spoken up for accessibility">G</string>
+ <string name="cd_key_uchar_latin_capital_letter_h" translation_description="When 'H' key in the keyboard is pressed, this string is spoken up for accessibility">H</string>
+ <string name="cd_key_uchar_latin_capital_letter_i" translation_description="When 'I' key in the keyboard is pressed, this string is spoken up for accessibility">I</string>
+ <string name="cd_key_uchar_latin_capital_letter_j" translation_description="When 'J' key in the keyboard is pressed, this string is spoken up for accessibility">J</string>
+ <string name="cd_key_uchar_latin_capital_letter_k" translation_description="When 'K' key in the keyboard is pressed, this string is spoken up for accessibility">K</string>
+ <string name="cd_key_uchar_latin_capital_letter_l" translation_description="When 'L' key in the keyboard is pressed, this string is spoken up for accessibility">L</string>
+ <string name="cd_key_uchar_latin_capital_letter_m" translation_description="When 'M' key in the keyboard is pressed, this string is spoken up for accessibility">M</string>
+ <string name="cd_key_uchar_latin_capital_letter_n" translation_description="When 'N' key in the keyboard is pressed, this string is spoken up for accessibility">N</string>
+ <string name="cd_key_uchar_latin_capital_letter_o" translation_description="When 'O' key in the keyboard is pressed, this string is spoken up for accessibility">O</string>
+ <string name="cd_key_uchar_latin_capital_letter_p" translation_description="When 'P' key in the keyboard is pressed, this string is spoken up for accessibility">P</string>
+ <string name="cd_key_uchar_latin_capital_letter_q" translation_description="When 'Q' key in the keyboard is pressed, this string is spoken up for accessibility">Q</string>
+ <string name="cd_key_uchar_latin_capital_letter_r" translation_description="When 'R' key in the keyboard is pressed, this string is spoken up for accessibility">R</string>
+ <string name="cd_key_uchar_latin_capital_letter_s" translation_description="When 'S' key in the keyboard is pressed, this string is spoken up for accessibility">S</string>
+ <string name="cd_key_uchar_latin_capital_letter_t" translation_description="When 'T' key in the keyboard is pressed, this string is spoken up for accessibility">T</string>
+ <string name="cd_key_uchar_latin_capital_letter_u" translation_description="When 'U' key in the keyboard is pressed, this string is spoken up for accessibility">U</string>
+ <string name="cd_key_uchar_latin_capital_letter_v" translation_description="When 'V' key in the keyboard is pressed, this string is spoken up for accessibility">V</string>
+ <string name="cd_key_uchar_latin_capital_letter_w" translation_description="When 'W' key in the keyboard is pressed, this string is spoken up for accessibility">W</string>
+ <string name="cd_key_uchar_latin_capital_letter_x" translation_description="When 'X' key in the keyboard is pressed, this string is spoken up for accessibility">X</string>
+ <string name="cd_key_uchar_latin_capital_letter_y" translation_description="When 'Y' key in the keyboard is pressed, this string is spoken up for accessibility">Y</string>
+ <string name="cd_key_uchar_latin_capital_letter_z" translation_description="When 'Z' key in the keyboard is pressed, this string is spoken up for accessibility">Z</string>
+ <string name="cd_key_uchar_left_square_bracket" translation_description="When '[' key in the keyboard is pressed, this string is spoken up for accessibility">left square bracket</string>
+ <string name="cd_key_uchar_reverse_solidus" translation_description="When '\' key in the keyboard is pressed, this string is spoken up for accessibility">back slash</string>
+ <string name="cd_key_uchar_right_square_bracket" translation_description="When ']' key in the keyboard is pressed, this string is spoken up for accessibility">right square bracket</string>
+ <string name="cd_key_uchar_circumflex_accent" translation_description="When '^' key in the keyboard is pressed, this string is spoken up for accessibility">hat</string>
+ <string name="cd_key_uchar_low_line" translation_description="When '_' key in the keyboard is pressed, this string is spoken up for accessibility">under score</string>
+ <string name="cd_key_uchar_grave_accent" translation_description="When '`' key in the keyboard is pressed, this string is spoken up for accessibility">grave</string>
+ <string name="cd_key_uchar_latin_small_letter_a" translation_description="When 'a' key in the keyboard is pressed, this string is spoken up for accessibility">a</string>
+ <string name="cd_key_uchar_latin_small_letter_b" translation_description="When 'b' key in the keyboard is pressed, this string is spoken up for accessibility">b</string>
+ <string name="cd_key_uchar_latin_small_letter_c" translation_description="When 'c' key in the keyboard is pressed, this string is spoken up for accessibility">c</string>
+ <string name="cd_key_uchar_latin_small_letter_d" translation_description="When 'd' key in the keyboard is pressed, this string is spoken up for accessibility">d</string>
+ <string name="cd_key_uchar_latin_small_letter_e" translation_description="When 'e' key in the keyboard is pressed, this string is spoken up for accessibility">e</string>
+ <string name="cd_key_uchar_latin_small_letter_f" translation_description="When 'f' key in the keyboard is pressed, this string is spoken up for accessibility">f</string>
+ <string name="cd_key_uchar_latin_small_letter_g" translation_description="When 'g' key in the keyboard is pressed, this string is spoken up for accessibility">g</string>
+ <string name="cd_key_uchar_latin_small_letter_h" translation_description="When 'h' key in the keyboard is pressed, this string is spoken up for accessibility">h</string>
+ <string name="cd_key_uchar_latin_small_letter_i" translation_description="When 'i' key in the keyboard is pressed, this string is spoken up for accessibility">i</string>
+ <string name="cd_key_uchar_latin_small_letter_j" translation_description="When 'j' key in the keyboard is pressed, this string is spoken up for accessibility">j</string>
+ <string name="cd_key_uchar_latin_small_letter_k" translation_description="When 'k' key in the keyboard is pressed, this string is spoken up for accessibility">k</string>
+ <string name="cd_key_uchar_latin_small_letter_l" translation_description="When 'l' key in the keyboard is pressed, this string is spoken up for accessibility">l</string>
+ <string name="cd_key_uchar_latin_small_letter_m" translation_description="When 'm' key in the keyboard is pressed, this string is spoken up for accessibility">m</string>
+ <string name="cd_key_uchar_latin_small_letter_n" translation_description="When 'n' key in the keyboard is pressed, this string is spoken up for accessibility">n</string>
+ <string name="cd_key_uchar_latin_small_letter_o" translation_description="When 'o' key in the keyboard is pressed, this string is spoken up for accessibility">o</string>
+ <string name="cd_key_uchar_latin_small_letter_p" translation_description="When 'p' key in the keyboard is pressed, this string is spoken up for accessibility">p</string>
+ <string name="cd_key_uchar_latin_small_letter_q" translation_description="When 'q' key in the keyboard is pressed, this string is spoken up for accessibility">q</string>
+ <string name="cd_key_uchar_latin_small_letter_r" translation_description="When 'r' key in the keyboard is pressed, this string is spoken up for accessibility">r</string>
+ <string name="cd_key_uchar_latin_small_letter_s" translation_description="When 's' key in the keyboard is pressed, this string is spoken up for accessibility">s</string>
+ <string name="cd_key_uchar_latin_small_letter_t" translation_description="When 't' key in the keyboard is pressed, this string is spoken up for accessibility">t</string>
+ <string name="cd_key_uchar_latin_small_letter_u" translation_description="When 'u' key in the keyboard is pressed, this string is spoken up for accessibility">u</string>
+ <string name="cd_key_uchar_latin_small_letter_v" translation_description="When 'v' key in the keyboard is pressed, this string is spoken up for accessibility">v</string>
+ <string name="cd_key_uchar_latin_small_letter_w" translation_description="When 'w' key in the keyboard is pressed, this string is spoken up for accessibility">w</string>
+ <string name="cd_key_uchar_latin_small_letter_x" translation_description="When 'x' key in the keyboard is pressed, this string is spoken up for accessibility">x</string>
+ <string name="cd_key_uchar_latin_small_letter_y" translation_description="When 'y' key in the keyboard is pressed, this string is spoken up for accessibility">y</string>
+ <string name="cd_key_uchar_latin_small_letter_z" translation_description="When 'z' key in the keyboard is pressed, this string is spoken up for accessibility">z</string>
+ <string name="cd_key_uchar_left_curly_bracket" translation_description="When '{' key in the keyboard is pressed, this string is spoken up for accessibility">left curly bracket</string>
+ <string name="cd_key_uchar_vertical_line" translation_description="When '|' key in the keyboard is pressed, this string is spoken up for accessibility">vertical line</string>
+ <string name="cd_key_uchar_right_curly_bracket" translation_description="When '}' key in the keyboard is pressed, this string is spoken up for accessibility">right curly bracket</string>
+ <string name="cd_key_uchar_tilde" translation_description="When '~' key in the keyboard is pressed, this string is spoken up for accessibility">tilde</string>
+ <string name="cd_key_action_done" translation_description="When 'done' key in the keyboard is pressed, this string is spoken up for accessibility">done</string>
+ <string name="cd_key_action_go" translation_description="When 'go' key in the keyboard is pressed, this string is spoken up for accessibility">go</string>
+ <string name="cd_key_action_next" translation_description="When 'next' key in the keyboard is pressed, this string is spoken up for accessibility">next</string>
+ <string name="cd_key_action_previous" translation_description="When 'previous' key in the keyboard is pressed, this string is spoken up for accessibility">previous</string>
+ <string name="cd_key_action_search" translation_description="When 'search' key in the keyboard is pressed, this string is spoken up for accessibility">search</string>
+ <string name="cd_key_action_send" translation_description="When 'send' key in the keyboard is pressed, this string is spoken up for accessibility. This key is used when the composed text will be sent like chat app.">send</string>
+ <string name="cd_key_composing_done" translation_description="When 'submit' key in the keyboard is pressed, this string is spoken up for accessibility. This key is generically used when text composing is finished.">submit</string>
<!-- Keys in Kana keyboard -->
- <string name="cd_key_kana_line_a">A row</string>
- <string name="cd_key_kana_line_ka">KA row</string>
- <string name="cd_key_kana_line_sa">SA row</string>
- <string name="cd_key_kana_line_ta">TA row</string>
- <string name="cd_key_kana_line_na">NA row</string>
- <string name="cd_key_kana_line_ha">HA row</string>
- <string name="cd_key_kana_line_ma">MA row</string>
- <string name="cd_key_kana_line_ya">YA row</string>
- <string name="cd_key_kana_line_ra">RA row</string>
- <string name="cd_key_kana_modifier">voiced sound mark</string>
- <string name="cd_key_kana_line_wa">WA row</string>
- <string name="cd_key_kana_punctuation">punctuation</string>
+ <string name="cd_key_kana_line_a" translation_description="This string is spoken up for accessibility, when the button of Japanese A column (あ行: A, I, U, E, O) in the keyboard is pressed.">A column</string>
+ <string name="cd_key_kana_line_ka" translation_description="This string is spoken up for accessibility, when the button of Japanese KA column (か行: KA, KI, KU, KE, KO) in the keyboard is pressed.">KA column</string>
+ <string name="cd_key_kana_line_sa" translation_description="This string is spoken up for accessibility, when the button of Japanese SA column (さ行: SA, SHI, SU, SE, SO) in the keyboard is pressed.">SA column</string>
+ <string name="cd_key_kana_line_ta" translation_description="This string is spoken up for accessibility, when the button of Japanese TA column (た行: TA, CHI, TSU, TE, TO) in the keyboard is pressed.">TA column</string>
+ <string name="cd_key_kana_line_na" translation_description="This string is spoken up for accessibility, when the button of Japanese NA column (な行: NA, NI, NU, NE, NO) in the keyboard is pressed.">NA column</string>
+ <string name="cd_key_kana_line_ha" translation_description="This string is spoken up for accessibility, when the button of Japanese HA column (は行: HA, HI, FU, HE, HO) in the keyboard is pressed.">HA column</string>
+ <string name="cd_key_kana_line_ma" translation_description="This string is spoken up for accessibility, when the button of Japanese MA column (ま行: MA, MI, MU, ME, MO) in the keyboard is pressed.">MA column</string>
+ <string name="cd_key_kana_line_ya" translation_description="This string is spoken up for accessibility, when the button of Japanese YA column (や行: YA, YU, YO) in the keyboard is pressed.">YA column</string>
+ <string name="cd_key_kana_line_ra" translation_description="This string is spoken up for accessibility, when the button of Japanese RA column (ら行: RA, RI, RU, RE, RO) in the keyboard is pressed.">RA column</string>
+ <string name="cd_key_kana_modifier" translation_description="This string is spoken up for accessibility, when the button of Japanese voiced sound mark (゛) in the keyboard is pressed.">voiced sound mark</string>
+ <string name="cd_key_kana_line_wa" translation_description="This string is spoken up for accessibility, when the button of Japanese WA column (わ行: WA, WO, N) in the keyboard is pressed.">WA column</string>
+ <string name="cd_key_kana_punctuation" translation_description="This string is spoken up for accessibility, when the button of Japanese punctuation mark (、 。) in the keyboard is pressed.">punctuation</string>
+ <string name="cd_key_uchar_katakana_middle_dot" translation_description="This string is spoken up for accessibility, when the button of middle dot mark (・) in the keyboard s pressed.">middle dot</string>
+ <string name="cd_key_uchar_ideographic_comma" translation_description="This string is spoken up for accessibility, when the button of Japanese comma character (、) in the keyboard is pressed.">comma</string>
+ <string name="cd_key_uchar_ideographic_full_stop" translation_description="This string is spoken up for accessibility, when the button of Japanese period character (。) in the keyboard is pressed.">period</string>
+ <string name="cd_key_uchar_katakana_hiragana_prolonged_sound_mark" translation_description="This string is spoken up for accessibility, when the button of Japanese prolonged sound mark (ー) in the keyboard is pressed.">prolonged sound mark</string>
- <!-- Keys in Qwerty-Kana keyboard -->
- <string name="cd_key_uchar_black_star">star</string>
- <string name="cd_key_uchar_black_heart_suit">heart</string>
- <string name="cd_key_uchar_eighth_note">music note</string>
- <string name="cd_key_uchar_reference_mark">reference mark</string>
- <string name="cd_key_uchar_postal_mark">postal mark</string>
- <string name="cd_key_uchar_multiplication_sign">multiplication sign</string>
- <string name="cd_key_uchar_division_sign">division sign</string>
- <string name="cd_key_uchar_left_corner_bracket">left corner bracket</string>
- <string name="cd_key_uchar_right_corner_bracket">right corner bracket</string>
- <string name="cd_key_uchar_katakana_middle_dot">middle dot</string>
- <string name="cd_key_uchar_two_dot_leader">two dot leader</string>
- <string name="cd_key_uchar_three_dot_leader">three dot leader</string>
- <string name="cd_key_uchar_left_black_lenticular_bracket">left lenticular bracket</string>
- <string name="cd_key_uchar_right_black_lenticular_bracket">right black lenticular bracket</string>
- <string name="cd_key_uchar_u6642">hour</string>
- <string name="cd_key_uchar_u5206">minute</string>
- <string name="cd_key_uchar_u6708">month</string>
- <string name="cd_key_uchar_u65e5">date</string>
- <string name="cd_key_uchar_wave_dash">wave dash</string>
- <string name="cd_key_compound_monday">monday</string>
- <string name="cd_key_compound_tuesday">tuesday</string>
- <string name="cd_key_compound_wednesday">wednesday</string>
- <string name="cd_key_compound_thursday">thursday</string>
- <string name="cd_key_compound_friday">friday</string>
- <string name="cd_key_compound_saturday">saturday</string>
- <string name="cd_key_compound_sunday">sunday</string>
- <string name="cd_key_uchar_ideographic_comma">comma</string>
- <string name="cd_key_uchar_ideographic_full_stop">period</string>
- <string name="cd_key_uchar_katakana_hiragana_prolonged_sound_mark">prolonged sound mark</string>
<!-- Keys in Alphabet keyboard -->
- <string name="cd_key_alphabet_abc">ABC</string>
- <string name="cd_key_alphabet_def">DEF</string>
- <string name="cd_key_alphabet_ghi">GHI</string>
- <string name="cd_key_alphabet_jkl">JKL</string>
- <string name="cd_key_alphabet_mno">MNO</string>
- <string name="cd_key_alphabet_pqrs">PQRS</string>
- <string name="cd_key_alphabet_tuv">TUV</string>
- <string name="cd_key_alphabet_wxyz">WXYZ</string>
- <string name="cd_key_alphabet_capitalize">capitalize</string>
- <string name="spoken_use_headphone_for_password">Plug in a headset to hear password keys spoken aloud</string>
- <string name="cd_keyboard_fold_button">Change the size of candidate window</string>
+ <string name="cd_key_alphabet_abc" translation_description="This string is spoken up for accessibility, when the button of ABC characters in the keyboard is pressed.">ABC</string>
+ <string name="cd_key_alphabet_def" translation_description="This string is spoken up for accessibility, when the button of DEF characters in the keyboard is pressed.">DEF</string>
+ <string name="cd_key_alphabet_ghi" translation_description="This string is spoken up for accessibility, when the button of GHI characters in the keyboard is pressed.">GHI</string>
+ <string name="cd_key_alphabet_jkl" translation_description="This string is spoken up for accessibility, when the button of JKL characters in the keyboard is pressed.">JKL</string>
+ <string name="cd_key_alphabet_mno" translation_description="This string is spoken up for accessibility, when the button of MNO characters in the keyboard is pressed.">MNO</string>
+ <string name="cd_key_alphabet_pqrs" translation_description="This string is spoken up for accessibility, when the button of PQRS characters in the keyboard is pressed.">PQRS</string>
+ <string name="cd_key_alphabet_tuv" translation_description="This string is spoken up for accessibility, when the button of TUV characters in the keyboard is pressed.">TUV</string>
+ <string name="cd_key_alphabet_wxyz" translation_description="This string is spoken up for accessibility, when the button of WXYZ characters in the keyboard is pressed.">WXYZ</string>
+ <string name="cd_key_alphabet_capitalize" translation_description="This string is spoken up for accessibility, when the button to capitalize alphabet characters in the keyboard is pressed.">capitalize</string>
+ <string name="spoken_use_headphone_for_password" translation_description="This string is spoken up for accessibility, when the system starts reading the characters in the passowrd field.">Plug in a headset to hear password keys spoken aloud</string>
+ <string name="cd_keyboard_fold_button" translation_description="This string is spoken up for accessibility, when the button to expand/fold the candidate word list is pressed. More details are described in Page 33 of http://goo.gl/jLDD7P">Change the size of candidate window</string>
<!-- Views -->
- <string name="cd_close_symbol_window">Back to keyboard</string>
- <string name="cd_symbol_window_symbol">Symbol</string>
- <string name="cd_symbol_window_emoticon">Emoticon</string>
- <string name="cd_symbol_window_emoji">Emoji</string>
- <string name="cd_symbol_window_backspace">Backspace</string>
- <string name="help_userdictionary_dictionary_name">Input dictionary name</string>
- <string name="help_userdictionary_edit_word_value">Input word</string>
- <string name="help_userdictionary_edit_word_key">Input reading</string>
+ <string name="cd_close_symbol_window" translation_description="This string is spoken up for accessibility, when the button to back to the keyboard is pressed.">Back to keyboard</string>
+ <string name="cd_symbol_window_number" translation_description="This string is spoken up for accessibility, when the button to go to the number keyboard is pressed.">Number</string>
+ <string name="cd_symbol_window_symbol" translation_description="This string is spoken up for accessibility, when the button to go to the symbol keyboard is pressed.">Symbol</string>
+ <string name="cd_symbol_window_emoticon" translation_description="This string is spoken up for accessibility, when the button to go to the emoticon keyboard is pressed.">Emoticon</string>
+ <string name="cd_symbol_window_emoji" translation_description="This string is spoken up for accessibility, when the button to go to the emoji keyboard is pressed.">Emoji</string>
+ <string name="cd_symbol_window_enter" translation_description="This string is spoken up for accessibility, when the enter key is pressed.">Linefeed</string>
+ <string name="cd_symbol_window_backspace" translation_description="This string is spoken up for accessibility, when the backspace key is pressed.">Backspace</string>
+ <string name="cd_symbol_window_minor_history" translation_description="This string is spoken up for accessibility, when the button to show symbol/emoticon/emoji history is pressed.">History</string>
+ <string name="cd_symbol_window_minor_symbol_general" translation_description="This string is spoken up for accessibility, when the button to show general symbols is pressed.">General symbol</string>
+ <string name="cd_symbol_window_minor_symbol_half" translation_description="This string is spoken up for accessibility, when the button to show full and half width symbols is pressed.">Full and half width symbol</string>
+ <string name="cd_symbol_window_minor_symbol_parenthesis" translation_description="This string is spoken up for accessibility, when the button to show parenthesis is pressed.">Parenthesis symbol</string>
+ <string name="cd_symbol_window_minor_symbol_arrow" translation_description="This string is spoken up for accessibility, when the button to show arrow symbols is pressed.">Arrow symbol</string>
+ <string name="cd_symbol_window_minor_symbol_math" translation_description="This string is spoken up for accessibility, when the button to show math symbols is pressed.">Math symbol</string>
+ <string name="cd_symbol_window_minor_emoticon_smile" translation_description="This string is spoken up for accessibility, when the button to show smile emoticon is pressed.">Smile emoticon</string>
+ <string name="cd_symbol_window_minor_emoticon_sweat" translation_description="This string is spoken up for accessibility, when the button to show sweat emoticon is pressed.">Sweat emoticon</string>
+ <string name="cd_symbol_window_minor_emoticon_surprise" translation_description="This string is spoken up for accessibility, when the button to show surprise emoticon is pressed.">Surprise emoticon</string>
+ <string name="cd_symbol_window_minor_emoticon_sadness" translation_description="This string is spoken up for accessibility, when the button to show sadness emoticon is pressed.">Sadness emoticon</string>
+ <string name="cd_symbol_window_minor_emoticon_displeasure" translation_description="This string is spoken up for accessibility, when the button to show displeasure emoticon is pressed.">Displeasure emoticon</string>
+ <string name="cd_symbol_window_minor_emoji_face" translation_description="This string is spoken up for accessibility, when the button to show face emoji is pressed.">Face emoji</string>
+ <string name="cd_symbol_window_minor_emoji_food" translation_description="This string is spoken up for accessibility, when the button to show food emoji is pressed.">Food emoji</string>
+ <string name="cd_symbol_window_minor_emoji_activity" translation_description="This string is spoken up for accessibility, when the button to show activity emoji is pressed.">Activity emoji</string>
+ <string name="cd_symbol_window_minor_emoji_city" translation_description="This string is spoken up for accessibility, when the button to show city emoji is pressed.">City emoji</string>
+ <string name="cd_symbol_window_minor_emoji_nature" translation_description="This string is spoken up for accessibility, when the button to show nature emoji is pressed.">Nature emoji</string>
+ <string name="help_userdictionary_dictionary_name" translation_description="Label asking the user to input the dictionary name.">Input dictionary name</string>
+ <string name="help_userdictionary_edit_word_value" translation_description="Label asking the user to input the word.">Input word</string>
+ <string name="help_userdictionary_edit_word_key" translation_description="Label asking the user to input the reading (pronunciation) of the word.">Input reading</string>
+ <string name="cd_voice_input" translation_description="This string is spoken up for accessibility, when voice input button is being pressed. Note that typically suffix 'button' is also spoken (e.g., 'Voice input button' in English).">Voice input</string>
+ <string name="cd_narrow_frame_widen_button" translation_description="This string is spoken up for accessibility, when the button to show the software keyboard is pressed. This button is available iff a physical keyboard is available.">Show the keyboard</string>
</resources>
diff --git a/src/android/static_resources/resources_oss/res/values/dimens.xml b/src/android/static_resources/resources_oss/res/values/dimens.xml
index 7a763f9..6c4eda5 100644
--- a/src/android/static_resources/resources_oss/res/values/dimens.xml
+++ b/src/android/static_resources/resources_oss/res/values/dimens.xml
@@ -31,84 +31,126 @@
-->
<resources>
- <dimen name="key_preview_height">74dip</dimen>
- <dimen name="keyboard_vertical_correction">-8dip</dimen>
+ <dimen name="key_preview_height">60dip</dimen>
+ <dimen name="popup_width_limitation">60dip</dimen>
<dimen name="mini_keyboard_vertical_correction">-81dip</dimen>
+ <dimen name="keyboard_separator_padding">16dip</dimen>
+ <dimen name="keyboard_separator_width">1dip</dimen>
+ <dimen name="default_function_icon_height">32dip</dimen>
+ <!-- This values is effective only when the keyboard height is very short.
+ As the icon resoureces of QWERTY keyboard don't have padding in them,
+ without minimum padding the design breaks. -->
+ <item name="keyboard_qwerty_default_vertical_padding" format="fraction" type="fraction">0.75%</item>
+ <item name="keyboard_qwerty_default_horizontal_padding" format="fraction" type="fraction">0.80%</item>
<dimen name="default_flick_threshold">20dip</dimen>
<dimen name="candidate_text_size">20dip</dimen>
<dimen name="candidate_description_text_size">10dip</dimen>
- <dimen name="candidate_text_size_aligned_layout">20dip</dimen>
+ <dimen name="candidate_text_size_aligned_layout">18dip</dimen>
<dimen name="candidate_description_text_size_aligned_layout">10dip</dimen>
- <dimen name="candidate_description_horizontal_padding">0.7dip</dimen>
- <dimen name="candidate_description_bottom_padding">4dip</dimen>
<dimen name="candidate_text_minimum_width">40dip</dimen>
- <dimen name="candidate_horizontal_padding_size">3dip</dimen>
- <dimen name="candidate_vertical_padding_size">8dip</dimen>
+ <dimen name="candidate_fold_icon_width">23dip</dimen>
+ <dimen name="candidate_horizontal_padding_size">5dip</dimen>
+ <dimen name="candidate_vertical_padding_size">10dip</dimen>
<dimen name="candidate_scrollbar_width">4.5dip</dimen>
<dimen name="candidate_scrollbar_minimum_height">10dip</dimen>
+ <dimen name="candidate_separator_width">1dip</dimen>
+ <dimen name="floating_candidate_window_minimum_width">200dip</dimen>
+ <dimen name="floating_candidate_window_horizontal_padding">10dip</dimen>
+ <dimen name="floating_candidate_window_horizontal_margin">2dip</dimen>
+ <dimen name="floating_candidate_window_vertical_margin">2dip</dimen>
+ <dimen name="floating_candidate_window_round_rect_radius">1dip</dimen>
+ <dimen name="floating_candidate_window_shadow_offset_y">1dip</dimen>
+ <dimen name="floating_candidate_window_shadow_radius">2dip</dimen>
+ <dimen name="floating_candidate_text_size">20dip</dimen>
+ <dimen name="floating_candidate_candidate_vertical_padding">10dip</dimen>
+ <dimen name="floating_candidate_candidate_description_minimum_padding">20dip</dimen>
+ <dimen name="floating_candidate_description_text_size">12dip</dimen>
+ <dimen name="floating_candidate_scroll_indicator_width">3dip</dimen>
+ <dimen name="floating_candidate_scroll_indicator_radius">1dip</dimen>
+ <dimen name="floating_candidate_footer_text_size">14dip</dimen>
+ <dimen name="floating_candidate_separator_width">1dip</dimen>
+ <dimen name="floating_candidate_separator_horizontal_padding">14dip</dimen>
+ <dimen name="floating_candidate_shortcut_text_size">20dip</dimen>
+ <dimen name="floating_candidate_shortcut_candidate_padding">8dip</dimen>
+ <dimen name="floating_mode_indicator_size">40dip</dimen>
+ <dimen name="floating_mode_indicator_vertical_margin">2dip</dimen>
<dimen name="pref_inputstyle_image_width">200dip</dimen>
- <dimen name="pref_inputstyle_gallery_height">200dip</dimen>
<dimen name="pref_inputstyle_horizontal_span">10dip</dimen>
<dimen name="pref_inputstyle_description_height">50dip</dimen>
<dimen name="pref_inputstyle_title_fontsize">20dip</dimen>
- <dimen name="symbol_horizontal_offset">7dip</dimen>
- <dimen name="symbol_view_scroll_guide_width_per_page">35dip</dimen>
- <dimen name="symbol_view_candidate_horizontal_padding_size">5dip</dimen>
- <dimen name="symbol_description_text_size">10dip</dimen>
- <dimen name="symbol_description_right_padding">2dip</dimen>
+ <!-- The width of on-memory keyboard to render keyboard preview image. 360dip is Nexus5's. -->
+ <dimen name="pref_inputstyle_reference_width">360dip</dimen>
+ <dimen name="symbol_candidate_horizontal_padding_size">8dip</dimen>
+ <dimen name="symbol_description_right_padding">5dip</dimen>
<dimen name="symbol_description_bottom_padding">4dip</dimen>
- <dimen name="symbol_view_minor_category_height">53dip</dimen>
- <dimen name="symbol_view_major_category_height">53dip</dimen>
- <dimen name="symbol_view_scroll_height">21dip</dimen>
+ <!-- symbol_view_major_category_height = input_frame_height / 4 (3 is for candidate rows, 1 is for major category) -->
+ <dimen name="symbol_view_major_category_height">55dip</dimen>
<dimen name="symbol_view_no_history_text_size">20dip</dimen>
- <dimen name="symbol_view_minor_category_text_size">14dip</dimen>
- <dimen name="symbol_view_minor_category_tab_widget_height">64dip</dimen>
- <dimen name="symbol_view_symbol_min_column_width">64dip</dimen>
+ <dimen name="symbol_view_symbol_min_column_width">60dip</dimen>
<dimen name="symbol_view_emoticon_min_column_width">88dip</dimen>
- <dimen name="symbol_view_emoji_min_column_width">64dip</dimen>
- <dimen name="symbol_view_candidate_height">48dip</dimen>
- <dimen name="translucent_border_height">3.4dip</dimen>
+ <dimen name="symbol_view_emoji_min_column_width">60dip</dimen>
+ <dimen name="symbol_view_candidate_height">@dimen/symbol_view_major_category_height</dimen>
+ <item name="symbol_separator_padding_fraction" format="fraction" type="fraction">25%</item>
+ <!-- symbol_view_height = input_frame_height + (candidate_text_size + candidate_vertical_padding_size * 2) -->
+ <dimen name="symbol_view_height">263.3dip</dimen>
+ <!-- symbol_view_number_keyboard_height = input_frame_height - symbol_view_major_category_height -->
+ <dimen name="symbol_view_number_keyboard_height">168.3dip</dimen>
<!--
- All "ime_window_height_{portrait|landscape}_{screensize}" are defined here
- for testing purpose.
+ ime_window_height = input_frame_height + (candidate_text_size + candidate_vertical_padding_size * 2) * n
+ n = 2 for portrait. Otherwise n = 1.
-->
- <dimen name="ime_window_height_portrait_normal">328.4dip</dimen>
- <dimen name="ime_window_height_landscape_normal">207.4dip</dimen>
- <dimen name="ime_window_height_portrait_xlarge">500dip</dimen>
- <dimen name="ime_window_height_landscape_xlarge">450dip</dimen>
- <dimen name="ime_window_height_portrait">@dimen/ime_window_height_portrait_normal</dimen>
- <dimen name="ime_window_height_landscape">@dimen/ime_window_height_landscape_normal</dimen>
- <!--
- The ime height to be applied is specified by referencing
- ime_window_height_{portrait|landscape}.
- And includes translucent_border_height.
- -->
- <dimen name="ime_window_height">@dimen/ime_window_height_portrait</dimen>
- <dimen name="input_frame_height">240dip</dimen>
- <!-- input_frame_height_width_shadow should be input_drame_height + translucent_border_height -->
- <dimen name="input_frame_height_with_shadow">243.4dip</dimen>
+ <dimen name="ime_window_height">303.3dip</dimen>
+ <dimen name="input_frame_height">223.3dip</dimen>
<dimen name="ime_window_partial_width">300dip</dimen>
<dimen name="side_frame_width">40dip</dimen>
<dimen name="side_adjust_button_width">25dip</dimen>
<dimen name="side_adjust_button_height">35dip</dimen>
<dimen name="ime_window_region_inset_threshold">650dip</dimen>
+ <!-- button_frame_height = candidate_text_size + candidate_vertical_padding_size * 2 -->
+ <dimen name="button_frame_height">40dip</dimen>
+ <dimen name="button_frame_button_width">45dip</dimen>
+ <dimen name="button_frame_button_height">35dip</dimen>
- <!-- Preferences used by the classes from LatinIME -->
- <dimen name="key_preview_text_size_large">37dip</dimen>
- <dimen name="mini_keyboard_slide_allowance">85dip</dimen>
-
- <!--
- If (PHYSICAL_SCREEN_HEIGHT - input_frame_height < fullscreen_threshold),
- then fullscreen mode is applied as default.
- This calculation is performed for Portrait and Landscape, respectively.
- -->
<dimen name="fullscreen_threshold">200dip</dimen>
<dimen name="firsttime_app_name_text_size">22dip</dimen>
<dimen name="firsttime_description_text_size">14dip</dimen>
<dimen name="firsttime_padding_height">14dip</dimen>
<dimen name="firsttime_padding_width">20dip</dimen>
- <dimen name="narrow_ime_window_height">125dip</dimen>
- <dimen name="narrow_frame_height">40dip</dimen>
+ <dimen name="narrow_ime_window_height">126dip</dimen>
+ <dimen name="narrow_frame_height">41dip</dimen>
+ <!-- Icon size.
+ Both phones and tables employ the same size except for
+ - Characters on keyboareds.
+ - Icons on symbol picker.
+ -->
+ <dimen name="unlimited">10000dip</dimen>
+ <dimen name="button_frame_microphone_height">22dip</dimen>
+ <dimen name="keyboard_enter_width">36dip</dimen>
+ <dimen name="keyboard_qwerty_space_height">30dip</dimen>
+ <dimen name="symbol_close_button_width">34dip</dimen>
+ <dimen name="symbol_major_emoji_disable_icon_height">16dip</dimen>
+ <dimen name="symbol_major_emoji_height">20dip</dimen>
+ <dimen name="symbol_major_emoticon_height">17dip</dimen>
+ <dimen name="symbol_major_number_height">14dip</dimen>
+ <dimen name="symbol_major_symbol_height">17dip</dimen>
+ <dimen name="symbol_minor_default_height">20dip</dimen>
+ <dimen name="symbol_minor_emoticon_height">16dip</dimen>
+
+ <!-- Character size of keyboard, depending on the screen size. -->
+ <dimen name="keyboard_godan_default_height">42dip</dimen>
+ <dimen name="keyboard_twelvekeys_default_height">56dip</dimen>
+ <dimen name="keyboard_qwerty_default_height">32dip</dimen>
+ <!--
+ Popup icon size is 20% bigger than key icon.
+ - On qwerty keyboard, popup has enough area so we can use same image
+ resources and simply scale it.
+ - On other keyboard, popup doesn't have enough area so we use enlarged
+ image resources.
+ -->
+ <dimen name="key_preview_icon_height">@dimen/keyboard_twelvekeys_default_height</dimen>
+ <dimen name="key_preview_qwerty_icon_height">38.4dip</dimen>
+ <dimen name="key_preview_emoji_icon_height">36dip</dimen>
+
</resources>
diff --git a/src/android/static_resources/resources_oss/res/values/keycodes.xml b/src/android/static_resources/resources_oss/res/values/keycodes.xml
index 8dfea13..77e7913 100644
--- a/src/android/static_resources/resources_oss/res/values/keycodes.xml
+++ b/src/android/static_resources/resources_oss/res/values/keycodes.xml
@@ -39,9 +39,7 @@
<integer name="key_right">-12</integer>
<integer name="key_down">-13</integer>
<integer name="key_chartype_to_kana">-14</integer>
- <integer name="key_chartype_to_123">-15</integer>
<integer name="key_chartype_to_abc">-16</integer>
- <integer name="key_chartype_to_kana_123">-23</integer>
<integer name="key_chartype_to_abc_123">-24</integer>
<integer name="key_undo">-18</integer>
@@ -50,7 +48,9 @@
<integer name="key_capslock">-21</integer>
<integer name="key_menu_dialog">-22</integer>
<integer name="key_ime_picker_dialog">-25</integer>
- <!-- Next available value is -26. -->
+ <integer name="key_globe">-26</integer>
+ <integer name="key_symbol_emoji">-27</integer>
+ <!-- Next available value is -28. -->
<!-- Deprecate : Use uchar_backspace -->
<integer name="key_backspace">8</integer>
diff --git a/src/android/static_resources/resources_oss/res/values/raws.xml b/src/android/static_resources/resources_oss/res/values/raws.xml
new file mode 100644
index 0000000..e26fc02
--- /dev/null
+++ b/src/android/static_resources/resources_oss/res/values/raws.xml
@@ -0,0 +1,153 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<resources>
+
+ <!-- Raw drawable for popup.
+ On phones they are shown but on tables they are hidden.
+ To do this these items are overridden by other raws.xml file. -->
+ <item name="optional__qwerty__keyicon__ampersand" format="reference" type="raw">@raw/qwerty__keyicon__ampersand</item>
+ <item name="optional__qwerty__keyicon__apostrophe" format="reference" type="raw">@raw/qwerty__keyicon__apostrophe</item>
+ <item name="optional__qwerty__keyicon__asterisk" format="reference" type="raw">@raw/qwerty__keyicon__asterisk</item>
+ <item name="optional__qwerty__keyicon__circumflex_accent" format="reference" type="raw">@raw/qwerty__keyicon__circumflex_accent</item>
+ <item name="optional__qwerty__keyicon__colon" format="reference" type="raw">@raw/qwerty__keyicon__colon</item>
+ <item name="optional__qwerty__keyicon__comma" format="reference" type="raw">@raw/qwerty__keyicon__comma</item>
+ <item name="optional__qwerty__keyicon__commercial_at" format="reference" type="raw">@raw/qwerty__keyicon__commercial_at</item>
+ <item name="optional__qwerty__keyicon__digit_eight" format="reference" type="raw">@raw/qwerty__keyicon__digit_eight</item>
+ <item name="optional__qwerty__keyicon__digit_five" format="reference" type="raw">@raw/qwerty__keyicon__digit_five</item>
+ <item name="optional__qwerty__keyicon__digit_four" format="reference" type="raw">@raw/qwerty__keyicon__digit_four</item>
+ <item name="optional__qwerty__keyicon__digit_nine" format="reference" type="raw">@raw/qwerty__keyicon__digit_nine</item>
+ <item name="optional__qwerty__keyicon__digit_one" format="reference" type="raw">@raw/qwerty__keyicon__digit_one</item>
+ <item name="optional__qwerty__keyicon__digit_seven" format="reference" type="raw">@raw/qwerty__keyicon__digit_seven</item>
+ <item name="optional__qwerty__keyicon__digit_six" format="reference" type="raw">@raw/qwerty__keyicon__digit_six</item>
+ <item name="optional__qwerty__keyicon__digit_three" format="reference" type="raw">@raw/qwerty__keyicon__digit_three</item>
+ <item name="optional__qwerty__keyicon__digit_two" format="reference" type="raw">@raw/qwerty__keyicon__digit_two</item>
+ <item name="optional__qwerty__keyicon__digit_zero" format="reference" type="raw">@raw/qwerty__keyicon__digit_zero</item>
+ <item name="optional__qwerty__keyicon__dollar_sign" format="reference" type="raw">@raw/qwerty__keyicon__dollar_sign</item>
+ <item name="optional__qwerty__keyicon__equals_sign" format="reference" type="raw">@raw/qwerty__keyicon__equals_sign</item>
+ <item name="optional__qwerty__keyicon__exclamation_mark" format="reference" type="raw">@raw/qwerty__keyicon__exclamation_mark</item>
+ <item name="optional__qwerty__keyicon__full_stop" format="reference" type="raw">@raw/qwerty__keyicon__full_stop</item>
+ <item name="optional__qwerty__keyicon__grave_accent" format="reference" type="raw">@raw/qwerty__keyicon__grave_accent</item>
+ <item name="optional__qwerty__keyicon__greater_than_sign" format="reference" type="raw">@raw/qwerty__keyicon__greater_than_sign</item>
+ <item name="optional__qwerty__keyicon__hyphen_minus" format="reference" type="raw">@raw/qwerty__keyicon__hyphen_minus</item>
+ <item name="optional__qwerty__keyicon__ideographic_comma" format="reference" type="raw">@raw/qwerty__keyicon__ideographic_comma</item>
+ <item name="optional__qwerty__keyicon__ideographic_full_stop" format="reference" type="raw">@raw/qwerty__keyicon__ideographic_full_stop</item>
+ <item name="optional__qwerty__keyicon__latin_capital_letter_a" format="reference" type="raw">@raw/qwerty__keyicon__latin_capital_letter_a</item>
+ <item name="optional__qwerty__keyicon__latin_capital_letter_b" format="reference" type="raw">@raw/qwerty__keyicon__latin_capital_letter_b</item>
+ <item name="optional__qwerty__keyicon__latin_capital_letter_c" format="reference" type="raw">@raw/qwerty__keyicon__latin_capital_letter_c</item>
+ <item name="optional__qwerty__keyicon__latin_capital_letter_d" format="reference" type="raw">@raw/qwerty__keyicon__latin_capital_letter_d</item>
+ <item name="optional__qwerty__keyicon__latin_capital_letter_f" format="reference" type="raw">@raw/qwerty__keyicon__latin_capital_letter_f</item>
+ <item name="optional__qwerty__keyicon__latin_capital_letter_g" format="reference" type="raw">@raw/qwerty__keyicon__latin_capital_letter_g</item>
+ <item name="optional__qwerty__keyicon__latin_capital_letter_h" format="reference" type="raw">@raw/qwerty__keyicon__latin_capital_letter_h</item>
+ <item name="optional__qwerty__keyicon__latin_capital_letter_j" format="reference" type="raw">@raw/qwerty__keyicon__latin_capital_letter_j</item>
+ <item name="optional__qwerty__keyicon__latin_capital_letter_k" format="reference" type="raw">@raw/qwerty__keyicon__latin_capital_letter_k</item>
+ <item name="optional__qwerty__keyicon__latin_capital_letter_l" format="reference" type="raw">@raw/qwerty__keyicon__latin_capital_letter_l</item>
+ <item name="optional__qwerty__keyicon__latin_capital_letter_m" format="reference" type="raw">@raw/qwerty__keyicon__latin_capital_letter_m</item>
+ <item name="optional__qwerty__keyicon__latin_capital_letter_n" format="reference" type="raw">@raw/qwerty__keyicon__latin_capital_letter_n</item>
+ <item name="optional__qwerty__keyicon__latin_capital_letter_s" format="reference" type="raw">@raw/qwerty__keyicon__latin_capital_letter_s</item>
+ <item name="optional__qwerty__keyicon__latin_capital_letter_v" format="reference" type="raw">@raw/qwerty__keyicon__latin_capital_letter_v</item>
+ <item name="optional__qwerty__keyicon__latin_capital_letter_x" format="reference" type="raw">@raw/qwerty__keyicon__latin_capital_letter_x</item>
+ <item name="optional__qwerty__keyicon__latin_capital_letter_z" format="reference" type="raw">@raw/qwerty__keyicon__latin_capital_letter_z</item>
+ <item name="optional__qwerty__keyicon__latin_small_letter_a" format="reference" type="raw">@raw/qwerty__keyicon__latin_small_letter_a</item>
+ <item name="optional__qwerty__keyicon__latin_small_letter_b" format="reference" type="raw">@raw/qwerty__keyicon__latin_small_letter_b</item>
+ <item name="optional__qwerty__keyicon__latin_small_letter_c" format="reference" type="raw">@raw/qwerty__keyicon__latin_small_letter_c</item>
+ <item name="optional__qwerty__keyicon__latin_small_letter_d" format="reference" type="raw">@raw/qwerty__keyicon__latin_small_letter_d</item>
+ <item name="optional__qwerty__keyicon__latin_small_letter_f" format="reference" type="raw">@raw/qwerty__keyicon__latin_small_letter_f</item>
+ <item name="optional__qwerty__keyicon__latin_small_letter_g" format="reference" type="raw">@raw/qwerty__keyicon__latin_small_letter_g</item>
+ <item name="optional__qwerty__keyicon__latin_small_letter_h" format="reference" type="raw">@raw/qwerty__keyicon__latin_small_letter_h</item>
+ <item name="optional__qwerty__keyicon__latin_small_letter_j" format="reference" type="raw">@raw/qwerty__keyicon__latin_small_letter_j</item>
+ <item name="optional__qwerty__keyicon__latin_small_letter_k" format="reference" type="raw">@raw/qwerty__keyicon__latin_small_letter_k</item>
+ <item name="optional__qwerty__keyicon__latin_small_letter_l" format="reference" type="raw">@raw/qwerty__keyicon__latin_small_letter_l</item>
+ <item name="optional__qwerty__keyicon__latin_small_letter_m" format="reference" type="raw">@raw/qwerty__keyicon__latin_small_letter_m</item>
+ <item name="optional__qwerty__keyicon__latin_small_letter_n" format="reference" type="raw">@raw/qwerty__keyicon__latin_small_letter_n</item>
+ <item name="optional__qwerty__keyicon__latin_small_letter_s" format="reference" type="raw">@raw/qwerty__keyicon__latin_small_letter_s</item>
+ <item name="optional__qwerty__keyicon__latin_small_letter_v" format="reference" type="raw">@raw/qwerty__keyicon__latin_small_letter_v</item>
+ <item name="optional__qwerty__keyicon__latin_small_letter_x" format="reference" type="raw">@raw/qwerty__keyicon__latin_small_letter_x</item>
+ <item name="optional__qwerty__keyicon__latin_small_letter_z" format="reference" type="raw">@raw/qwerty__keyicon__latin_small_letter_z</item>
+ <item name="optional__qwerty__keyicon__left_curly_bracket" format="reference" type="raw">@raw/qwerty__keyicon__left_curly_bracket</item>
+ <item name="optional__qwerty__keyicon__left_parenthesis" format="reference" type="raw">@raw/qwerty__keyicon__left_parenthesis</item>
+ <item name="optional__qwerty__keyicon__left_square_bracket" format="reference" type="raw">@raw/qwerty__keyicon__left_square_bracket</item>
+ <item name="optional__qwerty__keyicon__less_than_sign" format="reference" type="raw">@raw/qwerty__keyicon__less_than_sign</item>
+ <item name="optional__qwerty__keyicon__low_line" format="reference" type="raw">@raw/qwerty__keyicon__low_line</item>
+ <item name="optional__qwerty__keyicon__minus_sign" format="reference" type="raw">@raw/qwerty__keyicon__minus_sign</item>
+ <item name="optional__qwerty__keyicon__number_sign" format="reference" type="raw">@raw/qwerty__keyicon__number_sign</item>
+ <item name="optional__qwerty__keyicon__percent_sign" format="reference" type="raw">@raw/qwerty__keyicon__percent_sign</item>
+ <item name="optional__qwerty__keyicon__plus_sign" format="reference" type="raw">@raw/qwerty__keyicon__plus_sign</item>
+ <item name="optional__qwerty__keyicon__question_mark" format="reference" type="raw">@raw/qwerty__keyicon__question_mark</item>
+ <item name="optional__qwerty__keyicon__quotation_mark" format="reference" type="raw">@raw/qwerty__keyicon__quotation_mark</item>
+ <item name="optional__qwerty__keyicon__reverse_solidus" format="reference" type="raw">@raw/qwerty__keyicon__reverse_solidus</item>
+ <item name="optional__qwerty__keyicon__right_curly_bracket" format="reference" type="raw">@raw/qwerty__keyicon__right_curly_bracket</item>
+ <item name="optional__qwerty__keyicon__right_parenthesis" format="reference" type="raw">@raw/qwerty__keyicon__right_parenthesis</item>
+ <item name="optional__qwerty__keyicon__right_square_bracket" format="reference" type="raw">@raw/qwerty__keyicon__right_square_bracket</item>
+ <item name="optional__qwerty__keyicon__semicolon" format="reference" type="raw">@raw/qwerty__keyicon__semicolon</item>
+ <item name="optional__qwerty__keyicon__solidus" format="reference" type="raw">@raw/qwerty__keyicon__solidus</item>
+ <item name="optional__qwerty__keyicon__tilde" format="reference" type="raw">@raw/qwerty__keyicon__tilde</item>
+ <item name="optional__qwerty__keyicon__vertical_line" format="reference" type="raw">@raw/qwerty__keyicon__vertical_line</item>
+ <item name="optional__qwerty__popup__latin_capital_letter_e" format="reference" type="raw">@raw/qwerty__popup__latin_capital_letter_e</item>
+ <item name="optional__qwerty__popup__latin_capital_letter_i" format="reference" type="raw">@raw/qwerty__popup__latin_capital_letter_i</item>
+ <item name="optional__qwerty__popup__latin_capital_letter_o" format="reference" type="raw">@raw/qwerty__popup__latin_capital_letter_o</item>
+ <item name="optional__qwerty__popup__latin_capital_letter_p" format="reference" type="raw">@raw/qwerty__popup__latin_capital_letter_p</item>
+ <item name="optional__qwerty__popup__latin_capital_letter_q" format="reference" type="raw">@raw/qwerty__popup__latin_capital_letter_q</item>
+ <item name="optional__qwerty__popup__latin_capital_letter_r" format="reference" type="raw">@raw/qwerty__popup__latin_capital_letter_r</item>
+ <item name="optional__qwerty__popup__latin_capital_letter_t" format="reference" type="raw">@raw/qwerty__popup__latin_capital_letter_t</item>
+ <item name="optional__qwerty__popup__latin_capital_letter_u" format="reference" type="raw">@raw/qwerty__popup__latin_capital_letter_u</item>
+ <item name="optional__qwerty__popup__latin_capital_letter_w" format="reference" type="raw">@raw/qwerty__popup__latin_capital_letter_w</item>
+ <item name="optional__qwerty__popup__latin_capital_letter_y" format="reference" type="raw">@raw/qwerty__popup__latin_capital_letter_y</item>
+ <item name="optional__qwerty__popup__latin_small_letter_e" format="reference" type="raw">@raw/qwerty__popup__latin_small_letter_e</item>
+ <item name="optional__qwerty__popup__latin_small_letter_i" format="reference" type="raw">@raw/qwerty__popup__latin_small_letter_i</item>
+ <item name="optional__qwerty__popup__latin_small_letter_o" format="reference" type="raw">@raw/qwerty__popup__latin_small_letter_o</item>
+ <item name="optional__qwerty__popup__latin_small_letter_p" format="reference" type="raw">@raw/qwerty__popup__latin_small_letter_p</item>
+ <item name="optional__qwerty__popup__latin_small_letter_q" format="reference" type="raw">@raw/qwerty__popup__latin_small_letter_q</item>
+ <item name="optional__qwerty__popup__latin_small_letter_r" format="reference" type="raw">@raw/qwerty__popup__latin_small_letter_r</item>
+ <item name="optional__qwerty__popup__latin_small_letter_t" format="reference" type="raw">@raw/qwerty__popup__latin_small_letter_t</item>
+ <item name="optional__qwerty__popup__latin_small_letter_u" format="reference" type="raw">@raw/qwerty__popup__latin_small_letter_u</item>
+ <item name="optional__qwerty__popup__latin_small_letter_w" format="reference" type="raw">@raw/qwerty__popup__latin_small_letter_w</item>
+ <item name="optional__qwerty__popup__latin_small_letter_y" format="reference" type="raw">@raw/qwerty__popup__latin_small_letter_y</item>
+ <item name="optional__twelvekeys__popup__zero" format="reference" type="raw">@raw/twelvekeys__popup__zero</item>
+ <item name="optional__twelvekeys__popup__one" format="reference" type="raw">@raw/twelvekeys__popup__one</item>
+ <item name="optional__twelvekeys__popup__two" format="reference" type="raw">@raw/twelvekeys__popup__two</item>
+ <item name="optional__twelvekeys__popup__three" format="reference" type="raw">@raw/twelvekeys__popup__three</item>
+ <item name="optional__twelvekeys__popup__four" format="reference" type="raw">@raw/twelvekeys__popup__four</item>
+ <item name="optional__twelvekeys__popup__five" format="reference" type="raw">@raw/twelvekeys__popup__five</item>
+ <item name="optional__twelvekeys__popup__six" format="reference" type="raw">@raw/twelvekeys__popup__six</item>
+ <item name="optional__twelvekeys__popup__seven" format="reference" type="raw">@raw/twelvekeys__popup__seven</item>
+ <item name="optional__twelvekeys__popup__eight" format="reference" type="raw">@raw/twelvekeys__popup__eight</item>
+ <item name="optional__twelvekeys__popup__nine" format="reference" type="raw">@raw/twelvekeys__popup__nine</item>
+ <item name="optional__twelvekeys__popup__asterisk" format="reference" type="raw">@raw/twelvekeys__popup__asterisk</item>
+ <item name="optional__twelvekeys__popup__number_sign" format="reference" type="raw">@raw/twelvekeys__popup__number_sign</item>
+ <item name="optional__twelvekeys__popup__plus_sign" format="reference" type="raw">@raw/twelvekeys__popup__plus_sign</item>
+ <item name="optional__twelvekeys__popup__hyphen_minus" format="reference" type="raw">@raw/twelvekeys__popup__hyphen_minus</item>
+ <item name="optional__twelvekeys__popup__comma" format="reference" type="raw">@raw/twelvekeys__popup__comma</item>
+ <item name="optional__twelvekeys__popup__full_stop" format="reference" type="raw">@raw/twelvekeys__popup__full_stop</item>
+ <item name="optional__twelvekeys__popup__solidus" format="reference" type="raw">@raw/twelvekeys__popup__solidus</item>
+ <item name="optional__twelvekeys__popup__equals_sign" format="reference" type="raw">@raw/twelvekeys__popup__equals_sign</item>
+
+</resources>
diff --git a/src/android/static_resources/resources_oss/res/values/strings.xml b/src/android/static_resources/resources_oss/res/values/strings.xml
index 2118b23..b616c72 100644
--- a/src/android/static_resources/resources_oss/res/values/strings.xml
+++ b/src/android/static_resources/resources_oss/res/values/strings.xml
@@ -29,346 +29,289 @@
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-->
+<!-- The next number of translation_description is (237). -->
<resources>
- <string name="subtype_ja">Japanese</string>
+ <string name="subtype_ja" translation_description="(0) in http://goo.gl/jLDD7P">Japanese</string>
+
+ <!-- Preference keys -->
+ <string name="pref_skin_type_key" translation_description="(1) in http://goo.gl/jLDD7P">pref_skin_type_key</string>
<!-- Preference titles -->
- <string name="pref_software_keyboard_category_title">Software keyboard</string>
- <string name="pref_software_keyboard_advanced_settings_title">Software keyboard advanced settings</string>
+ <string name="pref_software_keyboard_category_title" translation_description="(2) in http://goo.gl/jLDD7P">Software keyboard</string>
+ <string name="pref_software_keyboard_advanced_settings_title" translation_description="(3) in http://goo.gl/jLDD7P">Software keyboard advanced settings</string>
- <string name="pref_software_keyboard_preferences_portrait_title">Software keyboard preferences for portrait mode</string>
- <string name="pref_software_keyboard_preferences_landscape_title">Software keyboard preferences for landscape mode</string>
+ <!-- Fragment preference titles -->
+ <string name="pref_fragment_software_keyboard_title" translation_description="(230) in http://goo.gl/jLDD7P">Software keyboard</string>
+ <string name="pref_fragment_input_support_title" translation_description="(231) in http://goo.gl/jLDD7P">Input support</string>
+ <string name="pref_fragment_conversion_title" translation_description="(232) in http://goo.gl/jLDD7P">Conversion</string>
+ <string name="pref_fragment_dictionary_title" translation_description="(233) in http://goo.gl/jLDD7P">Dictionary</string>
+ <string name="pref_fragment_user_feedback_title" translation_description="(234) in http://goo.gl/jLDD7P">User feedback</string>
+ <string name="pref_fragment_about_title" translation_description="(235) in http://goo.gl/jLDD7P">About</string>
+ <string name="pref_fragment_development_title" translation_description="(236) in http://goo.gl/jLDD7P">Development</string>
+
+ <string name="pref_software_keyboard_preferences_portrait_title" translation_description="(4) in http://goo.gl/jLDD7P">Software keyboard preferences for portrait mode</string>
+ <string name="pref_software_keyboard_preferences_landscape_title" translation_description="(5) in http://goo.gl/jLDD7P">Software keyboard preferences for landscape mode</string>
<!-- Following entries are for configuration_dependent_preferences -->
- <string name="pref_keyboard_layout_title">Keyboard layout</string>
- <string name="pref_input_style_title">Input style</string>
- <string name="pref_qwerty_layout_for_alphabet_title">QWERTY mode</string>
- <string name="pref_flick_sensitivity_title">Flick sensitivity</string>
- <string name="pref_use_portrait_keyboard_settings_for_landscape_title">Use portrait settings</string>
- <string name="pref_keyboard_height_ratio_title">Keyboard height</string>
- <string name="pref_input_feedback_category_title">Input feedback preferences</string>
- <string name="pref_haptic_feedback_title">Haptic feedback</string>
- <string name="pref_haptic_feedback_duration_title">Haptic feedback duration</string>
- <string name="pref_sound_feedback_title">Audio feedback</string>
- <string name="pref_sound_feedback_volume_title">Audio feedback volume</string>
- <string name="pref_popup_feedback_title">Popup feedback</string>
- <string name="pref_other_input_support_preference_category_title">Other input support preferences</string>
- <string name="pref_fullscreen_title">Fullscreen mode</string>
- <string name="pref_skin_type_title">Select Skin type</string>
- <string name="pref_hardware_title">Preferences for hardware keyboards</string>
- <string name="pref_conversion_category_title">Conversion preferences</string>
- <string name="pref_layout_adjustment_title">Layout adjustment</string>
- <string name="pref_space_character_form_title">Use half-width space</string>
- <string name="pref_kana_modifier_insensitive_conversion_title">Modifier insensitive conversion</string>
- <string name="pref_typing_correction_title">Typing correction</string>
- <string name="pref_other_incognito_mode_title">Incognito mode</string>
- <string name="pref_emoji_provider_type_title">Select Emoji provider</string>
- <string name="pref_dictionry_category_title">Dictionary preferences</string>
- <string name="pref_dictionary_personalization_title">Personalization</string>
- <string name="pref_dictionary_user_dictionary_tool_title">Dictionary Tool</string>
- <string name="pref_clear_category_title">Clear history</string>
- <string name="pref_clear_conversion_history_title">Conversion history</string>
- <string name="pref_clear_symbol_history_title">Symbol history</string>
- <string name="pref_clear_user_dictionary_title">User dictionary</string>
- <string name="pref_user_feedback_category_title">User feedback</string>
- <string name="pref_other_usage_stats_title">Send usage statistics</string>
- <string name="pref_about_about_this_software_title">About this software</string>
- <string name="pref_about_version_title">Version</string>
- <string name="pref_about_terms_of_service_title">Terms of service</string>
- <string name="pref_about_privacy_policy_title">Privacy policy</string>
- <string name="pref_about_oss_credits_title">Open source software</string>
-
+ <string name="pref_keyboard_layout_title" translation_description="Title label in the settings">Keyboard layout</string>
+ <string name="pref_input_style_title" translation_description="Item label in the settings">Input style</string>
+ <string name="pref_qwerty_layout_for_alphabet_title" translation_description="Title label of pref_qwerty_layout_for_alphabet_description in the settings">QWERTY mode</string>
+ <string name="pref_flick_sensitivity_title" translation_description="(9) in http://goo.gl/jLDD7P">Flick sensitivity</string>
+ <string name="pref_use_portrait_keyboard_settings_for_landscape_title" translation_description="(10) in http://goo.gl/jLDD7P">Use portrait settings</string>
+ <string name="pref_keyboard_height_ratio_title" translation_description="(11) in http://goo.gl/jLDD7P">Keyboard height</string>
+ <string name="pref_input_feedback_category_title" translation_description="(12) in http://goo.gl/jLDD7P">Input feedback preferences</string>
+ <string name="pref_haptic_feedback_title" translation_description="(13) in http://goo.gl/jLDD7P">Haptic feedback</string>
+ <string name="pref_haptic_feedback_duration_title" translation_description="(14) in http://goo.gl/jLDD7P">Haptic feedback duration</string>
+ <string name="pref_sound_feedback_title" translation_description="(15) in http://goo.gl/jLDD7P">Audio feedback</string>
+ <string name="pref_sound_feedback_volume_title" translation_description="(16) in http://goo.gl/jLDD7P">Audio feedback volume</string>
+ <string name="pref_popup_feedback_title" translation_description="(17) in http://goo.gl/jLDD7P">Popup feedback</string>
+ <string name="pref_other_input_support_preference_category_title" translation_description="(18) in http://goo.gl/jLDD7P">Other input support preferences</string>
+ <string name="pref_fullscreen_title" translation_description="(19) in http://goo.gl/jLDD7P">Fullscreen mode</string>
+ <string name="pref_skin_type_title" translation_description="(20) in http://goo.gl/jLDD7P">Keyboard theme</string>
+ <string name="pref_hardware_title" translation_description="(21) in http://goo.gl/jLDD7P">Preferences for hardware keyboards</string>
+ <string name="pref_voice_input_title" translation_description="(228) in http://goo.gl/jLDD7P">Show voice input button</string>
+ <string name="pref_conversion_category_title" translation_description="(22) in http://goo.gl/jLDD7P">Conversion preferences</string>
+ <string name="pref_layout_adjustment_title" translation_description="(23) in http://goo.gl/jLDD7P">Layout adjustment</string>
+ <string name="pref_space_character_form_title" translation_description="(24) in http://goo.gl/jLDD7P">Use half-width space</string>
+ <string name="pref_kana_modifier_insensitive_conversion_title" translation_description="(25) in http://goo.gl/jLDD7P">Modifier insensitive conversion</string>
+ <string name="pref_typing_correction_title" translation_description="(26) in http://goo.gl/jLDD7P">Typing correction</string>
+ <string name="pref_other_incognito_mode_title" translation_description="(27) in http://goo.gl/jLDD7P">Incognito mode</string>
+ <string name="pref_emoji_provider_type_title" translation_description="(28) in http://goo.gl/jLDD7P">Select Emoji provider</string>
+ <string name="pref_dictionry_category_title" translation_description="(29) in http://goo.gl/jLDD7P">Dictionary preferences</string>
+ <string name="pref_dictionary_personalization_title" translation_description="(30) in http://goo.gl/jLDD7P">Personalization</string>
+ <string name="pref_dictionary_user_dictionary_tool_title" translation_description="(31) in http://goo.gl/jLDD7P">Dictionary Tool</string>
+ <string name="pref_clear_category_title" translation_description="(32) in http://goo.gl/jLDD7P">Clear history</string>
+ <string name="pref_clear_conversion_history_title" translation_description="(33) in http://goo.gl/jLDD7P">Conversion history</string>
+ <string name="pref_clear_symbol_history_title" translation_description="(34) in http://goo.gl/jLDD7P">Symbol history</string>
+ <string name="pref_clear_user_dictionary_title" translation_description="(35) in http://goo.gl/jLDD7P">User dictionary</string>
+ <string name="pref_user_feedback_category_title" translation_description="(36) in http://goo.gl/jLDD7P">User feedback</string>
+ <string name="pref_other_usage_stats_title" translation_description="(37) in http://goo.gl/jLDD7P">Send usage statistics</string>
+ <string name="pref_about_about_this_software_title" translation_description="(38) in http://goo.gl/jLDD7P">About this software</string>
+ <string name="pref_about_version_title" translation_description="(39) in http://goo.gl/jLDD7P">Version</string>
+ <string name="pref_about_terms_of_service_title" translation_description="(40) in http://goo.gl/jLDD7P">Terms of service</string>
+ <string name="pref_about_privacy_policy_title" translation_description="(41) in http://goo.gl/jLDD7P">Privacy policy</string>
+ <string name="pref_about_oss_credits_title" translation_description="(42) in http://goo.gl/jLDD7P">Open source software</string>
+ <string name="pref_launcher_icon_visibility_title" translation_description="(43) in http://goo.gl/jLDD7P">Show app icon</string>
<!-- Preference description -->
<!-- Configuration Dependent Preferences -->
<!-- Following entries are for configuration_dependent_preferences -->
- <string name="pref_haptic_feedback_description">Vibrate on key press.</string>
- <string name="pref_sound_feedback_description">Sound on key press.</string>
- <string name="pref_popup_feedback_description">Popup on key press.</string>
- <string name="pref_keyboard_layout_description">Switch keyboard layout.</string>
- <string name="pref_keyboard_layout_title_12keys">12 keys</string>
- <string name="pref_keyboard_layout_title_qwerty">QWERTY</string>
- <string name="pref_keyboard_layout_title_godan">Godan Keyboard</string>
- <string name="pref_keyboard_layout_description_12keys">Mobile phone layout.</string>
- <string name="pref_keyboard_layout_description_qwerty">PC keyboard layout.</string>
- <string name="pref_keyboard_layout_description_godan">Romaji-dedicated layout. <![CDATA[<a href=\'http://support.google.com/ime/japanese/bin/answer.py?hl=ja&topic=25606&answer=2700298\'>Usage</a>]]></string>
- <string name="pref_input_style_setting_description">Select input style.</string>
- <string name="pref_qwerty_layout_for_alphabet_description">If checked, QWERTY layout will be used for alphabet input mode regardless of main layout.</string>
- <string name="pref_fullscreen_description">If checked, target textbox shows in fullscreen mode.</string>
- <string name="pref_flick_sensitivity_description">Tune the flick sensitivity.</string>
- <string name="pref_layout_adjustment_description">Switch keyboard adjustment.</string>
- <string name="pref_keyboard_height_ratio_description">Change the keyboard height.</string>
- <string name="pref_space_character_form_description">Always use half-width space, no matter the input mode.</string>
- <string name="pref_kana_modifier_insensitive_conversion_description">Use kana modifier insensitive conversion. Applied to 12 keys and Godan keyboard. e.g. かつこう→学校</string>
- <string name="pref_typing_correction_description">Detect mistyping and show corrected candidates. e.g. すんかい→深海</string>
- <string name="pref_emoji_provider_type_description">Select the Emoji provider properly to use emoji.</string>
- <string name="pref_skin_type_description">Select the skin type to customize the software keyboard look.</string>
+ <string name="pref_haptic_feedback_description" translation_description="(44) in http://goo.gl/jLDD7P">Vibrate on key press.</string>
+ <string name="pref_sound_feedback_description" translation_description="(45) in http://goo.gl/jLDD7P">Sound on key press.</string>
+ <string name="pref_popup_feedback_description" translation_description="(46) in http://goo.gl/jLDD7P">Popup on key press.</string>
+ <string name="pref_keyboard_layout_description" translation_description="(47) in http://goo.gl/jLDD7P">Switch keyboard layout.</string>
+ <string name="pref_keyboard_layout_title_12keys" translation_description="(48) in http://goo.gl/jLDD7P">12 keys</string>
+ <string name="pref_keyboard_layout_title_qwerty" translation_description="(49) in http://goo.gl/jLDD7P">QWERTY</string>
+ <string name="pref_keyboard_layout_title_godan" translation_description="(50) in http://goo.gl/jLDD7P">Godan Keyboard</string>
+ <string name="pref_keyboard_layout_description_12keys" translation_description="(51) in http://goo.gl/jLDD7P">Mobile phone layout.</string>
+ <string name="pref_keyboard_layout_description_qwerty" translation_description="(52) in http://goo.gl/jLDD7P">PC keyboard layout.</string>
+ <string name="pref_keyboard_layout_description_godan" translation_description="(53) in http://goo.gl/jLDD7P">Romaji-dedicated layout. <![CDATA[<a href=\'http://support.google.com/ime/japanese/bin/answer.py?hl=ja&topic=25606&answer=2700298\'>Usage</a>]]></string>
+ <string name="pref_input_style_setting_description" translation_description="(54) in http://goo.gl/jLDD7P">Select input style.</string>
+ <string name="pref_qwerty_layout_for_alphabet_description" translation_description="(55) in http://goo.gl/jLDD7P">If checked, QWERTY layout will be used for alphabet input mode regardless of main layout.</string>
+ <string name="pref_fullscreen_description" translation_description="(56) in http://goo.gl/jLDD7P">If checked, target textbox shows in fullscreen mode.</string>
+ <string name="pref_flick_sensitivity_description" translation_description="(57) in http://goo.gl/jLDD7P">Tune the flick sensitivity.</string>
+ <string name="pref_layout_adjustment_description" translation_description="(58) in http://goo.gl/jLDD7P">Switch keyboard adjustment.</string>
+ <string name="pref_keyboard_height_ratio_description" translation_description="(59) in http://goo.gl/jLDD7P">Change the keyboard height.</string>
+ <string name="pref_space_character_form_description" translation_description="(60) in http://goo.gl/jLDD7P">Always use half-width space, no matter the input mode.</string>
+ <string name="pref_kana_modifier_insensitive_conversion_description" translation_description="(61) in http://goo.gl/jLDD7P">Use kana modifier insensitive conversion. Applied to 12 keys and Godan keyboard. e.g. かつこう→学校</string>
+ <string name="pref_typing_correction_description" translation_description="(62) in http://goo.gl/jLDD7P">Detect mistyping and show corrected candidates. e.g. すんかい→深海</string>
+ <string name="pref_emoji_provider_type_description" translation_description="(63) in http://goo.gl/jLDD7P">Select the Emoji provider properly to use emoji.</string>
+ <string name="pref_skin_type_description" translation_description="(64) in http://goo.gl/jLDD7P">Select the keyboard theme to customize the software keyboard look.</string>
+ <string name="pref_voice_input_description" translation_description="(229) in http://goo.gl/jLDD7P">Show voice input button on the software keyboard.</string>
<!-- Hardware Keyboard -->
- <string name="pref_hardware_keymap_description">Select key mapping for hardware keyboards.</string>
+ <string name="pref_hardware_keymap_description" translation_description="(65) in http://goo.gl/jLDD7P">Select key mapping for hardware keyboards.</string>
<!-- Dictionary -->
- <string name="pref_dictionary_personalization_description">Enable personal suggestions based on past input.</string>
- <string name="pref_dictionary_user_dictionary_tool_description">Edit user dictionaries.</string>
- <string name="pref_clear_category_description">Clear personalization or suggestion data.</string>
- <string name="pref_clear_conversion_history_description">Clear conversion history.</string>
- <string name="pref_clear_symbol_history_description">Clear symbol input history.</string>
- <string name="pref_clear_user_dictionary_description">Clear user dictionary.</string>
+ <string name="pref_dictionary_personalization_description" translation_description="(66) in http://goo.gl/jLDD7P">Enable personal suggestions based on past input.</string>
+ <string name="pref_dictionary_user_dictionary_tool_description" translation_description="(67) in http://goo.gl/jLDD7P">Edit user dictionaries.</string>
+ <string name="pref_clear_category_description" translation_description="(68) in http://goo.gl/jLDD7P">Clear personalization or suggestion data.</string>
+ <string name="pref_clear_conversion_history_description" translation_description="(69) in http://goo.gl/jLDD7P">Clear conversion history.</string>
+ <string name="pref_clear_symbol_history_description" translation_description="(70) in http://goo.gl/jLDD7P">Clear symbol input history.</string>
+ <string name="pref_clear_user_dictionary_description" translation_description="(71) in http://goo.gl/jLDD7P">Clear user dictionary.</string>
<!-- Other -->
- <string name="pref_other_incognito_mode_description">Temporarily disable personalization, suggestions and user dictionary.</string>
+ <string name="pref_other_incognito_mode_description" translation_description="(72) in http://goo.gl/jLDD7P">Temporarily disable personalization, suggestions and user dictionary.</string>
<!-- TODO(matsuzakit): Needs an expert's check => need to check with legal -->
- <string name="pref_other_usage_stats_description">Send usage statistics to %1$s. These will only be used to improve %1$s products and services.</string>
+ <string name="pref_other_usage_stats_description" translation_description="(73) in http://goo.gl/jLDD7P">Send usage statistics to %1$s. These will only be used to improve %1$s products and services.</string>
<!-- About -->
- <string name="pref_about_terms_of_service_description">Display the terms of service (webpage).</string>
- <string name="pref_about_privacy_policy_description">Display the privacy policy (webpage).</string>
- <string name="pref_about_oss_credits_description">This software uses open source software: view the licenses.</string>
+ <string name="pref_about_terms_of_service_description" translation_description="(74) in http://goo.gl/jLDD7P">Display the terms of service (webpage).</string>
+ <string name="pref_about_privacy_policy_description" translation_description="(75) in http://goo.gl/jLDD7P">Display the privacy policy (webpage).</string>
+ <string name="pref_about_oss_credits_description" translation_description="(76) in http://goo.gl/jLDD7P">This software uses open source software: view the licenses.</string>
+ <string name="pref_launcher_icon_visibility_description" translation_description="(77) in http://goo.gl/jLDD7P">Display application icon in the launcher</string>
<!-- Preference Values -->
- <string name="pref_input_style_setting_entry_toggle">Toggle</string>
- <string name="pref_input_style_setting_entry_flick">Flick</string>
- <string name="pref_input_style_setting_entry_toggle_and_flick">Toggle & Flick</string>
+ <string name="pref_input_style_setting_entry_toggle" translation_description="(78) in http://goo.gl/jLDD7P">Toggle</string>
+ <string name="pref_input_style_setting_entry_flick" translation_description="(79) in http://goo.gl/jLDD7P">Flick</string>
+ <string name="pref_input_style_setting_entry_toggle_and_flick" translation_description="(80) in http://goo.gl/jLDD7P">Toggle & Flick</string>
- <string name="pref_fullscreen_portrait">Enable on portrait</string>
- <string name="pref_fullscreen_landscape">Enable on landscape</string>
+ <string name="pref_fullscreen_portrait" translation_description="(81) in http://goo.gl/jLDD7P">Enable on portrait</string>
+ <string name="pref_fullscreen_landscape" translation_description="(82) in http://goo.gl/jLDD7P">Enable on landscape</string>
- <string name="pref_emoji_provider_type_unicode">Disable carrier Emoji</string>
- <string name="pref_emoji_provider_type_docomo">NTT docomo</string>
- <string name="pref_emoji_provider_type_kddi">KDDI (au)</string>
- <string name="pref_emoji_provider_type_softbank">SoftBank</string>
+ <string name="pref_emoji_provider_type_unicode" translation_description="(83) in http://goo.gl/jLDD7P">Disable carrier Emoji</string>
+ <string name="pref_emoji_provider_type_docomo" translation_description="(84) in http://goo.gl/jLDD7P">NTT docomo</string>
+ <string name="pref_emoji_provider_type_kddi" translation_description="(85) in http://goo.gl/jLDD7P">KDDI (au)</string>
+ <string name="pref_emoji_provider_type_softbank" translation_description="(86) in http://goo.gl/jLDD7P">SoftBank</string>
- <string name="pref_skin_type_orange_lightgray">Orange/Light-gray</string>
- <string name="pref_skin_type_blue_lightgray">Blue/Light-gray</string>
- <string name="pref_skin_type_blue_darkgray">Blue/Dark-gray</string>
+ <string name="pref_skin_type_orange_lightgray" translation_description="(87) in http://goo.gl/jLDD7P">Orange/Light-gray</string>
+ <string name="pref_skin_type_blue_lightgray" translation_description="(88) in http://goo.gl/jLDD7P">Blue/Light-gray</string>
+ <string name="pref_skin_type_blue_darkgray" translation_description="(89) in http://goo.gl/jLDD7P">Blue/Dark-gray</string>
+ <string name="pref_skin_type_material_design_light" translation_description="(90) in http://goo.gl/jLDD7P">Material Design (Light)</string>
+ <string name="pref_skin_type_material_design_dark" translation_description="(91) in http://goo.gl/jLDD7P">Material Design (Dark)</string>
- <string name="pref_hardware_keymap_default">System Default</string>
- <string name="pref_hardware_keymap_japanese109A">Japanese 109A</string>
- <string name="pref_hardware_keymap_twelvekey">12 keys</string>
+ <string name="pref_hardware_keymap_default" translation_description="(92) in http://goo.gl/jLDD7P">System Default</string>
+ <string name="pref_hardware_keymap_japanese109A" translation_description="(93) in http://goo.gl/jLDD7P">Japanese 109A</string>
+ <string name="pref_hardware_keymap_twelvekey" translation_description="(94) in http://goo.gl/jLDD7P">12 keys</string>
- <string name="pref_dictionary_personalization_entry_enabled">Enable</string>
- <string name="pref_dictionary_personalization_entry_readonly">Frozen</string>
- <string name="pref_dictionary_personalization_entry_disabled">Disable</string>
+ <string name="pref_dictionary_personalization_entry_enabled" translation_description="(95) in http://goo.gl/jLDD7P">Enable</string>
+ <string name="pref_dictionary_personalization_entry_readonly" translation_description="(96) in http://goo.gl/jLDD7P">Frozen</string>
+ <string name="pref_dictionary_personalization_entry_disabled" translation_description="(97) in http://goo.gl/jLDD7P">Disable</string>
- <!-- Preference url -->
- <string name="pref_oss_credits_url">file:///android_asset/credits_en.html</string>
-
- <string name="pref_layout_adjustment_entry_fill">Fill</string>
- <string name="pref_layout_adjustment_entry_right">Right</string>
- <string name="pref_layout_adjustment_entry_left">Left</string>
+ <string name="pref_layout_adjustment_entry_fill" translation_description="(99) in http://goo.gl/jLDD7P">Fill</string>
+ <string name="pref_layout_adjustment_entry_right" translation_description="(100) in http://goo.gl/jLDD7P">Right</string>
+ <string name="pref_layout_adjustment_entry_left" translation_description="(101) in http://goo.gl/jLDD7P">Left</string>
<!-- First time launch activity -->
- <string name="firsttime_close_button">Next >></string>
+ <string name="firsttime_close_button" translation_description="(102) in http://goo.gl/jLDD7P">Next >></string>
<!-- TODO(matsuzakit): Needs an expert's check -->
- <string name="firsttime_description_thank_you">Thank you for using %s.</string>
- <string name="firsttime_description_usage_stats"><![CDATA[In order for us to improve %s products and services, we kindly ask you to consider enabling usage statistics.\n\nThis setting can be changed from the preferences screen.]]></string>
- <string name="firsttime_send_usage_stats_devchannel">Usage statistics are enabled because you are using a development version.</string>
+ <string name="firsttime_description_thank_you" translation_description="(103) in http://goo.gl/jLDD7P">Thank you for using %s.</string>
+ <string name="firsttime_description_usage_stats" translation_description="(104) in http://goo.gl/jLDD7P"><![CDATA[In order for us to improve %s products and services, we kindly ask you to consider enabling usage statistics.\n\nThis setting can be changed from the preferences screen.]]></string>
+ <string name="firsttime_send_usage_stats_devchannel" translation_description="(105) in http://goo.gl/jLDD7P">Usage statistics are enabled because you are using a development version.</string>
<!-- Alert messages -->
- <string name="pref_ime_enable_alert_title">Setup for text settings</string>
- <string name="pref_ime_enable_alert_message">Please enable %s.</string>
- <string name="pref_ime_switch_alert_title">Setup for input method</string>
- <string name="pref_ime_switch_alert_message">Please change the input method to %s.</string>
- <string name="pref_ime_alert_next">Next</string>
- <string name="pref_ime_alert_cancel">Cancel</string>
+ <string name="pref_ime_enable_alert_title" translation_description="(106) in http://goo.gl/jLDD7P">Setup for text settings</string>
+ <string name="pref_ime_enable_alert_message" translation_description="(107) in http://goo.gl/jLDD7P">Please enable %s.</string>
+ <string name="pref_ime_switch_alert_title" translation_description="(108) in http://goo.gl/jLDD7P">Setup for input method</string>
+ <string name="pref_ime_switch_alert_message" translation_description="(109) in http://goo.gl/jLDD7P">Please change the input method to %s.</string>
+ <string name="pref_ime_alert_next" translation_description="(110) in http://goo.gl/jLDD7P">Next</string>
+ <string name="pref_ime_alert_cancel" translation_description="(111) in http://goo.gl/jLDD7P">Cancel</string>
<!-- Misc text for preferences -->
- <string name="pref_flick_sensitivity_seekbar_low_text">Low</string>
- <string name="pref_flick_sensitivity_seekbar_middle_text">Mid</string>
- <string name="pref_flick_sensitivity_seekbar_high_text">High</string>
+ <string name="pref_flick_sensitivity_seekbar_low_text" translation_description="(112) in http://goo.gl/jLDD7P">Low</string>
+ <string name="pref_flick_sensitivity_seekbar_middle_text" translation_description="(113) in http://goo.gl/jLDD7P">Mid</string>
+ <string name="pref_flick_sensitivity_seekbar_high_text" translation_description="(114) in http://goo.gl/jLDD7P">High</string>
- <string name="pref_haptic_feedback_duration_low_text">Short</string>
- <string name="pref_haptic_feedback_duration_high_text">Long</string>
+ <string name="pref_haptic_feedback_duration_low_text" translation_description="(115) in http://goo.gl/jLDD7P">Short</string>
+ <string name="pref_haptic_feedback_duration_high_text" translation_description="(116) in http://goo.gl/jLDD7P">Long</string>
- <string name="pref_sound_feedback_volume_low_text">Min</string>
- <string name="pref_sound_feedback_volume_middle_text">Mid</string>
- <string name="pref_sound_feedback_volume_high_text">Max</string>
+ <string name="pref_sound_feedback_volume_low_text" translation_description="(117) in http://goo.gl/jLDD7P">Min</string>
+ <string name="pref_sound_feedback_volume_middle_text" translation_description="(118) in http://goo.gl/jLDD7P">Mid</string>
+ <string name="pref_sound_feedback_volume_high_text" translation_description="(119) in http://goo.gl/jLDD7P">Max</string>
- <string name="symbol_input_no_history">No history.\n\nSwipe the screen\nto browse categories.</string>
- <string name="symbol_emoji_disabled_message">This text field does not support Emoji input.</string>
-
- <!-- Symbol minor category text -->
- <!-- TODO(hidehiko): The line break looks very dirty on English. Fix it. -->
- <string name="symbol_minor_symbol_history_title">History</string>
- <string name="symbol_minor_symbol_general_title">General\nSymbol</string>
- <string name="symbol_minor_symbol_half_title">Half\nFull</string>
- <string name="symbol_minor_symbol_parenthesis_title">Paren.\nRule</string>
- <string name="symbol_minor_symbol_arrow_title">Arrow\nNumber</string>
- <string name="symbol_minor_symbol_math_title">Math\nUnit</string>
-
- <string name="symbol_minor_emoticon_history_title">History</string>
- <string name="symbol_minor_emoticon_smile_title">Smile\n(^^)</string>
- <string name="symbol_minor_emoticon_sweat_title">Sweat\n(^^;)</string>
- <string name="symbol_minor_emoticon_surprise_title">Surprise\n(゜д゜)</string>
- <string name="symbol_minor_emoticon_sadness_title">Sadness\n(T_T)</string>
- <string name="symbol_minor_emoticon_displeasure_title">Displeasure\n(-_-)</string>
-
- <string name="symbol_minor_emoji_history_title">History</string>
- <string name="symbol_minor_emoji_face_title">Face\nEmotion</string>
- <string name="symbol_minor_emoji_food_title">Food\nPlay</string>
- <string name="symbol_minor_emoji_activity_title">Activity\nLife</string>
- <string name="symbol_minor_emoji_city_title">City\nWork</string>
- <string name="symbol_minor_emoji_nature_title">Nature\nFigure</string>
+ <string name="symbol_input_no_history" translation_description="(128) in http://goo.gl/jLDD7P">No history.\n\nSwipe the screen\nto browse categories.</string>
+ <string name="symbol_emoji_disabled_message" translation_description="(129) in http://goo.gl/jLDD7P">This text field does not support Emoji input.</string>
<!-- Menu dialog -->
- <string name="menu_dialog_title">Input options</string>
- <string name="menu_item_input_method">Select input method</string>
- <string name="menu_item_preferences">%s settings</string>
- <string name="menu_item_voice_input">Voice input</string>
- <string name="menu_item_mushroom">Launch Mushroom</string>
+ <string name="menu_dialog_title" translation_description="(130) in http://goo.gl/jLDD7P">Input options</string>
+ <string name="menu_item_input_method" translation_description="(131) in http://goo.gl/jLDD7P">Select input method</string>
+ <string name="menu_item_preferences" translation_description="(132) in http://goo.gl/jLDD7P">%s settings</string>
+ <string name="menu_item_mushroom" translation_description="(134) in http://goo.gl/jLDD7P">Launch Mushroom</string>
<!-- User Dictionary Tool -->
- <string name="user_dictionary_tool_app_name">Dictionary tool</string>
+ <string name="user_dictionary_tool_app_name" translation_description="(135) in http://goo.gl/jLDD7P">Dictionary tool</string>
<!-- Menu -->
- <string name="user_dictionary_tool_menu_add_entry_title">New word</string>
- <string name="user_dictionary_tool_menu_delete_entry_title">Delete word</string>
- <string name="user_dictionary_tool_menu_undo_title">Undo</string>
- <string name="user_dictionary_tool_menu_create_dictionary_title">New dictionary</string>
- <string name="user_dictionary_tool_menu_rename_dictionary_title">Rename current dictionary</string>
- <string name="user_dictionary_tool_menu_delete_dictionary_title">Delete current dictionary</string>
- <string name="user_dictionary_tool_menu_export_dictionary_title">Export current dictionary</string>
+ <string name="user_dictionary_tool_menu_add_entry_title" translation_description="(136) in http://goo.gl/jLDD7P">New word</string>
+ <string name="user_dictionary_tool_menu_delete_entry_title" translation_description="(137) in http://goo.gl/jLDD7P">Delete word</string>
+ <string name="user_dictionary_tool_menu_undo_title" translation_description="(138) in http://goo.gl/jLDD7P">Undo</string>
+ <string name="user_dictionary_tool_menu_create_dictionary_title" translation_description="(139) in http://goo.gl/jLDD7P">New dictionary</string>
+ <string name="user_dictionary_tool_menu_rename_dictionary_title" translation_description="(140) in http://goo.gl/jLDD7P">Rename current dictionary</string>
+ <string name="user_dictionary_tool_menu_delete_dictionary_title" translation_description="(141) in http://goo.gl/jLDD7P">Delete current dictionary</string>
+ <string name="user_dictionary_tool_menu_export_dictionary_title" translation_description="(142) in http://goo.gl/jLDD7P">Export current dictionary</string>
<!-- Dictionary editing -->
- <string name="user_dictionary_tool_default_dictionary_name">User Dictionary 1</string>
- <string name="user_dictionary_tool_create_dictionary_dialog_title">Create a new dictionary</string>
- <string name="user_dictionary_tool_rename_dictionary_dialog_title">Edit the name of the dictionary</string>
- <string name="user_dictionary_tool_dictionary_name_dialog_dictionary_name_label">Name of the dictionary</string>
+ <string name="user_dictionary_tool_default_dictionary_name" translation_description="(143) in http://goo.gl/jLDD7P">User Dictionary 1</string>
+ <string name="user_dictionary_tool_create_dictionary_dialog_title" translation_description="(144) in http://goo.gl/jLDD7P">Create a new dictionary</string>
+ <string name="user_dictionary_tool_rename_dictionary_dialog_title" translation_description="(145) in http://goo.gl/jLDD7P">Edit the name of the dictionary</string>
+ <string name="user_dictionary_tool_dictionary_name_dialog_dictionary_name_label" translation_description="(146) in http://goo.gl/jLDD7P">Name of the dictionary</string>
<!-- Word register dialog -->
- <string name="user_dictionary_tool_add_entry_dialog_title">Add a new word</string>
- <string name="user_dictionary_tool_edit_entry_dialog_title">Edit a word</string>
- <string name="user_dictionary_tool_word_register_dialog_reading_label">Reading</string>
- <string name="user_dictionary_tool_word_register_dialog_word_label">Word</string>
- <string name="user_dictionary_tool_word_register_dialog_pos_label">Category</string>
+ <string name="user_dictionary_tool_add_entry_dialog_title" translation_description="(147) in http://goo.gl/jLDD7P">Add a new word</string>
+ <string name="user_dictionary_tool_edit_entry_dialog_title" translation_description="(148) in http://goo.gl/jLDD7P">Edit a word</string>
+ <string name="user_dictionary_tool_word_register_dialog_reading_label" translation_description="(149) in http://goo.gl/jLDD7P">Reading</string>
+ <string name="user_dictionary_tool_word_register_dialog_word_label" translation_description="(150) in http://goo.gl/jLDD7P">Word</string>
+ <string name="user_dictionary_tool_word_register_dialog_pos_label" translation_description="(151) in http://goo.gl/jLDD7P">Category</string>
<!-- Import dialog -->
- <string name="user_dictionary_tool_zip_file_selection_dialog_title">Select import source</string>
- <string name="user_dictionary_tool_import_dictionary_selection_dialog_title">Select import destination</string>
- <string name="user_dictionary_tool_import_dictionary_selection_dialog_new_dictionary">Import as a new dictionary</string>
+ <string name="user_dictionary_tool_zip_file_selection_dialog_title" translation_description="(152) in http://goo.gl/jLDD7P">Select import source</string>
+ <string name="user_dictionary_tool_import_dictionary_selection_dialog_title" translation_description="(153) in http://goo.gl/jLDD7P">Select import destination</string>
+ <string name="user_dictionary_tool_import_dictionary_selection_dialog_new_dictionary" translation_description="(154) in http://goo.gl/jLDD7P">Import as a new dictionary</string>
<!-- Message -->
- <string name="user_dictionary_tool_delete_done_message">Delete operation successful.</string>
- <string name="user_dictionary_tool_undo_done_message">Undo operation successful.</string>
+ <string name="user_dictionary_tool_delete_done_message" translation_description="(155) in http://goo.gl/jLDD7P">Delete operation successful.</string>
+ <string name="user_dictionary_tool_undo_done_message" translation_description="(156) in http://goo.gl/jLDD7P">Undo operation successful.</string>
<!-- Error messages -->
- <string name="user_dictionary_tool_error_delete_entries_without_check">Select the words you would like to delete.</string>
- <string name="user_dictionary_tool_error_import_source_invalid_scheme">Data import only works on files.</string>
- <string name="user_dictionary_tool_error_import_cannot_read_import_source">Could not read the file.</string>
- <string name="user_dictionary_tool_error_import_no_zip_entry">The ZIP file is empty.</string>
- <string name="user_dictionary_tool_error_export_no_exportable_applications">There are no applications (e.g. Google Docs) to export the user dictionary.</string>
- <string name="user_dictionary_tool_error_export_failed_to_export">Failed to export the user dictionary.</string>
- <string name="user_dictionary_tool_status_error_general">The operation has failed.</string>
- <string name="user_dictionary_tool_status_error_file_not_found">Could not open the file.</string>
- <string name="user_dictionary_tool_status_error_invalid_file_format">Could not read the file.</string>
- <string name="user_dictionary_tool_status_error_file_size_limit_exceeded">The data size exceeds the file size limit.</string>
- <string name="user_dictionary_tool_status_error_dictionary_size_limit_exceeded">Can\'t create any more dictionaries.</string>
- <string name="user_dictionary_tool_status_error_entry_size_limit_exceeded">Can\'t create any more entries in this dictionary.</string>
- <string name="user_dictionary_tool_status_error_dictionary_name_empty">Please type a dictionary name.</string>
- <string name="user_dictionary_tool_status_error_dictionary_name_too_long">The name is too long.</string>
- <string name="user_dictionary_tool_status_error_dictionary_name_contains_invalid_character">The name contains invalid character(s).</string>
- <string name="user_dictionary_tool_status_error_dictionary_name_duplicated">The name already exists.</string>
- <string name="user_dictionary_tool_status_error_reading_empty">Please type the reading.</string>
- <string name="user_dictionary_tool_status_error_reading_too_long">The reading is too long.</string>
- <string name="user_dictionary_tool_status_error_reading_contains_invalid_character">The reading contains invalid character(s).</string>
- <string name="user_dictionary_tool_status_error_word_empty">Please type the word.</string>
- <string name="user_dictionary_tool_status_error_word_too_long">The word is too long.</string>
- <string name="user_dictionary_tool_status_error_word_contains_invalid_character">Thw word contains invalid character(s).</string>
- <string name="user_dictionary_tool_status_error_import_too_many_words">The import source contains too many words.</string>
- <string name="user_dictionary_tool_status_error_import_invalid_entries">Some words could not be imported.</string>
- <string name="user_dictionary_tool_status_error_no_undo_history">No more undo-able operation.</string>
+ <string name="user_dictionary_tool_error_delete_entries_without_check" translation_description="(157) in http://goo.gl/jLDD7P">Select the words you would like to delete.</string>
+ <string name="user_dictionary_tool_error_import_source_invalid_scheme" translation_description="(158) in http://goo.gl/jLDD7P">Data import only works on files.</string>
+ <string name="user_dictionary_tool_error_import_cannot_read_import_source" translation_description="(159) in http://goo.gl/jLDD7P">Could not read the file.</string>
+ <string name="user_dictionary_tool_error_import_no_zip_entry" translation_description="(160) in http://goo.gl/jLDD7P">The ZIP file is empty.</string>
+ <string name="user_dictionary_tool_error_export_no_exportable_applications" translation_description="(161) in http://goo.gl/jLDD7P">There are no applications (e.g. Google Docs) to export the user dictionary.</string>
+ <string name="user_dictionary_tool_error_export_failed_to_export" translation_description="(162) in http://goo.gl/jLDD7P">Failed to export the user dictionary.</string>
+ <string name="user_dictionary_tool_status_error_general" translation_description="(163) in http://goo.gl/jLDD7P">The operation has failed.</string>
+ <string name="user_dictionary_tool_status_error_file_not_found" translation_description="(164) in http://goo.gl/jLDD7P">Could not open the file.</string>
+ <string name="user_dictionary_tool_status_error_invalid_file_format" translation_description="(165) in http://goo.gl/jLDD7P">Could not read the file.</string>
+ <string name="user_dictionary_tool_status_error_file_size_limit_exceeded" translation_description="(166) in http://goo.gl/jLDD7P">The data size exceeds the file size limit.</string>
+ <string name="user_dictionary_tool_status_error_dictionary_size_limit_exceeded" translation_description="(167) in http://goo.gl/jLDD7P">Can\'t create any more dictionaries.</string>
+ <string name="user_dictionary_tool_status_error_entry_size_limit_exceeded" translation_description="(168) in http://goo.gl/jLDD7P">Can\'t create any more entries in this dictionary.</string>
+ <string name="user_dictionary_tool_status_error_dictionary_name_empty" translation_description="(169) in http://goo.gl/jLDD7P">Please type a dictionary name.</string>
+ <string name="user_dictionary_tool_status_error_dictionary_name_too_long" translation_description="(170) in http://goo.gl/jLDD7P">The name is too long.</string>
+ <string name="user_dictionary_tool_status_error_dictionary_name_contains_invalid_character" translation_description="(171) in http://goo.gl/jLDD7P">The name contains invalid character(s).</string>
+ <string name="user_dictionary_tool_status_error_dictionary_name_duplicated" translation_description="(172) in http://goo.gl/jLDD7P">The name already exists.</string>
+ <string name="user_dictionary_tool_status_error_reading_empty" translation_description="(173) in http://goo.gl/jLDD7P">Please type the reading.</string>
+ <string name="user_dictionary_tool_status_error_reading_too_long" translation_description="(174) in http://goo.gl/jLDD7P">The reading is too long.</string>
+ <string name="user_dictionary_tool_status_error_reading_contains_invalid_character" translation_description="(175) in http://goo.gl/jLDD7P">The reading contains invalid character(s).</string>
+ <string name="user_dictionary_tool_status_error_word_empty" translation_description="(176) in http://goo.gl/jLDD7P">Please type the word.</string>
+ <string name="user_dictionary_tool_status_error_word_too_long" translation_description="(177) in http://goo.gl/jLDD7P">The word is too long.</string>
+ <string name="user_dictionary_tool_status_error_word_contains_invalid_character" translation_description="(178) in http://goo.gl/jLDD7P">Thw word contains invalid character(s).</string>
+ <string name="user_dictionary_tool_status_error_import_too_many_words" translation_description="(179) in http://goo.gl/jLDD7P">The import source contains too many words.</string>
+ <string name="user_dictionary_tool_status_error_import_invalid_entries" translation_description="(180) in http://goo.gl/jLDD7P">Some words could not be imported.</string>
+ <string name="user_dictionary_tool_status_error_no_undo_history" translation_description="(181) in http://goo.gl/jLDD7P">No more undo-able operation.</string>
<!-- List of Japanese POS -->
<!-- You should keep a consistency with japanese_pos_for_dictionary_export_*. -->
- <string name="japanese_pos_noun">Noun</string>
- <string name="japanese_pos_abbreviation">Abbreviation</string>
- <string name="japanese_pos_suggestion_only">Suggestion only</string>
- <string name="japanese_pos_proper_noun">Proper noun</string>
- <string name="japanese_pos_personal_name">Personal name</string>
- <string name="japanese_pos_family_name">Family name</string>
- <string name="japanese_pos_first_name">First name</string>
- <string name="japanese_pos_organization_name">Organization name</string>
- <string name="japanese_pos_place_name">Place name</string>
- <string name="japanese_pos_sa_irregular_conjugation_noun">SA-irregular conjugation noun</string>
- <string name="japanese_pos_adjective_verbal_noun">Adjective verbal noun</string>
- <string name="japanese_pos_number">Number</string>
- <string name="japanese_pos_alphabet">Alphabet</string>
- <string name="japanese_pos_symbol">Symbol</string>
- <string name="japanese_pos_emoticon">Emoticon</string>
- <string name="japanese_pos_adverb">Adverb</string>
- <string name="japanese_pos_prenoun_adjectival">Prenoun adjectival</string>
- <string name="japanese_pos_conjunction">Conjunction</string>
- <string name="japanese_pos_interjection">Interjection</string>
- <string name="japanese_pos_prefix">Prefix</string>
- <string name="japanese_pos_counter_suffix">Counter suffix</string>
- <string name="japanese_pos_generic_suffix">Generic suffix</string>
- <string name="japanese_pos_person_name_suffix">Person name suffix</string>
- <string name="japanese_pos_place_name_suffix">Place name suffix</string>
- <string name="japanese_pos_wa_group1_verb">WA-Group1 verb</string>
- <string name="japanese_pos_ka_group1_verb">KA-Group1 verb</string>
- <string name="japanese_pos_sa_group1_verb">SA-Group1 verb</string>
- <string name="japanese_pos_ta_group1_verb">TA-Group1 verb</string>
- <string name="japanese_pos_na_group1_verb">NA-Group1 verb</string>
- <string name="japanese_pos_ma_group1_verb">MA-Group1 verb</string>
- <string name="japanese_pos_ra_group1_verb">RA-Group1 verb</string>
- <string name="japanese_pos_ga_group1_verb">GA-Group1 verb</string>
- <string name="japanese_pos_ba_group1_verb">BA-Group1 verb</string>
- <string name="japanese_pos_ha_group1_verb">HA-Group1 verb</string>
- <string name="japanese_pos_group2_verb">Group2 verb</string>
- <string name="japanese_pos_kuru_group3_verb">Kuru-Group3 verb</string>
- <string name="japanese_pos_suru_group3_verb">Suru-Group3 verb</string>
- <string name="japanese_pos_zuru_group3_verb">Zuru-Group3 verb</string>
- <string name="japanese_pos_ru_group3_verb">Ru-Group3 verb</string>
- <string name="japanese_pos_adjective">Adjective</string>
- <string name="japanese_pos_sentence_ending_particle">Sentence ending particle</string>
- <string name="japanese_pos_punctuation">Punctuation</string>
- <string name="japanese_pos_free_standing_word">Free standing word</string>
- <string name="japanese_pos_suppression_word">Suppression word</string>
-
- <!-- List of Japanese POS for user dictionary export feature -->
- <!-- You should keep a consistency with japanese_pos_*. -->
- <string name="japanese_pos_for_dictionary_export_noun">名詞</string>
- <string name="japanese_pos_for_dictionary_export_abbreviation">短縮よみ</string>
- <string name="japanese_pos_for_dictionary_export_suggestion_only">サジェストのみ</string>
- <string name="japanese_pos_for_dictionary_export_proper_noun">固有名詞</string>
- <string name="japanese_pos_for_dictionary_export_personal_name">人名</string>
- <string name="japanese_pos_for_dictionary_export_family_name">姓</string>
- <string name="japanese_pos_for_dictionary_export_first_name">名</string>
- <string name="japanese_pos_for_dictionary_export_organization_name">組織</string>
- <string name="japanese_pos_for_dictionary_export_place_name">地名</string>
- <string name="japanese_pos_for_dictionary_export_sa_irregular_conjugation_noun">名詞サ変</string>
- <string name="japanese_pos_for_dictionary_export_adjective_verbal_noun">名詞形動</string>
- <string name="japanese_pos_for_dictionary_export_number">数字</string>
- <string name="japanese_pos_for_dictionary_export_alphabet">アルファベット</string>
- <string name="japanese_pos_for_dictionary_export_symbol">記号</string>
- <string name="japanese_pos_for_dictionary_export_emoticon">顔文字</string>
- <string name="japanese_pos_for_dictionary_export_adverb">副詞</string>
- <string name="japanese_pos_for_dictionary_export_prenoun_adjectival">連体詞</string>
- <string name="japanese_pos_for_dictionary_export_conjunction">接続詞</string>
- <string name="japanese_pos_for_dictionary_export_interjection">感動詞</string>
- <string name="japanese_pos_for_dictionary_export_prefix">接頭語</string>
- <string name="japanese_pos_for_dictionary_export_counter_suffix">助数詞</string>
- <string name="japanese_pos_for_dictionary_export_generic_suffix">接尾一般</string>
- <string name="japanese_pos_for_dictionary_export_person_name_suffix">接尾人名</string>
- <string name="japanese_pos_for_dictionary_export_place_name_suffix">接尾地名</string>
- <string name="japanese_pos_for_dictionary_export_wa_group1_verb">動詞ワ行五段</string>
- <string name="japanese_pos_for_dictionary_export_ka_group1_verb">動詞カ行五段</string>
- <string name="japanese_pos_for_dictionary_export_sa_group1_verb">動詞サ行五段</string>
- <string name="japanese_pos_for_dictionary_export_ta_group1_verb">動詞タ行五段</string>
- <string name="japanese_pos_for_dictionary_export_na_group1_verb">動詞ナ行五段</string>
- <string name="japanese_pos_for_dictionary_export_ma_group1_verb">動詞マ行五段</string>
- <string name="japanese_pos_for_dictionary_export_ra_group1_verb">動詞ラ行五段</string>
- <string name="japanese_pos_for_dictionary_export_ga_group1_verb">動詞ガ行五段</string>
- <string name="japanese_pos_for_dictionary_export_ba_group1_verb">動詞バ行五段</string>
- <string name="japanese_pos_for_dictionary_export_ha_group1_verb">動詞ハ行四段</string>
- <string name="japanese_pos_for_dictionary_export_group2_verb">動詞一段</string>
- <string name="japanese_pos_for_dictionary_export_kuru_group3_verb">動詞カ変</string>
- <string name="japanese_pos_for_dictionary_export_suru_group3_verb">動詞サ変</string>
- <string name="japanese_pos_for_dictionary_export_zuru_group3_verb">動詞ザ変</string>
- <string name="japanese_pos_for_dictionary_export_ru_group3_verb">動詞ラ変</string>
- <string name="japanese_pos_for_dictionary_export_adjective">形容詞</string>
- <string name="japanese_pos_for_dictionary_export_sentence_ending_particle">終助詞</string>
- <string name="japanese_pos_for_dictionary_export_punctuation">句読点</string>
- <string name="japanese_pos_for_dictionary_export_free_standing_word">独立語</string>
- <string name="japanese_pos_for_dictionary_export_suppression_word">抑制単語</string>
-
+ <string name="japanese_pos_noun" translation_description="(182) in http://goo.gl/jLDD7P">Noun</string>
+ <string name="japanese_pos_abbreviation" translation_description="(183) in http://goo.gl/jLDD7P">Abbreviation</string>
+ <string name="japanese_pos_suggestion_only" translation_description="(184) in http://goo.gl/jLDD7P">Suggestion only</string>
+ <string name="japanese_pos_proper_noun" translation_description="(185) in http://goo.gl/jLDD7P">Proper noun</string>
+ <string name="japanese_pos_personal_name" translation_description="(186) in http://goo.gl/jLDD7P">Personal name</string>
+ <string name="japanese_pos_family_name" translation_description="(187) in http://goo.gl/jLDD7P">Family name</string>
+ <string name="japanese_pos_first_name" translation_description="(188) in http://goo.gl/jLDD7P">First name</string>
+ <string name="japanese_pos_organization_name" translation_description="(189) in http://goo.gl/jLDD7P">Organization name</string>
+ <string name="japanese_pos_place_name" translation_description="(190) in http://goo.gl/jLDD7P">Place name</string>
+ <string name="japanese_pos_sa_irregular_conjugation_noun" translation_description="(191) in http://goo.gl/jLDD7P">SA-irregular conjugation noun</string>
+ <string name="japanese_pos_adjective_verbal_noun" translation_description="(192) in http://goo.gl/jLDD7P">Adjective verbal noun</string>
+ <string name="japanese_pos_number" translation_description="(193) in http://goo.gl/jLDD7P">Number</string>
+ <string name="japanese_pos_alphabet" translation_description="(194) in http://goo.gl/jLDD7P">Alphabet</string>
+ <string name="japanese_pos_symbol" translation_description="(195) in http://goo.gl/jLDD7P">Symbol</string>
+ <string name="japanese_pos_emoticon" translation_description="(196) in http://goo.gl/jLDD7P">Emoticon</string>
+ <string name="japanese_pos_adverb" translation_description="(197) in http://goo.gl/jLDD7P">Adverb</string>
+ <string name="japanese_pos_prenoun_adjectival" translation_description="(198) in http://goo.gl/jLDD7P">Prenoun adjectival</string>
+ <string name="japanese_pos_conjunction" translation_description="(199) in http://goo.gl/jLDD7P">Conjunction</string>
+ <string name="japanese_pos_interjection" translation_description="(200) in http://goo.gl/jLDD7P">Interjection</string>
+ <string name="japanese_pos_prefix" translation_description="(201) in http://goo.gl/jLDD7P">Prefix</string>
+ <string name="japanese_pos_counter_suffix" translation_description="(202) in http://goo.gl/jLDD7P">Counter suffix</string>
+ <string name="japanese_pos_generic_suffix" translation_description="(203) in http://goo.gl/jLDD7P">Generic suffix</string>
+ <string name="japanese_pos_person_name_suffix" translation_description="(204) in http://goo.gl/jLDD7P">Person name suffix</string>
+ <string name="japanese_pos_place_name_suffix" translation_description="(205) in http://goo.gl/jLDD7P">Place name suffix</string>
+ <string name="japanese_pos_wa_group1_verb" translation_description="(206) in http://goo.gl/jLDD7P">WA-Group1 verb</string>
+ <string name="japanese_pos_ka_group1_verb" translation_description="(207) in http://goo.gl/jLDD7P">KA-Group1 verb</string>
+ <string name="japanese_pos_sa_group1_verb" translation_description="(208) in http://goo.gl/jLDD7P">SA-Group1 verb</string>
+ <string name="japanese_pos_ta_group1_verb" translation_description="(209) in http://goo.gl/jLDD7P">TA-Group1 verb</string>
+ <string name="japanese_pos_na_group1_verb" translation_description="(210) in http://goo.gl/jLDD7P">NA-Group1 verb</string>
+ <string name="japanese_pos_ma_group1_verb" translation_description="(211) in http://goo.gl/jLDD7P">MA-Group1 verb</string>
+ <string name="japanese_pos_ra_group1_verb" translation_description="(212) in http://goo.gl/jLDD7P">RA-Group1 verb</string>
+ <string name="japanese_pos_ga_group1_verb" translation_description="(213) in http://goo.gl/jLDD7P">GA-Group1 verb</string>
+ <string name="japanese_pos_ba_group1_verb" translation_description="(214) in http://goo.gl/jLDD7P">BA-Group1 verb</string>
+ <string name="japanese_pos_ha_group1_verb" translation_description="(215) in http://goo.gl/jLDD7P">HA-Group1 verb</string>
+ <string name="japanese_pos_group2_verb" translation_description="(216) in http://goo.gl/jLDD7P">Group2 verb</string>
+ <string name="japanese_pos_kuru_group3_verb" translation_description="(217) in http://goo.gl/jLDD7P">Kuru-Group3 verb</string>
+ <string name="japanese_pos_suru_group3_verb" translation_description="(218) in http://goo.gl/jLDD7P">Suru-Group3 verb</string>
+ <string name="japanese_pos_zuru_group3_verb" translation_description="(219) in http://goo.gl/jLDD7P">Zuru-Group3 verb</string>
+ <string name="japanese_pos_ru_group3_verb" translation_description="(220) in http://goo.gl/jLDD7P">Ru-Group3 verb</string>
+ <string name="japanese_pos_adjective" translation_description="(221) in http://goo.gl/jLDD7P">Adjective</string>
+ <string name="japanese_pos_sentence_ending_particle" translation_description="(222) in http://goo.gl/jLDD7P">Sentence ending particle</string>
+ <string name="japanese_pos_punctuation" translation_description="(223) in http://goo.gl/jLDD7P">Punctuation</string>
+ <string name="japanese_pos_free_standing_word" translation_description="(224) in http://goo.gl/jLDD7P">Free standing word</string>
+ <string name="japanese_pos_suppression_word" translation_description="(225) in http://goo.gl/jLDD7P">Suppression word</string>
<!-- Yes/No -->
<!-- Unfortunately android.R.string.yes/no correspond to OK/Cancel. -->
- <string name="yes">Yes</string>
- <string name="no">No</string>
+ <string name="yes" translation_description="(226) in http://goo.gl/jLDD7P">Yes</string>
+ <string name="no" translation_description="(227) in http://goo.gl/jLDD7P">No</string>
</resources>
diff --git a/src/android/static_resources/resources_oss/res/values/styles.xml b/src/android/static_resources/resources_oss/res/values/styles.xml
deleted file mode 100644
index e87f661..0000000
--- a/src/android/static_resources/resources_oss/res/values/styles.xml
+++ /dev/null
@@ -1,53 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<resources>
- <!-- Theme for user dictionary tool. -->
- <style name="MozcActionBar">
- <item name="android:background">@color/action_bar_background</item>
- </style>
-
- <style name="MozcDialogTextViewTextAppearance">
- <item name="android:textColor">@android:color/primary_text_dark</item>
- <item name="android:textSize">14sp</item>
- </style>
- <style name="MozcDialogTextView" parent="@android:style/Widget.TextView">
- <item name="android:textAppearance">@style/MozcDialogTextViewTextAppearance</item>
- </style>
- <style name="MozcLightTheme" parent="@android:style/Theme.Light">
- <item name="android:windowTitleSize">48dip</item>
- <item name="android:windowTitleBackgroundStyle">@style/MozcActionBar</item>
- <item name="android:windowContentOverlay">@drawable/action_bar_shadow</item>
- </style>
-
- <!-- Theme for mushroom dialog. -->
- <style name="MozcMushroomDialogTheme" parent="@android:style/Theme.Dialog" />
-</resources>
diff --git a/src/android/static_resources/resources_oss/res/values/themes.xml b/src/android/static_resources/resources_oss/res/values/themes.xml
new file mode 100644
index 0000000..079a107
--- /dev/null
+++ b/src/android/static_resources/resources_oss/res/values/themes.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<resources>
+
+ <style name="AppThemeSelector" parent="android:Theme.DeviceDefault"/>
+ <style name="AppThemeSelectorSettings" parent="android:Theme.DeviceDefault"/>
+
+</resources>
diff --git a/src/android/static_resources/resources_oss/res/values/untranslatable_application.xml b/src/android/static_resources/resources_oss/res/values/untranslatable_application.xml
new file mode 100644
index 0000000..cb0d19b
--- /dev/null
+++ b/src/android/static_resources/resources_oss/res/values/untranslatable_application.xml
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!--
+This file contains strings, which are untranslatable and differ from the OSS
+version.
+-->
+<resources>
+ <string name="pref_about_terms_of_service_url">http://code.google.com/p/mozc/</string>
+ <string name="pref_about_privacy_policy_url">http://code.google.com/p/mozc/</string>
+ <!--
+ MiniBrowser can access only the url which matches below pattern.
+ This restriction is introduced in order not to show unexpected website in "EULA" activity.
+ By default no restriction is applied in order to avoid from breaking existing implemntation.
+ -->
+ <string name="pref_url_restriction_regex">.*</string>
+ <string name="user_dictionary_tool_export_provider_name">org.mozc.android.inputmethod.japanese.userdictionary.UserDictionaryExportProvider</string>
+
+ <!--
+ If you developer want to activate usage stats collection feature, turn the property on
+ and change the URL in usage_stats/upload_util.cc.
+ However usually you don't need the feature so please keep this false as long as possible.
+ -->
+ <bool name="sending_information_features_enabled">false</bool>
+
+</resources>
+
diff --git a/src/android/static_resources/resources_oss/res/values/untranslatable_strings.xml b/src/android/static_resources/resources_oss/res/values/untranslatable_strings.xml
new file mode 100644
index 0000000..affc6e2
--- /dev/null
+++ b/src/android/static_resources/resources_oss/res/values/untranslatable_strings.xml
@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<resources>
+ <!-- Default skin for pre-L -->
+ <string name="pref_skin_type_default" translatable="false">BLUE_DARKGRAY</string>
+
+ <!-- Preference url -->
+ <string name="pref_oss_credits_url" translatable="false">file:///android_asset/credits_en.html</string>
+
+ <!-- User Dictionary Tool -->
+ <!-- List of Japanese POS for user dictionary export feature -->
+ <!-- You should keep a consistency with japanese_pos_*. -->
+ <string name="japanese_pos_for_dictionary_export_noun" translatable="false">名詞</string>
+ <string name="japanese_pos_for_dictionary_export_abbreviation" translatable="false">短縮よみ</string>
+ <string name="japanese_pos_for_dictionary_export_suggestion_only" translatable="false">サジェストのみ</string>
+ <string name="japanese_pos_for_dictionary_export_proper_noun" translatable="false">固有名詞</string>
+ <string name="japanese_pos_for_dictionary_export_personal_name" translatable="false">人名</string>
+ <string name="japanese_pos_for_dictionary_export_family_name" translatable="false">姓</string>
+ <string name="japanese_pos_for_dictionary_export_first_name" translatable="false">名</string>
+ <string name="japanese_pos_for_dictionary_export_organization_name" translatable="false">組織</string>
+ <string name="japanese_pos_for_dictionary_export_place_name" translatable="false">地名</string>
+ <string name="japanese_pos_for_dictionary_export_sa_irregular_conjugation_noun" translatable="false">名詞サ変</string>
+ <string name="japanese_pos_for_dictionary_export_adjective_verbal_noun" translatable="false">名詞形動</string>
+ <string name="japanese_pos_for_dictionary_export_number" translatable="false">数字</string>
+ <string name="japanese_pos_for_dictionary_export_alphabet" translatable="false">アルファベット</string>
+ <string name="japanese_pos_for_dictionary_export_symbol" translatable="false">記号</string>
+ <string name="japanese_pos_for_dictionary_export_emoticon" translatable="false">顔文字</string>
+ <string name="japanese_pos_for_dictionary_export_adverb" translatable="false">副詞</string>
+ <string name="japanese_pos_for_dictionary_export_prenoun_adjectival" translatable="false">連体詞</string>
+ <string name="japanese_pos_for_dictionary_export_conjunction" translatable="false">接続詞</string>
+ <string name="japanese_pos_for_dictionary_export_interjection" translatable="false">感動詞</string>
+ <string name="japanese_pos_for_dictionary_export_prefix" translatable="false">接頭語</string>
+ <string name="japanese_pos_for_dictionary_export_counter_suffix" translatable="false">助数詞</string>
+ <string name="japanese_pos_for_dictionary_export_generic_suffix" translatable="false">接尾一般</string>
+ <string name="japanese_pos_for_dictionary_export_person_name_suffix" translatable="false">接尾人名</string>
+ <string name="japanese_pos_for_dictionary_export_place_name_suffix" translatable="false">接尾地名</string>
+ <string name="japanese_pos_for_dictionary_export_wa_group1_verb" translatable="false">動詞ワ行五段</string>
+ <string name="japanese_pos_for_dictionary_export_ka_group1_verb" translatable="false">動詞カ行五段</string>
+ <string name="japanese_pos_for_dictionary_export_sa_group1_verb" translatable="false">動詞サ行五段</string>
+ <string name="japanese_pos_for_dictionary_export_ta_group1_verb" translatable="false">動詞タ行五段</string>
+ <string name="japanese_pos_for_dictionary_export_na_group1_verb" translatable="false">動詞ナ行五段</string>
+ <string name="japanese_pos_for_dictionary_export_ma_group1_verb" translatable="false">動詞マ行五段</string>
+ <string name="japanese_pos_for_dictionary_export_ra_group1_verb" translatable="false">動詞ラ行五段</string>
+ <string name="japanese_pos_for_dictionary_export_ga_group1_verb" translatable="false">動詞ガ行五段</string>
+ <string name="japanese_pos_for_dictionary_export_ba_group1_verb" translatable="false">動詞バ行五段</string>
+ <string name="japanese_pos_for_dictionary_export_ha_group1_verb" translatable="false">動詞ハ行四段</string>
+ <string name="japanese_pos_for_dictionary_export_group2_verb" translatable="false">動詞一段</string>
+ <string name="japanese_pos_for_dictionary_export_kuru_group3_verb" translatable="false">動詞カ変</string>
+ <string name="japanese_pos_for_dictionary_export_suru_group3_verb" translatable="false">動詞サ変</string>
+ <string name="japanese_pos_for_dictionary_export_zuru_group3_verb" translatable="false">動詞ザ変</string>
+ <string name="japanese_pos_for_dictionary_export_ru_group3_verb" translatable="false">動詞ラ変</string>
+ <string name="japanese_pos_for_dictionary_export_adjective" translatable="false">形容詞</string>
+ <string name="japanese_pos_for_dictionary_export_sentence_ending_particle" translatable="false">終助詞</string>
+ <string name="japanese_pos_for_dictionary_export_punctuation" translatable="false">句読点</string>
+ <string name="japanese_pos_for_dictionary_export_free_standing_word" translatable="false">独立語</string>
+ <string name="japanese_pos_for_dictionary_export_suppression_word" translatable="false">抑制単語</string>
+
+</resources>
diff --git a/src/android/static_resources/resources_oss/res/xml/kbd_123.xml b/src/android/static_resources/resources_oss/res/xml/kbd_123.xml
new file mode 100644
index 0000000..68d05e5
--- /dev/null
+++ b/src/android/static_resources/resources_oss/res/xml/kbd_123.xml
@@ -0,0 +1,381 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+ <!--
+ The current keycode mapping to flick direction and tapping action is as follows;
+ +=======+===========+===========+===========+=======+
+ | | | | | |
+ | '+' | '1' | '2' | '3' | 'BS' |
+ | | | | | |
+ +=======+===========+===========+===========+=======+
+ | | | | | |
+ | '-' | '4' | '5' | '6' | '/' |
+ | | | | | |
+ +=======+===========+===========+===========+=======|
+ | | | | | |
+ | ',' | '7' | '8' | '9' | 'SPC' |
+ | | | | | |
+ +=======+===========+===========+===========+=======+
+ | | | | | |
+ | '.' | '*' | '0' | '#' | 'ENT' |
+ | | | | | |
+ +=======+===========+===========+===========+=======+
+ -->
+<Keyboard
+ xmlns:mozc="http://schemas.android.com/apk/res-auto"
+ mozc:keyboardContentDescription="@string/cd_keyboard_number"
+ mozc:keyBackground="twelvekeysRegular"
+ mozc:keyWidth="17.3%p" mozc:keyHeight="25%p" mozc:keyHorizontalLayoutWeight="1"
+ mozc:horizontalGap="0dip" mozc:verticalGap="0dip"
+ mozc:popUpHeight="@dimen/key_preview_height"
+ mozc:popUpIconHeight="@dimen/key_preview_icon_height"
+ mozc:popUpXOffset="0dip" mozc:popUpYOffset="@dimen/mini_keyboard_vertical_correction"
+ mozc:defaultIconWidth="@dimen/unlimited" mozc:defaultIconHeight="@dimen/unlimited">
+ <Row>
+ <Key mozc:keyBackground="twelvekeysFunction"
+ mozc:keyHorizontalLayoutWeight="0" mozc:keyEdgeFlags="left">
+ <KeyState mozc:contentDescription="@string/cd_key_uchar_plus_sign">
+ <Flick>
+ <KeyEntity mozc:sourceId="1"
+ mozc:keyCode="@integer/uchar_plus_sign"
+ mozc:keyIcon="@raw/twelvekeys__number__function__plus_sign" >
+ <PopUp mozc:popUpIcon="@raw/optional__twelvekeys__popup__plus_sign" />
+ </KeyEntity>
+ </Flick>
+ </KeyState>
+ </Key>
+ <Spacer mozc:keyWidth="@dimen/keyboard_separator_width" mozc:keyHorizontalLayoutWeight="0"
+ mozc:keyBackground="keyboardSeparatorTop"/>
+ <Key>
+ <KeyState mozc:contentDescription="@string/cd_key_uchar_digit_one">
+ <Flick>
+ <KeyEntity mozc:sourceId="2"
+ mozc:keyCode="@integer/uchar_digit_one"
+ mozc:keyIcon="@raw/twelvekeys__number__one">
+ <PopUp mozc:popUpIcon="@raw/optional__twelvekeys__popup__one" />
+ </KeyEntity>
+ </Flick>
+ </KeyState>
+ </Key>
+ <Key>
+ <KeyState mozc:contentDescription="@string/cd_key_uchar_digit_two">
+ <Flick>
+ <KeyEntity mozc:sourceId="3"
+ mozc:keyCode="@integer/uchar_digit_two"
+ mozc:keyIcon="@raw/twelvekeys__number__two">
+ <PopUp mozc:popUpIcon="@raw/optional__twelvekeys__popup__two" />
+ </KeyEntity>
+ </Flick>
+ </KeyState>
+ </Key>
+ <Key>
+ <KeyState mozc:contentDescription="@string/cd_key_uchar_digit_three">
+ <Flick>
+ <KeyEntity mozc:sourceId="4"
+ mozc:keyCode="@integer/uchar_digit_three"
+ mozc:keyIcon="@raw/twelvekeys__number__three">
+ <PopUp mozc:popUpIcon="@raw/optional__twelvekeys__popup__three" />
+ </KeyEntity>
+ </Flick>
+ </KeyState>
+ </Key>
+ <Spacer mozc:keyWidth="@dimen/keyboard_separator_width" mozc:keyHorizontalLayoutWeight="0"
+ mozc:keyBackground="keyboardSeparatorTop"/>
+ <Key mozc:keyBackground="twelvekeysFunction"
+ mozc:keyHorizontalLayoutWeight="0"
+ mozc:keyEdgeFlags="right" mozc:isRepeatable="true">
+ <KeyState mozc:contentDescription="@string/cd_key_uchar_backspace">
+ <Flick>
+ <KeyEntity mozc:sourceId="5"
+ mozc:keyCode="@integer/key_backspace"
+ mozc:keyIcon="@raw/twelvekeys__function__delete__icon"
+ mozc:iconWidth="@dimen/unlimited"
+ mozc:iconHeight="@dimen/default_function_icon_height" />
+ </Flick>
+ </KeyState>
+ </Key>
+ </Row>
+ <Row>
+ <Key mozc:keyBackground="twelvekeysFunction"
+ mozc:keyHorizontalLayoutWeight="0" mozc:keyEdgeFlags="left">
+ <KeyState mozc:contentDescription="@string/cd_key_uchar_hyphen_minus">
+ <Flick>
+ <KeyEntity mozc:sourceId="6"
+ mozc:keyCode="@integer/uchar_hyphen_minus"
+ mozc:keyIcon="@raw/twelvekeys__number__function__hyphen_minus" >
+ <PopUp mozc:popUpIcon="@raw/optional__twelvekeys__popup__hyphen_minus" />
+ </KeyEntity>
+ </Flick>
+ </KeyState>
+ </Key>
+ <Spacer mozc:keyWidth="@dimen/keyboard_separator_width" mozc:keyHorizontalLayoutWeight="0"
+ mozc:keyBackground="keyboardSeparatorCenter"/>
+ <Key>
+ <KeyState mozc:contentDescription="@string/cd_key_uchar_digit_four">
+ <Flick>
+ <KeyEntity mozc:sourceId="7"
+ mozc:keyCode="@integer/uchar_digit_four"
+ mozc:keyIcon="@raw/twelvekeys__number__four">
+ <PopUp mozc:popUpIcon="@raw/optional__twelvekeys__popup__four" />
+ </KeyEntity>
+ </Flick>
+ </KeyState>
+ </Key>
+ <Key>
+ <KeyState mozc:contentDescription="@string/cd_key_uchar_digit_five">
+ <Flick>
+ <KeyEntity mozc:sourceId="8"
+ mozc:keyCode="@integer/uchar_digit_five"
+ mozc:keyIcon="@raw/twelvekeys__number__five">
+ <PopUp mozc:popUpIcon="@raw/optional__twelvekeys__popup__five" />
+ </KeyEntity>
+ </Flick>
+ </KeyState>
+ </Key>
+ <Key>
+ <KeyState mozc:contentDescription="@string/cd_key_uchar_digit_six">
+ <Flick>
+ <KeyEntity mozc:sourceId="9"
+ mozc:keyCode="@integer/uchar_digit_six"
+ mozc:keyIcon="@raw/twelvekeys__number__six">
+ <PopUp mozc:popUpIcon="@raw/optional__twelvekeys__popup__six" />
+ </KeyEntity>
+ </Flick>
+ </KeyState>
+ </Key>
+ <Spacer mozc:keyWidth="@dimen/keyboard_separator_width" mozc:keyHorizontalLayoutWeight="0"
+ mozc:keyBackground="keyboardSeparatorCenter"/>
+ <Key mozc:keyBackground="twelvekeysFunction"
+ mozc:keyHorizontalLayoutWeight="0" mozc:keyEdgeFlags="right">
+ <KeyState mozc:contentDescription="@string/cd_key_uchar_solidus">
+ <Flick>
+ <KeyEntity mozc:sourceId="10"
+ mozc:keyCode="@integer/uchar_solidus"
+ mozc:keyIcon="@raw/twelvekeys__number__function__solidus" >
+ <PopUp mozc:popUpIcon="@raw/optional__twelvekeys__popup__solidus" />
+ </KeyEntity>
+ </Flick>
+ </KeyState>
+ </Key>
+ </Row>
+ <Row>
+ <Key mozc:keyBackground="twelvekeysFunction"
+ mozc:keyHorizontalLayoutWeight="0" mozc:keyEdgeFlags="left">
+ <KeyState mozc:contentDescription="@string/cd_key_uchar_comma">
+ <Flick>
+ <KeyEntity mozc:sourceId="11"
+ mozc:keyCode="@integer/uchar_comma"
+ mozc:keyIcon="@raw/twelvekeys__number__function__comma" >
+ <PopUp mozc:popUpIcon="@raw/optional__twelvekeys__popup__comma" />
+ </KeyEntity>
+ </Flick>
+ </KeyState>
+ </Key>
+ <Spacer mozc:keyWidth="@dimen/keyboard_separator_width" mozc:keyHorizontalLayoutWeight="0"
+ mozc:keyBackground="keyboardSeparatorCenter"/>
+ <Key>
+ <KeyState mozc:contentDescription="@string/cd_key_uchar_digit_seven">
+ <Flick>
+ <KeyEntity mozc:sourceId="12"
+ mozc:keyCode="@integer/uchar_digit_seven"
+ mozc:keyIcon="@raw/twelvekeys__number__seven">
+ <PopUp mozc:popUpIcon="@raw/optional__twelvekeys__popup__seven" />
+ </KeyEntity>
+ </Flick>
+ </KeyState>
+ </Key>
+ <Key>
+ <KeyState mozc:contentDescription="@string/cd_key_uchar_digit_eight">
+ <Flick>
+ <KeyEntity mozc:sourceId="13"
+ mozc:keyCode="@integer/uchar_digit_eight"
+ mozc:keyIcon="@raw/twelvekeys__number__eight">
+ <PopUp mozc:popUpIcon="@raw/optional__twelvekeys__popup__eight" />
+ </KeyEntity>
+ </Flick>
+ </KeyState>
+ </Key>
+ <Key>
+ <KeyState mozc:contentDescription="@string/cd_key_uchar_digit_nine">
+ <Flick>
+ <KeyEntity mozc:sourceId="14"
+ mozc:keyCode="@integer/uchar_digit_nine"
+ mozc:keyIcon="@raw/twelvekeys__number__nine">
+ <PopUp mozc:popUpIcon="@raw/optional__twelvekeys__popup__nine" />
+ </KeyEntity>
+ </Flick>
+ </KeyState>
+ </Key>
+ <Spacer mozc:keyWidth="@dimen/keyboard_separator_width" mozc:keyHorizontalLayoutWeight="0"
+ mozc:keyBackground="keyboardSeparatorCenter"/>
+ <Key mozc:keyBackground="twelvekeysFunctionWithThreeDots"
+ mozc:keyHorizontalLayoutWeight="0" mozc:keyEdgeFlags="right">
+ <KeyState mozc:contentDescription="@string/cd_key_uchar_space">
+ <Flick>
+ <KeyEntity mozc:sourceId="15"
+ mozc:keyCode="@integer/uchar_space"
+ mozc:longPressKeyCode="@integer/key_ime_picker_dialog"
+ mozc:keyIcon="@raw/twelvekeys__function__space__icon"
+ mozc:iconWidth="@dimen/unlimited"
+ mozc:iconHeight="@dimen/default_function_icon_height" />
+ </Flick>
+ </KeyState>
+ </Key>
+ </Row>
+ <Row>
+ <Key mozc:keyBackground="twelvekeysFunction"
+ mozc:keyHorizontalLayoutWeight="0" mozc:keyEdgeFlags="left">
+ <KeyState mozc:contentDescription="@string/cd_key_uchar_full_stop">
+ <Flick>
+ <KeyEntity mozc:sourceId="16"
+ mozc:keyCode="@integer/uchar_full_stop"
+ mozc:keyIcon="@raw/twelvekeys__number__function__full_stop" >
+ <PopUp mozc:popUpIcon="@raw/optional__twelvekeys__popup__full_stop" />
+ </KeyEntity>
+ </Flick>
+ </KeyState>
+ </Key>
+ <Spacer mozc:keyWidth="@dimen/keyboard_separator_width" mozc:keyHorizontalLayoutWeight="0"
+ mozc:keyBackground="keyboardSeparatorBottom"/>
+ <Key>
+ <KeyState mozc:contentDescription="@string/cd_key_uchar_asterisk">
+ <Flick>
+ <KeyEntity mozc:sourceId="17"
+ mozc:keyCode="@integer/uchar_asterisk"
+ mozc:keyIcon="@raw/twelvekeys__number__asterisk">
+ <PopUp mozc:popUpIcon="@raw/optional__twelvekeys__popup__asterisk" />
+ </KeyEntity>
+ </Flick>
+ </KeyState>
+ </Key>
+ <Key>
+ <KeyState mozc:contentDescription="@string/cd_key_uchar_digit_zero">
+ <Flick>
+ <KeyEntity mozc:sourceId="18"
+ mozc:keyCode="@integer/uchar_digit_zero"
+ mozc:keyIcon="@raw/twelvekeys__number__zero">
+ <PopUp mozc:popUpIcon="@raw/optional__twelvekeys__popup__zero" />
+ </KeyEntity>
+ </Flick>
+ </KeyState>
+ </Key>
+ <Key>
+ <KeyState mozc:contentDescription="@string/cd_key_uchar_number_sign">
+ <Flick>
+ <KeyEntity mozc:sourceId="19"
+ mozc:keyCode="@integer/uchar_number_sign"
+ mozc:keyIcon="@raw/twelvekeys__number__number_sign">
+ <PopUp mozc:popUpIcon="@raw/optional__twelvekeys__popup__number_sign" />
+ </KeyEntity>
+ </Flick>
+ </KeyState>
+ </Key>
+ <Spacer mozc:keyWidth="@dimen/keyboard_separator_width" mozc:keyHorizontalLayoutWeight="0"
+ mozc:keyBackground="keyboardSeparatorBottom"/>
+ <Key mozc:keyBackground="twelvekeysFunction"
+ mozc:keyHorizontalLayoutWeight="0" mozc:keyEdgeFlags="right"
+ mozc:defaultIconWidth="@dimen/keyboard_enter_width"
+ mozc:defaultIconHeight="@dimen/unlimited">
+ <KeyState mozc:contentDescription="@string/cd_key_uchar_linefeed">
+ <Flick>
+ <KeyEntity mozc:sourceId="20"
+ mozc:keyCode="@integer/uchar_linefeed"
+ mozc:keyIcon="@raw/function__enter__icon">
+ </KeyEntity>
+ </Flick>
+ </KeyState>
+ <KeyState mozc:contentDescription="@string/cd_key_composing_done"
+ mozc:metaState="composing">
+ <Flick>
+ <KeyEntity mozc:sourceId="21"
+ mozc:keyCode="@integer/uchar_linefeed"
+ mozc:keyIcon="@raw/function__enter__icon">
+ </KeyEntity>
+ </Flick>
+ </KeyState>
+ <KeyState mozc:contentDescription="@string/cd_key_action_done"
+ mozc:metaState="action_done">
+ <Flick>
+ <KeyEntity mozc:sourceId="22"
+ mozc:keyCode="@integer/uchar_linefeed"
+ mozc:keyIcon="@raw/function__action_done__icon">
+ </KeyEntity>
+ </Flick>
+ </KeyState>
+ <KeyState mozc:contentDescription="@string/cd_key_action_go"
+ mozc:metaState="action_go">
+ <Flick>
+ <KeyEntity mozc:sourceId="23"
+ mozc:keyCode="@integer/uchar_linefeed"
+ mozc:keyIcon="@raw/function__action_go__icon">
+ </KeyEntity>
+ </Flick>
+ </KeyState>
+ <KeyState mozc:contentDescription="@string/cd_key_action_next"
+ mozc:metaState="action_next">
+ <Flick>
+ <KeyEntity mozc:sourceId="24"
+ mozc:keyCode="@integer/uchar_linefeed"
+ mozc:keyIcon="@raw/function__action_next__icon">
+ </KeyEntity>
+ </Flick>
+ </KeyState>
+ <KeyState mozc:contentDescription="@string/cd_key_action_previous"
+ mozc:metaState="action_previous">
+ <Flick>
+ <KeyEntity mozc:sourceId="25"
+ mozc:keyCode="@integer/uchar_linefeed"
+ mozc:keyIcon="@raw/function__action_previous__icon">
+ </KeyEntity>
+ </Flick>
+ </KeyState>
+ <KeyState mozc:contentDescription="@string/cd_key_action_search"
+ mozc:metaState="action_search">
+ <Flick>
+ <KeyEntity mozc:sourceId="26"
+ mozc:keyCode="@integer/uchar_linefeed"
+ mozc:keyIcon="@raw/function__action_search__icon">
+ </KeyEntity>
+ </Flick>
+ </KeyState>
+ <KeyState mozc:contentDescription="@string/cd_key_action_send"
+ mozc:metaState="action_send">
+ <Flick>
+ <KeyEntity mozc:sourceId="27"
+ mozc:keyCode="@integer/uchar_linefeed"
+ mozc:keyIcon="@raw/function__action_send__icon">
+ </KeyEntity>
+ </Flick>
+ </KeyState>
+ </Key>
+ </Row>
+ <!-- Next sourceId: 28 -->
+</Keyboard>
diff --git a/src/android/static_resources/resources_oss/res/xml/kbd_12keys_123.xml b/src/android/static_resources/resources_oss/res/xml/kbd_12keys_123.xml
deleted file mode 100644
index cf52c20..0000000
--- a/src/android/static_resources/resources_oss/res/xml/kbd_12keys_123.xml
+++ /dev/null
@@ -1,280 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<Keyboard
- xmlns:mozc="http://schemas.android.com/apk/res-auto"
- mozc:keyboardContentDescription="@string/cd_keyboard_number"
- mozc:keyBackground="twelvekeysRegular"
- mozc:keyWidth="21.8%p" mozc:keyHeight="24%p"
- mozc:horizontalGap="0dip" mozc:verticalGap="0dip"
- mozc:popUpWidth="@dimen/key_preview_height" mozc:popUpHeight="@dimen/key_preview_height"
- mozc:popUpXOffset="0dip" mozc:popUpYOffset="@dimen/mini_keyboard_vertical_correction">
- <Row mozc:rowEdgeFlags="top" mozc:keyHeight="0dip" mozc:verticalGap="4%p" />
- <Row>
- <Key mozc:keyBackground="twelvekeysFunction"
- mozc:keyWidth="17.3%p" mozc:keyEdgeFlags="left">
- <KeyState mozc:contentDescription="@string/cd_key_undo">
- <Flick>
- <KeyEntity mozc:sourceId="1"
- mozc:keyCode="@integer/key_undo"
- mozc:keyIcon="@raw/twelvekeys__function__undo__icon">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__function__undo__popup" />
- </KeyEntity>
- </Flick>
- </KeyState>
- </Key>
- <Key>
- <KeyState mozc:contentDescription="@string/cd_key_uchar_digit_one">
- <Flick>
- <KeyEntity mozc:sourceId="2"
- mozc:keyCode="@integer/uchar_digit_one"
- mozc:keyIcon="@raw/twelvekeys__number__01">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__number__01" />
- </KeyEntity>
- </Flick>
- </KeyState>
- </Key>
- <Key>
- <KeyState mozc:contentDescription="@string/cd_key_uchar_digit_two">
- <Flick>
- <KeyEntity mozc:sourceId="3"
- mozc:keyCode="@integer/uchar_digit_two"
- mozc:keyIcon="@raw/twelvekeys__number__02">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__number__02" />
- </KeyEntity>
- </Flick>
- </KeyState>
- </Key>
- <Key>
- <KeyState mozc:contentDescription="@string/cd_key_uchar_digit_three">
- <Flick>
- <KeyEntity mozc:sourceId="4"
- mozc:keyCode="@integer/uchar_digit_three"
- mozc:keyIcon="@raw/twelvekeys__number__03">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__number__03" />
- </KeyEntity>
- </Flick>
- </KeyState>
- </Key>
- <Key mozc:keyBackground="twelvekeysFunction"
- mozc:keyWidth="17.3%p" mozc:keyEdgeFlags="right" mozc:isRepeatable="true">
- <KeyState mozc:contentDescription="@string/cd_key_uchar_backspace">
- <Flick>
- <KeyEntity mozc:sourceId="5"
- mozc:keyCode="@integer/key_backspace"
- mozc:keyIcon="@raw/twelvekeys__function__delete__icon">
- <PopUp mozc:popUpIcon="@raw/qwerty__function__delete__popup" />
- </KeyEntity>
- </Flick>
- </KeyState>
- </Key>
- </Row>
- <Row>
- <Key mozc:keyBackground="twelvekeysFunction"
- mozc:keyWidth="17.3%p" mozc:keyEdgeFlags="left" mozc:isRepeatable="true">
- <KeyState mozc:contentDescription="@string/cd_key_left">
- <Flick>
- <KeyEntity mozc:sourceId="6"
- mozc:keyCode="@integer/key_left"
- mozc:keyIcon="@raw/twelvekeys__function__left_arrow__icon">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__function__left_arrow__popup" />
- </KeyEntity>
- </Flick>
- </KeyState>
- </Key>
- <Key>
- <KeyState mozc:contentDescription="@string/cd_key_uchar_digit_four">
- <Flick>
- <KeyEntity mozc:sourceId="7"
- mozc:keyCode="@integer/uchar_digit_four"
- mozc:keyIcon="@raw/twelvekeys__number__04">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__number__04" />
- </KeyEntity>
- </Flick>
- </KeyState>
- </Key>
- <Key>
- <KeyState mozc:contentDescription="@string/cd_key_uchar_digit_five">
- <Flick>
- <KeyEntity mozc:sourceId="8"
- mozc:keyCode="@integer/uchar_digit_five"
- mozc:keyIcon="@raw/twelvekeys__number__05">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__number__05" />
- </KeyEntity>
- </Flick>
- </KeyState>
- </Key>
- <Key>
- <KeyState mozc:contentDescription="@string/cd_key_uchar_digit_six">
- <Flick>
- <KeyEntity mozc:sourceId="9"
- mozc:keyCode="@integer/uchar_digit_six"
- mozc:keyIcon="@raw/twelvekeys__number__06">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__number__06" />
- </KeyEntity>
- </Flick>
- </KeyState>
- </Key>
- <Key mozc:keyBackground="twelvekeysFunction"
- mozc:keyWidth="17.3%p" mozc:keyEdgeFlags="right" mozc:isRepeatable="true">
- <KeyState mozc:contentDescription="@string/cd_key_right">
- <Flick>
- <KeyEntity mozc:sourceId="10"
- mozc:keyCode="@integer/key_right"
- mozc:keyIcon="@raw/twelvekeys__function__right_arrow__icon">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__function__right_arrow__popup" />
- </KeyEntity>
- </Flick>
- </KeyState>
- </Key>
- </Row>
- <Row>
- <Key mozc:keyBackground="twelvekeysFunction"
- mozc:keyWidth="17.3%p" mozc:keyEdgeFlags="left">
- <KeyState mozc:contentDescription="@string/cd_key_symbol">
- <Flick>
- <KeyEntity mozc:sourceId="11"
- mozc:keyCode="@integer/key_symbol"
- mozc:keyIcon="@raw/twelvekeys__function__symbol__icon">
- <PopUp mozc:popUpIcon="@raw/qwerty__function__symbol__popup" />
- </KeyEntity>
- </Flick>
- </KeyState>
- </Key>
- <Key>
- <KeyState mozc:contentDescription="@string/cd_key_uchar_digit_seven">
- <Flick>
- <KeyEntity mozc:sourceId="12"
- mozc:keyCode="@integer/uchar_digit_seven"
- mozc:keyIcon="@raw/twelvekeys__number__07">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__number__07" />
- </KeyEntity>
- </Flick>
- </KeyState>
- </Key>
- <Key>
- <KeyState mozc:contentDescription="@string/cd_key_uchar_digit_eight">
- <Flick>
- <KeyEntity mozc:sourceId="13"
- mozc:keyCode="@integer/uchar_digit_eight"
- mozc:keyIcon="@raw/twelvekeys__number__08">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__number__08" />
- </KeyEntity>
- </Flick>
- </KeyState>
- </Key>
- <Key>
- <KeyState mozc:contentDescription="@string/cd_key_uchar_digit_nine">
- <Flick>
- <KeyEntity mozc:sourceId="14"
- mozc:keyCode="@integer/uchar_digit_nine"
- mozc:keyIcon="@raw/twelvekeys__number__09">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__number__09" />
- </KeyEntity>
- </Flick>
- </KeyState>
- </Key>
- <Key mozc:keyBackground="twelvekeysFunctionWithThreeDots"
- mozc:keyWidth="17.3%p" mozc:keyEdgeFlags="right">
- <KeyState mozc:contentDescription="@string/cd_key_uchar_space">
- <Flick>
- <KeyEntity mozc:sourceId="15"
- mozc:keyCode="@integer/uchar_space"
- mozc:longPressKeyCode="@integer/key_ime_picker_dialog"
- mozc:keyIcon="@raw/twelvekeys__function__space__icon">
- <PopUp mozc:popUpIcon="@raw/qwerty__function__space__popup" />
- </KeyEntity>
- </Flick>
- </KeyState>
- </Key>
- </Row>
- <Row>
- <Key mozc:keyBackground="twelvekeysFunctionWithThreeDots"
- mozc:keyWidth="17.3%p" mozc:keyEdgeFlags="left">
- <KeyState mozc:contentDescription="@string/cd_key_chartype_to_kana">
- <Flick>
- <KeyEntity mozc:sourceId="16"
- mozc:keyCode="@integer/key_chartype_to_kana"
- mozc:longPressKeyCode="@integer/key_menu_dialog"
- mozc:keyIcon="@raw/twelvekeys__function__number__icon">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__function__kana__popup" />
- </KeyEntity>
- </Flick>
- </KeyState>
- </Key>
- <Key>
- <KeyState mozc:contentDescription="@string/cd_key_uchar_solidus">
- <Flick>
- <KeyEntity mozc:sourceId="17"
- mozc:keyCode="@integer/uchar_asterisk"
- mozc:keyIcon="@raw/twelvekeys__number__10">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__number__10" />
- </KeyEntity>
- </Flick>
- </KeyState>
- </Key>
- <Key>
- <KeyState mozc:contentDescription="@string/cd_key_uchar_digit_zero">
- <Flick>
- <KeyEntity mozc:sourceId="18"
- mozc:keyCode="@integer/uchar_digit_zero"
- mozc:keyIcon="@raw/twelvekeys__number__11">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__number__11" />
- </KeyEntity>
- </Flick>
- </KeyState>
- </Key>
- <Key>
- <KeyState mozc:contentDescription="@string/cd_key_uchar_plus_sign">
- <Flick>
- <KeyEntity mozc:sourceId="19"
- mozc:keyCode="@integer/uchar_number_sign"
- mozc:keyIcon="@raw/twelvekeys__number__12">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__number__12" />
- </KeyEntity>
- </Flick>
- </KeyState>
- </Key>
- <Key mozc:keyBackground="twelvekeysFunction"
- mozc:keyWidth="17.3%p" mozc:keyEdgeFlags="right" mozc:isRepeatable="true">
- <KeyState mozc:contentDescription="@string/cd_key_uchar_linefeed">
- <Flick>
- <KeyEntity mozc:sourceId="20"
- mozc:keyCode="@integer/uchar_linefeed"
- mozc:keyIcon="@raw/twelvekeys__function__enter__icon">
- <PopUp mozc:popUpIcon="@raw/qwerty__function__enter__popup" />
- </KeyEntity>
- </Flick>
- </KeyState>
- </Key>
- </Row>
- <!-- Next sourceId: 21 -->
-</Keyboard>
diff --git a/src/android/static_resources/resources_oss/res/xml/kbd_12keys_abc.xml b/src/android/static_resources/resources_oss/res/xml/kbd_12keys_abc.xml
index ae8f7e2..16c7839 100644
--- a/src/android/static_resources/resources_oss/res/xml/kbd_12keys_abc.xml
+++ b/src/android/static_resources/resources_oss/res/xml/kbd_12keys_abc.xml
@@ -33,31 +33,34 @@
xmlns:mozc="http://schemas.android.com/apk/res-auto"
mozc:keyboardContentDescription="@string/cd_keyboard_alphabet"
mozc:keyBackground="twelvekeysRegular"
- mozc:keyWidth="21.8%p" mozc:keyHeight="24%p"
+ mozc:keyWidth="17.3%p" mozc:keyHeight="25%p" mozc:keyHorizontalLayoutWeight="1"
mozc:horizontalGap="0dip" mozc:verticalGap="0dip"
- mozc:popUpWidth="@dimen/key_preview_height" mozc:popUpHeight="@dimen/key_preview_height"
- mozc:popUpXOffset="0dip" mozc:popUpYOffset="@dimen/mini_keyboard_vertical_correction">
- <Row mozc:rowEdgeFlags="top" mozc:keyHeight="0dip" mozc:verticalGap="4%p" />
+ mozc:popUpHeight="@dimen/key_preview_height"
+ mozc:popUpIconHeight="@dimen/key_preview_icon_height"
+ mozc:popUpXOffset="0dip" mozc:popUpYOffset="@dimen/mini_keyboard_vertical_correction"
+ mozc:defaultIconWidth="@dimen/unlimited" mozc:defaultIconHeight="@dimen/keyboard_twelvekeys_default_height">
<Row>
<Key mozc:keyBackground="twelvekeysFunction"
- mozc:keyWidth="17.3%p" mozc:keyEdgeFlags="left">
+ mozc:keyHorizontalLayoutWeight="0" mozc:keyEdgeFlags="left">
<KeyState mozc:contentDescription="@string/cd_key_undo">
<Flick>
<KeyEntity mozc:sourceId="1"
mozc:keyCode="@integer/key_undo"
- mozc:keyIcon="@raw/twelvekeys__function__undo__icon">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__function__undo__popup" />
- </KeyEntity>
+ mozc:keyIcon="@raw/twelvekeys__function__undo__icon"
+ mozc:iconWidth="@dimen/unlimited"
+ mozc:iconHeight="@dimen/default_function_icon_height" />
</Flick>
</KeyState>
</Key>
+ <Spacer mozc:keyWidth="@dimen/keyboard_separator_width" mozc:keyHorizontalLayoutWeight="0"
+ mozc:keyBackground="keyboardSeparatorTop"/>
<Key>
<KeyState mozc:contentDescription="@string/cd_key_uchar_commercial_at">
<Flick>
<KeyEntity mozc:sourceId="2"
mozc:keyCode="@integer/uchar_digit_one"
mozc:keyIcon="@raw/twelvekeys__alphabet__01">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__alphabet__01" />
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__alphabet__popup__01" />
</KeyEntity>
</Flick>
</KeyState>
@@ -68,7 +71,7 @@
<KeyEntity mozc:sourceId="3"
mozc:keyCode="@integer/uchar_digit_two"
mozc:keyIcon="@raw/twelvekeys__alphabet__02">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__alphabet__02" />
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__alphabet__popup__02" />
</KeyEntity>
</Flick>
</KeyState>
@@ -79,44 +82,48 @@
<KeyEntity mozc:sourceId="4"
mozc:keyCode="@integer/uchar_digit_three"
mozc:keyIcon="@raw/twelvekeys__alphabet__03">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__alphabet__03" />
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__alphabet__popup__03" />
</KeyEntity>
</Flick>
</KeyState>
</Key>
+ <Spacer mozc:keyWidth="@dimen/keyboard_separator_width" mozc:keyHorizontalLayoutWeight="0"
+ mozc:keyBackground="keyboardSeparatorTop"/>
<Key mozc:keyBackground="twelvekeysFunction"
- mozc:keyWidth="17.3%p" mozc:keyEdgeFlags="right" mozc:isRepeatable="true">
+ mozc:keyHorizontalLayoutWeight="0" mozc:keyEdgeFlags="right" mozc:isRepeatable="true">
<KeyState mozc:contentDescription="@string/cd_key_uchar_backspace">
<Flick>
<KeyEntity mozc:sourceId="5"
mozc:keyCode="@integer/key_backspace"
- mozc:keyIcon="@raw/twelvekeys__function__delete__icon">
- <PopUp mozc:popUpIcon="@raw/qwerty__function__delete__popup" />
- </KeyEntity>
+ mozc:keyIcon="@raw/twelvekeys__function__delete__icon"
+ mozc:iconWidth="@dimen/unlimited"
+ mozc:iconHeight="@dimen/default_function_icon_height" />
</Flick>
</KeyState>
</Key>
</Row>
<Row>
<Key mozc:keyBackground="twelvekeysFunction"
- mozc:keyWidth="17.3%p" mozc:keyEdgeFlags="left" mozc:isRepeatable="true">
+ mozc:keyHorizontalLayoutWeight="0" mozc:keyEdgeFlags="left" mozc:isRepeatable="true">
<KeyState mozc:contentDescription="@string/cd_key_left">
<Flick>
<KeyEntity mozc:sourceId="6"
mozc:keyCode="@integer/key_left"
- mozc:keyIcon="@raw/twelvekeys__function__left_arrow__icon">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__function__left_arrow__popup" />
- </KeyEntity>
+ mozc:keyIcon="@raw/twelvekeys__function__left_arrow__icon"
+ mozc:iconWidth="@dimen/unlimited"
+ mozc:iconHeight="@dimen/default_function_icon_height" />
</Flick>
</KeyState>
</Key>
+ <Spacer mozc:keyWidth="@dimen/keyboard_separator_width" mozc:keyHorizontalLayoutWeight="0"
+ mozc:keyBackground="keyboardSeparatorCenter"/>
<Key>
<KeyState mozc:contentDescription="@string/cd_key_alphabet_ghi">
<Flick>
<KeyEntity mozc:sourceId="7"
mozc:keyCode="@integer/uchar_digit_four"
mozc:keyIcon="@raw/twelvekeys__alphabet__04">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__alphabet__04" />
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__alphabet__popup__04" />
</KeyEntity>
</Flick>
</KeyState>
@@ -127,7 +134,7 @@
<KeyEntity mozc:sourceId="8"
mozc:keyCode="@integer/uchar_digit_five"
mozc:keyIcon="@raw/twelvekeys__alphabet__05">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__alphabet__05" />
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__alphabet__popup__05" />
</KeyEntity>
</Flick>
</KeyState>
@@ -138,44 +145,56 @@
<KeyEntity mozc:sourceId="9"
mozc:keyCode="@integer/uchar_digit_six"
mozc:keyIcon="@raw/twelvekeys__alphabet__06">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__alphabet__06" />
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__alphabet__popup__06" />
</KeyEntity>
</Flick>
</KeyState>
</Key>
+ <Spacer mozc:keyWidth="@dimen/keyboard_separator_width" mozc:keyHorizontalLayoutWeight="0"
+ mozc:keyBackground="keyboardSeparatorCenter"/>
<Key mozc:keyBackground="twelvekeysFunction"
- mozc:keyWidth="17.3%p" mozc:keyEdgeFlags="right" mozc:isRepeatable="true">
+ mozc:keyHorizontalLayoutWeight="0" mozc:keyEdgeFlags="right" mozc:isRepeatable="true">
<KeyState mozc:contentDescription="@string/cd_key_right">
<Flick>
<KeyEntity mozc:sourceId="10"
mozc:keyCode="@integer/key_right"
- mozc:keyIcon="@raw/twelvekeys__function__right_arrow__icon">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__function__right_arrow__popup" />
- </KeyEntity>
+ mozc:keyIcon="@raw/twelvekeys__function__right_arrow__icon"
+ mozc:iconWidth="@dimen/unlimited"
+ mozc:iconHeight="@dimen/default_function_icon_height" />
</Flick>
</KeyState>
</Key>
</Row>
<Row>
<Key mozc:keyBackground="twelvekeysFunction"
- mozc:keyWidth="17.3%p" mozc:keyEdgeFlags="left">
+ mozc:keyHorizontalLayoutWeight="0" mozc:keyEdgeFlags="left">
<KeyState mozc:contentDescription="@string/cd_key_symbol">
<Flick>
<KeyEntity mozc:sourceId="11"
mozc:keyCode="@integer/key_symbol"
- mozc:keyIcon="@raw/twelvekeys__function__symbol__icon">
- <PopUp mozc:popUpIcon="@raw/qwerty__function__symbol__popup" />
- </KeyEntity>
+ mozc:keyIcon="@raw/twelvekeys__function__symbol__icon"
+ mozc:iconWidth="@dimen/unlimited"
+ mozc:iconHeight="@dimen/default_function_icon_height" />
+ </Flick>
+ </KeyState>
+ <KeyState mozc:contentDescription="@string/cd_key_symbol" mozc:metaState="handling_touch_event">
+ <Flick>
+ <KeyEntity mozc:sourceId="28"
+ mozc:keyIcon="@raw/twelvekeys__function__symbol__icon"
+ mozc:iconWidth="@dimen/unlimited"
+ mozc:iconHeight="@dimen/default_function_icon_height" />
</Flick>
</KeyState>
</Key>
+ <Spacer mozc:keyWidth="@dimen/keyboard_separator_width" mozc:keyHorizontalLayoutWeight="0"
+ mozc:keyBackground="keyboardSeparatorCenter"/>
<Key>
<KeyState mozc:contentDescription="@string/cd_key_alphabet_pqrs">
<Flick>
<KeyEntity mozc:sourceId="12"
mozc:keyCode="@integer/uchar_digit_seven"
mozc:keyIcon="@raw/twelvekeys__alphabet__07">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__alphabet__07" />
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__alphabet__popup__07" />
</KeyEntity>
</Flick>
</KeyState>
@@ -186,7 +205,7 @@
<KeyEntity mozc:sourceId="13"
mozc:keyCode="@integer/uchar_digit_eight"
mozc:keyIcon="@raw/twelvekeys__alphabet__08">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__alphabet__08" />
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__alphabet__popup__08" />
</KeyEntity>
</Flick>
</KeyState>
@@ -197,46 +216,50 @@
<KeyEntity mozc:sourceId="14"
mozc:keyCode="@integer/uchar_digit_nine"
mozc:keyIcon="@raw/twelvekeys__alphabet__09">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__alphabet__09" />
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__alphabet__popup__09" />
</KeyEntity>
</Flick>
</KeyState>
</Key>
+ <Spacer mozc:keyWidth="@dimen/keyboard_separator_width" mozc:keyHorizontalLayoutWeight="0"
+ mozc:keyBackground="keyboardSeparatorCenter"/>
<Key mozc:keyBackground="twelvekeysFunctionWithThreeDots"
- mozc:keyWidth="17.3%p" mozc:keyEdgeFlags="right">
+ mozc:keyHorizontalLayoutWeight="0" mozc:keyEdgeFlags="right">
<KeyState mozc:contentDescription="@string/cd_key_uchar_space">
<Flick>
<KeyEntity mozc:sourceId="15"
mozc:keyCode="@integer/uchar_space"
mozc:longPressKeyCode="@integer/key_ime_picker_dialog"
- mozc:keyIcon="@raw/twelvekeys__function__space__icon">
- <PopUp mozc:popUpIcon="@raw/qwerty__function__space__popup" />
- </KeyEntity>
+ mozc:keyIcon="@raw/twelvekeys__function__space__icon"
+ mozc:iconWidth="@dimen/unlimited"
+ mozc:iconHeight="@dimen/default_function_icon_height" />
</Flick>
</KeyState>
</Key>
</Row>
<Row>
<Key mozc:keyBackground="twelvekeysFunctionWithThreeDots"
- mozc:keyWidth="17.3%p" mozc:keyEdgeFlags="left">
- <KeyState mozc:contentDescription="@string/cd_key_chartype_to_123">
+ mozc:keyHorizontalLayoutWeight="0" mozc:keyEdgeFlags="left">
+ <KeyState mozc:contentDescription="@string/cd_key_chartype_to_kana">
<Flick>
<KeyEntity mozc:sourceId="16"
- mozc:keyCode="@integer/key_chartype_to_123"
+ mozc:keyCode="@integer/key_chartype_to_kana"
mozc:longPressKeyCode="@integer/key_menu_dialog"
- mozc:keyIcon="@raw/twelvekeys__function__alphabet__icon">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__function__number__popup" />
- </KeyEntity>
+ mozc:keyIcon="@raw/twelvekeys__function__alphabet__icon"
+ mozc:iconWidth="@dimen/unlimited"
+ mozc:iconHeight="@dimen/default_function_icon_height" />
</Flick>
</KeyState>
</Key>
+ <Spacer mozc:keyWidth="@dimen/keyboard_separator_width" mozc:keyHorizontalLayoutWeight="0"
+ mozc:keyBackground="keyboardSeparatorBottom"/>
<Key>
<KeyState mozc:contentDescription="@string/cd_key_alphabet_capitalize">
<Flick>
<KeyEntity mozc:sourceId="17"
mozc:keyCode="@integer/uchar_asterisk"
mozc:keyIcon="@raw/twelvekeys__alphabet__10">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__alphabet__10" />
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__alphabet__popup__10" />
</KeyEntity>
</Flick>
</KeyState>
@@ -247,7 +270,7 @@
<KeyEntity mozc:sourceId="18"
mozc:keyCode="@integer/uchar_digit_zero"
mozc:keyIcon="@raw/twelvekeys__alphabet__11">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__alphabet__11" />
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__alphabet__popup__11" />
</KeyEntity>
</Flick>
</KeyState>
@@ -258,23 +281,121 @@
<KeyEntity mozc:sourceId="19"
mozc:keyCode="@integer/uchar_number_sign"
mozc:keyIcon="@raw/twelvekeys__alphabet__12">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__alphabet__12" />
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__alphabet__popup__12" />
</KeyEntity>
</Flick>
</KeyState>
</Key>
- <Key mozc:keyBackground="twelvekeysFunction"
- mozc:keyWidth="17.3%p" mozc:keyEdgeFlags="right" mozc:isRepeatable="true">
+ <Spacer mozc:keyWidth="@dimen/keyboard_separator_width" mozc:keyHorizontalLayoutWeight="0"
+ mozc:keyBackground="keyboardSeparatorBottom"/>
+ <Key mozc:keyBackground="twelvekeysFunctionWithThreeDots"
+ mozc:keyHorizontalLayoutWeight="0" mozc:keyEdgeFlags="right"
+ mozc:defaultIconWidth="@dimen/keyboard_enter_width"
+ mozc:defaultIconHeight="@dimen/unlimited">
<KeyState mozc:contentDescription="@string/cd_key_uchar_linefeed">
<Flick>
<KeyEntity mozc:sourceId="20"
mozc:keyCode="@integer/uchar_linefeed"
- mozc:keyIcon="@raw/twelvekeys__function__enter__icon">
- <PopUp mozc:popUpIcon="@raw/qwerty__function__enter__popup" />
+ mozc:longPressKeyCode="@integer/key_symbol_emoji"
+ mozc:longPressTimeoutTrigger="false"
+ mozc:keyIcon="@raw/function__enter__icon">
+ <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+ mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
+ </KeyEntity>
+ </Flick>
+ </KeyState>
+ <KeyState mozc:contentDescription="@string/cd_key_composing_done"
+ mozc:metaState="composing">
+ <Flick>
+ <KeyEntity mozc:sourceId="21"
+ mozc:keyCode="@integer/uchar_linefeed"
+ mozc:longPressKeyCode="@integer/key_symbol_emoji"
+ mozc:longPressTimeoutTrigger="false"
+ mozc:keyIcon="@raw/function__enter__icon">
+ <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+ mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
+ </KeyEntity>
+ </Flick>
+ </KeyState>
+ <KeyState mozc:contentDescription="@string/cd_key_action_done"
+ mozc:metaState="action_done">
+ <Flick>
+ <KeyEntity mozc:sourceId="22"
+ mozc:keyCode="@integer/uchar_linefeed"
+ mozc:longPressKeyCode="@integer/key_symbol_emoji"
+ mozc:longPressTimeoutTrigger="false"
+ mozc:keyIcon="@raw/function__action_done__icon">
+ <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+ mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
+ </KeyEntity>
+ </Flick>
+ </KeyState>
+ <KeyState mozc:contentDescription="@string/cd_key_action_go"
+ mozc:metaState="action_go">
+ <Flick>
+ <KeyEntity mozc:sourceId="23"
+ mozc:keyCode="@integer/uchar_linefeed"
+ mozc:longPressKeyCode="@integer/key_symbol_emoji"
+ mozc:longPressTimeoutTrigger="false"
+ mozc:keyIcon="@raw/function__action_go__icon">
+ <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+ mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
+ </KeyEntity>
+ </Flick>
+ </KeyState>
+ <KeyState mozc:contentDescription="@string/cd_key_action_next"
+ mozc:metaState="action_next">
+ <Flick>
+ <KeyEntity mozc:sourceId="24"
+ mozc:keyCode="@integer/uchar_linefeed"
+ mozc:longPressKeyCode="@integer/key_symbol_emoji"
+ mozc:longPressTimeoutTrigger="false"
+ mozc:keyIcon="@raw/function__action_next__icon">
+ <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+ mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
+ </KeyEntity>
+ </Flick>
+ </KeyState>
+ <KeyState mozc:contentDescription="@string/cd_key_action_previous"
+ mozc:metaState="action_previous">
+ <Flick>
+ <KeyEntity mozc:sourceId="25"
+ mozc:keyCode="@integer/uchar_linefeed"
+ mozc:longPressKeyCode="@integer/key_symbol_emoji"
+ mozc:longPressTimeoutTrigger="false"
+ mozc:keyIcon="@raw/function__action_previous__icon">
+ <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+ mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
+ </KeyEntity>
+ </Flick>
+ </KeyState>
+ <KeyState mozc:contentDescription="@string/cd_key_action_search"
+ mozc:metaState="action_search">
+ <Flick>
+ <KeyEntity mozc:sourceId="26"
+ mozc:keyCode="@integer/uchar_linefeed"
+ mozc:longPressKeyCode="@integer/key_symbol_emoji"
+ mozc:longPressTimeoutTrigger="false"
+ mozc:keyIcon="@raw/function__action_search__icon">
+ <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+ mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
+ </KeyEntity>
+ </Flick>
+ </KeyState>
+ <KeyState mozc:contentDescription="@string/cd_key_action_send"
+ mozc:metaState="action_send">
+ <Flick>
+ <KeyEntity mozc:sourceId="27"
+ mozc:keyCode="@integer/uchar_linefeed"
+ mozc:longPressKeyCode="@integer/key_symbol_emoji"
+ mozc:longPressTimeoutTrigger="false"
+ mozc:keyIcon="@raw/function__action_send__icon">
+ <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+ mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
</KeyEntity>
</Flick>
</KeyState>
</Key>
</Row>
- <!-- Next sourceId: 21 -->
+ <!-- Next sourceId: 29 -->
</Keyboard>
diff --git a/src/android/static_resources/resources_oss/res/xml/kbd_12keys_flick_123.xml b/src/android/static_resources/resources_oss/res/xml/kbd_12keys_flick_123.xml
deleted file mode 100644
index b624ec4..0000000
--- a/src/android/static_resources/resources_oss/res/xml/kbd_12keys_flick_123.xml
+++ /dev/null
@@ -1,342 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
- <!--
- The current keycode mapping to flick direction and tapping action is as follows;
- +===========+===========+===========+
- | | | |
- | '1' | '2' | '3' |
- | | | |
- +===========+===========+===========+
- | | | |
- | '4' | '5' | '6' |
- | | | |
- +===========+===========+===========+
- | | | |
- | '7' | '8' | '9' |
- | | | |
- +===========+===========+===========+
- | '.' | | '=' |
- |'~' '/' '*'| '0' |'-' '+' '#'|
- | | | |
- +===========+===========+===========+
- -->
-<Keyboard
- xmlns:mozc="http://schemas.android.com/apk/res-auto"
- mozc:keyboardContentDescription="@string/cd_keyboard_number"
- mozc:keyBackground="twelvekeysRegular"
- mozc:keyWidth="21.8%p" mozc:keyHeight="24%p"
- mozc:horizontalGap="0dip" mozc:verticalGap="0dip"
- mozc:popUpWidth="@dimen/key_preview_height" mozc:popUpHeight="@dimen/key_preview_height"
- mozc:popUpXOffset="0dip" mozc:popUpYOffset="@dimen/mini_keyboard_vertical_correction">
- <Row mozc:rowEdgeFlags="top" mozc:keyHeight="0dip" mozc:verticalGap="4%p" />
- <Row>
- <Key mozc:keyBackground="twelvekeysFunction"
- mozc:keyWidth="17.3%p" mozc:keyEdgeFlags="left">
- <KeyState mozc:contentDescription="@string/cd_key_undo">
- <Flick>
- <KeyEntity mozc:sourceId="1"
- mozc:keyCode="@integer/key_undo"
- mozc:keyIcon="@raw/twelvekeys__function__undo__icon">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__function__undo__popup" />
- </KeyEntity>
- </Flick>
- </KeyState>
- </Key>
- <Key>
- <KeyState mozc:contentDescription="@string/cd_key_uchar_digit_one">
- <Flick>
- <KeyEntity mozc:sourceId="2"
- mozc:keyCode="@integer/uchar_digit_one"
- mozc:keyIcon="@raw/twelvekeys__number__01">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__number__01" />
- </KeyEntity>
- </Flick>
- </KeyState>
- </Key>
- <Key>
- <KeyState mozc:contentDescription="@string/cd_key_uchar_digit_two">
- <Flick>
- <KeyEntity mozc:sourceId="3"
- mozc:keyCode="@integer/uchar_digit_two"
- mozc:keyIcon="@raw/twelvekeys__number__02">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__number__02" />
- </KeyEntity>
- </Flick>
- </KeyState>
- </Key>
- <Key>
- <KeyState mozc:contentDescription="@string/cd_key_uchar_digit_three">
- <Flick>
- <KeyEntity mozc:sourceId="4"
- mozc:keyCode="@integer/uchar_digit_three"
- mozc:keyIcon="@raw/twelvekeys__number__03">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__number__03" />
- </KeyEntity>
- </Flick>
- </KeyState>
- </Key>
- <Key mozc:keyBackground="twelvekeysFunction"
- mozc:keyWidth="17.3%p" mozc:keyEdgeFlags="right" mozc:isRepeatable="true">
- <KeyState mozc:contentDescription="@string/cd_key_uchar_backspace">
- <Flick>
- <KeyEntity mozc:sourceId="5"
- mozc:keyCode="@integer/key_backspace"
- mozc:keyIcon="@raw/twelvekeys__function__delete__icon">
- <PopUp mozc:popUpIcon="@raw/qwerty__function__delete__popup" />
- </KeyEntity>
- </Flick>
- </KeyState>
- </Key>
- </Row>
- <Row>
- <Key mozc:keyBackground="twelvekeysFunction"
- mozc:keyWidth="17.3%p" mozc:keyEdgeFlags="left" mozc:isRepeatable="true">
- <KeyState mozc:contentDescription="@string/cd_key_left">
- <Flick>
- <KeyEntity mozc:sourceId="6"
- mozc:keyCode="@integer/key_left"
- mozc:keyIcon="@raw/twelvekeys__function__left_arrow__icon">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__function__left_arrow__popup" />
- </KeyEntity>
- </Flick>
- </KeyState>
- </Key>
- <Key>
- <KeyState mozc:contentDescription="@string/cd_key_uchar_digit_four">
- <Flick>
- <KeyEntity mozc:sourceId="7"
- mozc:keyCode="@integer/uchar_digit_four"
- mozc:keyIcon="@raw/twelvekeys__number__04">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__number__04" />
- </KeyEntity>
- </Flick>
- </KeyState>
- </Key>
- <Key>
- <KeyState mozc:contentDescription="@string/cd_key_uchar_digit_five">
- <Flick>
- <KeyEntity mozc:sourceId="8"
- mozc:keyCode="@integer/uchar_digit_five"
- mozc:keyIcon="@raw/twelvekeys__number__05">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__number__05" />
- </KeyEntity>
- </Flick>
- </KeyState>
- </Key>
- <Key>
- <KeyState mozc:contentDescription="@string/cd_key_uchar_digit_six">
- <Flick>
- <KeyEntity mozc:sourceId="9"
- mozc:keyCode="@integer/uchar_digit_six"
- mozc:keyIcon="@raw/twelvekeys__number__06">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__number__06" />
- </KeyEntity>
- </Flick>
- </KeyState>
- </Key>
- <Key mozc:keyBackground="twelvekeysFunction"
- mozc:keyWidth="17.3%p" mozc:keyEdgeFlags="right" mozc:isRepeatable="true">
- <KeyState mozc:contentDescription="@string/cd_key_right">
- <Flick>
- <KeyEntity mozc:sourceId="10"
- mozc:keyCode="@integer/key_right"
- mozc:keyIcon="@raw/twelvekeys__function__right_arrow__icon">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__function__right_arrow__popup" />
- </KeyEntity>
- </Flick>
- </KeyState>
- </Key>
- </Row>
- <Row>
- <Key mozc:keyBackground="twelvekeysFunction"
- mozc:keyWidth="17.3%p" mozc:keyEdgeFlags="left">
- <KeyState mozc:contentDescription="@string/cd_key_symbol">
- <Flick>
- <KeyEntity mozc:sourceId="11"
- mozc:keyCode="@integer/key_symbol"
- mozc:keyIcon="@raw/twelvekeys__function__symbol__icon">
- <PopUp mozc:popUpIcon="@raw/qwerty__function__symbol__popup" />
- </KeyEntity>
- </Flick>
- </KeyState>
- </Key>
- <Key>
- <KeyState mozc:contentDescription="@string/cd_key_uchar_digit_seven">
- <Flick>
- <KeyEntity mozc:sourceId="12"
- mozc:keyCode="@integer/uchar_digit_seven"
- mozc:keyIcon="@raw/twelvekeys__number__07">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__number__07" />
- </KeyEntity>
- </Flick>
- </KeyState>
- </Key>
- <Key>
- <KeyState mozc:contentDescription="@string/cd_key_uchar_digit_eight">
- <Flick>
- <KeyEntity mozc:sourceId="13"
- mozc:keyCode="@integer/uchar_digit_eight"
- mozc:keyIcon="@raw/twelvekeys__number__08">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__number__08" />
- </KeyEntity>
- </Flick>
- </KeyState>
- </Key>
- <Key>
- <KeyState mozc:contentDescription="@string/cd_key_uchar_digit_nine">
- <Flick>
- <KeyEntity mozc:sourceId="14"
- mozc:keyCode="@integer/uchar_digit_nine"
- mozc:keyIcon="@raw/twelvekeys__number__09">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__number__09" />
- </KeyEntity>
- </Flick>
- </KeyState>
- </Key>
- <Key mozc:keyBackground="twelvekeysFunctionWithThreeDots"
- mozc:keyWidth="17.3%p" mozc:keyEdgeFlags="right">
- <KeyState mozc:contentDescription="@string/cd_key_uchar_space">
- <Flick>
- <KeyEntity mozc:sourceId="15"
- mozc:keyCode="@integer/uchar_space"
- mozc:longPressKeyCode="@integer/key_ime_picker_dialog"
- mozc:keyIcon="@raw/twelvekeys__function__space__icon">
- <PopUp mozc:popUpIcon="@raw/qwerty__function__space__popup" />
- </KeyEntity>
- </Flick>
- </KeyState>
- </Key>
- </Row>
- <Row>
- <Key mozc:keyBackground="twelvekeysFunctionWithThreeDots"
- mozc:keyWidth="17.3%p" mozc:keyEdgeFlags="left">
- <KeyState mozc:contentDescription="@string/cd_key_chartype_to_kana">
- <Flick>
- <KeyEntity mozc:sourceId="16"
- mozc:keyCode="@integer/key_chartype_to_kana"
- mozc:longPressKeyCode="@integer/key_menu_dialog"
- mozc:keyIcon="@raw/twelvekeys__function__number__icon">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__function__kana__popup" />
- </KeyEntity>
- </Flick>
- </KeyState>
- </Key>
- <Key>
- <KeyState mozc:contentDescription="@string/cd_key_uchar_solidus">
- <Flick>
- <KeyEntity mozc:sourceId="17"
- mozc:keyCode="@integer/uchar_solidus"
- mozc:keyIcon="@raw/twelvekeys__number__10">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__number__support__popup__10" />
- </KeyEntity>
- </Flick>
- <Flick mozc:direction="left">
- <KeyEntity mozc:sourceId="18"
- mozc:keyCode="@integer/uchar_tilde"
- mozc:keyIcon="@raw/twelvekeys__number__10">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__tilde" />
- </KeyEntity>
- </Flick>
- <Flick mozc:direction="up">
- <KeyEntity mozc:sourceId="19"
- mozc:keyCode="@integer/uchar_full_stop"
- mozc:keyIcon="@raw/twelvekeys__number__10">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__full_stop" />
- </KeyEntity>
- </Flick>
- <Flick mozc:direction="right">
- <KeyEntity mozc:sourceId="20"
- mozc:keyCode="@integer/uchar_asterisk"
- mozc:keyIcon="@raw/twelvekeys__number__10">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__asterisk" />
- </KeyEntity>
- </Flick>
- </KeyState>
- </Key>
- <Key>
- <KeyState mozc:contentDescription="@string/cd_key_uchar_digit_zero">
- <Flick>
- <KeyEntity mozc:sourceId="21"
- mozc:keyCode="@integer/uchar_digit_zero"
- mozc:keyIcon="@raw/twelvekeys__number__11">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__number__11" />
- </KeyEntity>
- </Flick>
- </KeyState>
- </Key>
- <Key>
- <KeyState mozc:contentDescription="@string/cd_key_uchar_plus_sign">
- <Flick>
- <KeyEntity mozc:sourceId="22"
- mozc:keyCode="@integer/uchar_plus_sign"
- mozc:keyIcon="@raw/twelvekeys__number__12">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__number__support__popup__12" />
- </KeyEntity>
- </Flick>
- <Flick mozc:direction="left">
- <KeyEntity mozc:sourceId="23"
- mozc:keyCode="@integer/uchar_hyphen_minus"
- mozc:keyIcon="@raw/twelvekeys__number__12">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__minus_sign" />
- </KeyEntity>
- </Flick>
- <Flick mozc:direction="up">
- <KeyEntity mozc:sourceId="24"
- mozc:keyCode="@integer/uchar_equals_sign"
- mozc:keyIcon="@raw/twelvekeys__number__12">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__equals_sign" />
- </KeyEntity>
- </Flick>
- <Flick mozc:direction="right">
- <KeyEntity mozc:sourceId="25"
- mozc:keyCode="@integer/uchar_number_sign"
- mozc:keyIcon="@raw/twelvekeys__number__12">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__number_sign" />
- </KeyEntity>
- </Flick>
- </KeyState>
- </Key>
- <Key mozc:keyBackground="twelvekeysFunction"
- mozc:keyWidth="17.3%p" mozc:keyEdgeFlags="right" mozc:isRepeatable="true">
- <KeyState mozc:contentDescription="@string/cd_key_uchar_linefeed">
- <Flick>
- <KeyEntity mozc:sourceId="26"
- mozc:keyCode="@integer/uchar_linefeed"
- mozc:keyIcon="@raw/twelvekeys__function__enter__icon">
- <PopUp mozc:popUpIcon="@raw/qwerty__function__enter__popup" />
- </KeyEntity>
- </Flick>
- </KeyState>
- </Key>
- </Row>
- <!-- Next sourceId: 27 -->
-</Keyboard>
diff --git a/src/android/static_resources/resources_oss/res/xml/kbd_12keys_flick_abc.xml b/src/android/static_resources/resources_oss/res/xml/kbd_12keys_flick_abc.xml
index 8653eca..fa9a01b 100644
--- a/src/android/static_resources/resources_oss/res/xml/kbd_12keys_flick_abc.xml
+++ b/src/android/static_resources/resources_oss/res/xml/kbd_12keys_flick_abc.xml
@@ -34,19 +34,19 @@
+===========+===========+===========+
| '_' | 'c' | 'f' |
|'-' '1' '/'|'b' '2' |'e' '3' |
- | '&' | | |
+ | '@' | '|' | '~' |
+===========+===========+===========+
| 'i' | 'l' | 'o' |
|'h' '4' |'k' '5' |'n' '6' |
- | | | |
+ | '$' | '%' | '&' |
+===========+===========+===========+
| 'r' | 'v' | 'y' |
|'q' '7' 's'|'u' '8' |'x' '9' 'z'|
- | | | |
+ | '<' | '^' | '>' |
+===========+===========+===========+
| | ':' | '?' |
| '*' |'"' '0' ';'|',' '.' '!'|
- | | | |
+ | | '#' | |
+===========+===========+===========+
-->
<!-- TODO(matsuzakit): Use icons for flick mode. Currently toggle mode's are used. -->
@@ -54,59 +54,63 @@
xmlns:mozc="http://schemas.android.com/apk/res-auto"
mozc:keyboardContentDescription="@string/cd_keyboard_alphabet"
mozc:keyBackground="twelvekeysRegular"
- mozc:keyWidth="21.8%p" mozc:keyHeight="24%p"
+ mozc:keyWidth="17.3%p" mozc:keyHeight="25%p" mozc:keyHorizontalLayoutWeight="1"
mozc:horizontalGap="0dip" mozc:verticalGap="0dip"
- mozc:popUpWidth="@dimen/key_preview_height" mozc:popUpHeight="@dimen/key_preview_height"
- mozc:popUpXOffset="0dip" mozc:popUpYOffset="@dimen/mini_keyboard_vertical_correction">
- <Row mozc:rowEdgeFlags="top" mozc:keyHeight="0dip" mozc:verticalGap="4%p" />
+ mozc:popUpHeight="@dimen/key_preview_height"
+ mozc:popUpIconHeight="@dimen/key_preview_icon_height"
+ mozc:popUpXOffset="0dip" mozc:popUpYOffset="@dimen/mini_keyboard_vertical_correction"
+ mozc:defaultIconWidth="@dimen/unlimited" mozc:defaultIconHeight="@dimen/keyboard_twelvekeys_default_height">
<Row>
<Key mozc:keyBackground="twelvekeysFunction"
- mozc:keyWidth="17.3%p" mozc:keyEdgeFlags="left">
+ mozc:keyHorizontalLayoutWeight="0" mozc:keyEdgeFlags="left">
<KeyState mozc:contentDescription="@string/cd_key_undo">
<Flick>
<KeyEntity mozc:sourceId="1"
mozc:keyCode="@integer/key_undo"
- mozc:keyIcon="@raw/twelvekeys__function__undo__icon">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__function__undo__popup" />
- </KeyEntity>
+ mozc:keyIcon="@raw/twelvekeys__function__undo__icon"
+ mozc:iconWidth="@dimen/unlimited"
+ mozc:iconHeight="@dimen/default_function_icon_height" />
</Flick>
</KeyState>
</Key>
+ <Spacer mozc:keyWidth="@dimen/keyboard_separator_width" mozc:keyHorizontalLayoutWeight="0"
+ mozc:keyBackground="keyboardSeparatorTop"/>
<Key>
<KeyState mozc:contentDescription="@string/cd_key_uchar_commercial_at">
<Flick>
<KeyEntity mozc:sourceId="2"
mozc:keyCode="@integer/uchar_digit_one"
- mozc:keyIcon="@raw/twelvekeys__alphabet__01">
+ mozc:keyIcon="@raw/twelvekeys__alphabet__support__01_center">
<PopUp mozc:popUpIcon="@raw/twelvekeys__alphabet__support__popup__01"/>
</KeyEntity>
</Flick>
<Flick mozc:direction="left">
<KeyEntity mozc:sourceId="3"
mozc:keyCode="@integer/uchar_hyphen_minus"
- mozc:keyIcon="@raw/twelvekeys__alphabet__01">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__hyphen_minus"/>
+ mozc:keyIcon="@raw/twelvekeys__alphabet__support__01_center">
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__hyphen_minus"/>
</KeyEntity>
</Flick>
<Flick mozc:direction="up">
<KeyEntity mozc:sourceId="4"
mozc:keyCode="@integer/uchar_low_line"
- mozc:keyIcon="@raw/twelvekeys__alphabet__01">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__low_line"/>
+ mozc:keyIcon="@raw/twelvekeys__alphabet__support__01_center">
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__low_line"/>
</KeyEntity>
</Flick>
<Flick mozc:direction="right">
<KeyEntity mozc:sourceId="5"
mozc:keyCode="@integer/uchar_solidus"
- mozc:keyIcon="@raw/twelvekeys__alphabet__01">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__solidus"/>
+ mozc:keyIcon="@raw/twelvekeys__alphabet__support__01_center">
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__solidus"/>
</KeyEntity>
</Flick>
<Flick mozc:direction="down">
<KeyEntity mozc:sourceId="6"
- mozc:keyCode="@integer/uchar_ampersand"
- mozc:keyIcon="@raw/twelvekeys__alphabet__01">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__ampersand"/>
+ mozc:keyCode="@integer/uchar_commercial_at"
+ mozc:keyIcon="@raw/twelvekeys__alphabet__support__01_down"
+ mozc:flickHighlight="true">
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__number__one"/>
</KeyEntity>
</Flick>
</KeyState>
@@ -116,22 +120,30 @@
<Flick>
<KeyEntity mozc:sourceId="7"
mozc:keyCode="@integer/uchar_digit_two"
- mozc:keyIcon="@raw/twelvekeys__alphabet__02">
+ mozc:keyIcon="@raw/twelvekeys__alphabet__support__02_center">
<PopUp mozc:popUpIcon="@raw/twelvekeys__alphabet__support__popup__02" />
</KeyEntity>
</Flick>
<Flick mozc:direction="left">
<KeyEntity mozc:sourceId="8"
mozc:keyCode="@integer/uchar_latin_small_letter_b"
- mozc:keyIcon="@raw/twelvekeys__alphabet__02">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_b" />
+ mozc:keyIcon="@raw/twelvekeys__alphabet__support__02_center">
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__latin_b" />
</KeyEntity>
</Flick>
<Flick mozc:direction="up">
<KeyEntity mozc:sourceId="9"
mozc:keyCode="@integer/uchar_latin_small_letter_c"
- mozc:keyIcon="@raw/twelvekeys__alphabet__02">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_c" />
+ mozc:keyIcon="@raw/twelvekeys__alphabet__support__02_center">
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__latin_c" />
+ </KeyEntity>
+ </Flick>
+ <Flick mozc:direction="down">
+ <KeyEntity mozc:sourceId="56"
+ mozc:keyCode="@integer/uchar_vertical_line"
+ mozc:keyIcon="@raw/twelvekeys__alphabet__support__02_down"
+ mozc:flickHighlight="true">
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__number__two"/>
</KeyEntity>
</Flick>
</KeyState>
@@ -141,73 +153,93 @@
<Flick>
<KeyEntity mozc:sourceId="10"
mozc:keyCode="@integer/uchar_digit_three"
- mozc:keyIcon="@raw/twelvekeys__alphabet__03">
+ mozc:keyIcon="@raw/twelvekeys__alphabet__support__03_center">
<PopUp mozc:popUpIcon="@raw/twelvekeys__alphabet__support__popup__03" />
</KeyEntity>
</Flick>
<Flick mozc:direction="left">
<KeyEntity mozc:sourceId="11"
mozc:keyCode="@integer/uchar_latin_small_letter_e"
- mozc:keyIcon="@raw/twelvekeys__alphabet__03">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_e" />
+ mozc:keyIcon="@raw/twelvekeys__alphabet__support__03_center">
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__latin_e" />
</KeyEntity>
</Flick>
<Flick mozc:direction="up">
<KeyEntity mozc:sourceId="12"
mozc:keyCode="@integer/uchar_latin_small_letter_f"
- mozc:keyIcon="@raw/twelvekeys__alphabet__03">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_f" />
+ mozc:keyIcon="@raw/twelvekeys__alphabet__support__03_center">
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__latin_f" />
+ </KeyEntity>
+ </Flick>
+ <Flick mozc:direction="down">
+ <KeyEntity mozc:sourceId="57"
+ mozc:keyCode="@integer/uchar_tilde"
+ mozc:keyIcon="@raw/twelvekeys__alphabet__support__03_down"
+ mozc:flickHighlight="true">
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__number__three"/>
</KeyEntity>
</Flick>
</KeyState>
</Key>
+ <Spacer mozc:keyWidth="@dimen/keyboard_separator_width" mozc:keyHorizontalLayoutWeight="0"
+ mozc:keyBackground="keyboardSeparatorTop"/>
<Key mozc:keyBackground="twelvekeysFunction"
- mozc:keyWidth="17.3%p" mozc:keyEdgeFlags="right" mozc:isRepeatable="true">
+ mozc:keyHorizontalLayoutWeight="0" mozc:keyEdgeFlags="right" mozc:isRepeatable="true">
<KeyState mozc:contentDescription="@string/cd_key_uchar_backspace">
<Flick>
<KeyEntity mozc:sourceId="13"
mozc:keyCode="@integer/uchar_backspace"
- mozc:keyIcon="@raw/twelvekeys__function__delete__icon">
- <PopUp mozc:popUpIcon="@raw/qwerty__function__delete__popup" />
- </KeyEntity>
+ mozc:keyIcon="@raw/twelvekeys__function__delete__icon"
+ mozc:iconWidth="@dimen/unlimited"
+ mozc:iconHeight="@dimen/default_function_icon_height" />
</Flick>
</KeyState>
</Key>
</Row>
<Row>
<Key mozc:keyBackground="twelvekeysFunction"
- mozc:keyWidth="17.3%p" mozc:keyEdgeFlags="left" mozc:isRepeatable="true">
+ mozc:keyHorizontalLayoutWeight="0" mozc:keyEdgeFlags="left" mozc:isRepeatable="true">
<KeyState mozc:contentDescription="@string/cd_key_left">
<Flick>
<KeyEntity mozc:sourceId="14"
mozc:keyCode="@integer/key_left"
- mozc:keyIcon="@raw/twelvekeys__function__left_arrow__icon">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__function__left_arrow__popup" />
- </KeyEntity>
+ mozc:keyIcon="@raw/twelvekeys__function__left_arrow__icon"
+ mozc:iconWidth="@dimen/unlimited"
+ mozc:iconHeight="@dimen/default_function_icon_height" />
</Flick>
</KeyState>
</Key>
+ <Spacer mozc:keyWidth="@dimen/keyboard_separator_width" mozc:keyHorizontalLayoutWeight="0"
+ mozc:keyBackground="keyboardSeparatorCenter"/>
<Key>
<KeyState mozc:contentDescription="@string/cd_key_alphabet_ghi">
<Flick>
<KeyEntity mozc:sourceId="15"
mozc:keyCode="@integer/uchar_digit_four"
- mozc:keyIcon="@raw/twelvekeys__alphabet__04">
+ mozc:keyIcon="@raw/twelvekeys__alphabet__support__04_center">
<PopUp mozc:popUpIcon="@raw/twelvekeys__alphabet__support__popup__04" />
</KeyEntity>
</Flick>
<Flick mozc:direction="left">
<KeyEntity mozc:sourceId="16"
mozc:keyCode="@integer/uchar_latin_small_letter_h"
- mozc:keyIcon="@raw/twelvekeys__alphabet__04">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_h" />
+ mozc:keyIcon="@raw/twelvekeys__alphabet__support__04_center">
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__latin_h" />
</KeyEntity>
</Flick>
<Flick mozc:direction="up">
<KeyEntity mozc:sourceId="17"
mozc:keyCode="@integer/uchar_latin_small_letter_i"
- mozc:keyIcon="@raw/twelvekeys__alphabet__04">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_i" />
+ mozc:keyIcon="@raw/twelvekeys__alphabet__support__04_center">
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__latin_i" />
+ </KeyEntity>
+ </Flick>
+ <Flick mozc:direction="down">
+ <KeyEntity mozc:sourceId="58"
+ mozc:keyCode="@integer/uchar_dollar_sign"
+ mozc:keyIcon="@raw/twelvekeys__alphabet__support__04_down"
+ mozc:flickHighlight="true">
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__number__four"/>
</KeyEntity>
</Flick>
</KeyState>
@@ -217,22 +249,30 @@
<Flick>
<KeyEntity mozc:sourceId="18"
mozc:keyCode="@integer/uchar_digit_five"
- mozc:keyIcon="@raw/twelvekeys__alphabet__05">
+ mozc:keyIcon="@raw/twelvekeys__alphabet__support__05_center">
<PopUp mozc:popUpIcon="@raw/twelvekeys__alphabet__support__popup__05" />
</KeyEntity>
</Flick>
<Flick mozc:direction="left">
<KeyEntity mozc:sourceId="19"
mozc:keyCode="@integer/uchar_latin_small_letter_k"
- mozc:keyIcon="@raw/twelvekeys__alphabet__05">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_k" />
+ mozc:keyIcon="@raw/twelvekeys__alphabet__support__05_center">
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__latin_k" />
</KeyEntity>
</Flick>
<Flick mozc:direction="up">
<KeyEntity mozc:sourceId="20"
mozc:keyCode="@integer/uchar_latin_small_letter_l"
- mozc:keyIcon="@raw/twelvekeys__alphabet__05">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_l" />
+ mozc:keyIcon="@raw/twelvekeys__alphabet__support__05_center">
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__latin_l" />
+ </KeyEntity>
+ </Flick>
+ <Flick mozc:direction="down">
+ <KeyEntity mozc:sourceId="59"
+ mozc:keyCode="@integer/uchar_percent_sign"
+ mozc:keyIcon="@raw/twelvekeys__alphabet__support__05_down"
+ mozc:flickHighlight="true">
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__number__five"/>
</KeyEntity>
</Flick>
</KeyState>
@@ -242,80 +282,108 @@
<Flick>
<KeyEntity mozc:sourceId="21"
mozc:keyCode="@integer/uchar_digit_six"
- mozc:keyIcon="@raw/twelvekeys__alphabet__06">
+ mozc:keyIcon="@raw/twelvekeys__alphabet__support__06_center">
<PopUp mozc:popUpIcon="@raw/twelvekeys__alphabet__support__popup__06" />
</KeyEntity>
</Flick>
<Flick mozc:direction="left">
<KeyEntity mozc:sourceId="22"
mozc:keyCode="@integer/uchar_latin_small_letter_n"
- mozc:keyIcon="@raw/twelvekeys__alphabet__06">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_n" />
+ mozc:keyIcon="@raw/twelvekeys__alphabet__support__06_center">
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__latin_n" />
</KeyEntity>
</Flick>
<Flick mozc:direction="up">
<KeyEntity mozc:sourceId="23"
mozc:keyCode="@integer/uchar_latin_small_letter_o"
- mozc:keyIcon="@raw/twelvekeys__alphabet__06">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_o" />
+ mozc:keyIcon="@raw/twelvekeys__alphabet__support__06_center">
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__latin_o" />
+ </KeyEntity>
+ </Flick>
+ <Flick mozc:direction="down">
+ <KeyEntity mozc:sourceId="60"
+ mozc:keyCode="@integer/uchar_ampersand"
+ mozc:keyIcon="@raw/twelvekeys__alphabet__support__06_down"
+ mozc:flickHighlight="true">
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__number__six"/>
</KeyEntity>
</Flick>
</KeyState>
</Key>
+ <Spacer mozc:keyWidth="@dimen/keyboard_separator_width" mozc:keyHorizontalLayoutWeight="0"
+ mozc:keyBackground="keyboardSeparatorCenter"/>
<Key mozc:keyBackground="twelvekeysFunction"
- mozc:keyWidth="17.3%p" mozc:keyEdgeFlags="right" mozc:isRepeatable="true">
+ mozc:keyHorizontalLayoutWeight="0" mozc:keyEdgeFlags="right" mozc:isRepeatable="true">
<KeyState mozc:contentDescription="@string/cd_key_right">
<Flick>
<KeyEntity mozc:sourceId="24"
mozc:keyCode="@integer/key_right"
- mozc:keyIcon="@raw/twelvekeys__function__right_arrow__icon">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__function__right_arrow__popup" />
- </KeyEntity>
+ mozc:keyIcon="@raw/twelvekeys__function__right_arrow__icon"
+ mozc:iconWidth="@dimen/unlimited"
+ mozc:iconHeight="@dimen/default_function_icon_height" />
</Flick>
</KeyState>
</Key>
</Row>
<Row>
<Key mozc:keyBackground="twelvekeysFunction"
- mozc:keyWidth="17.3%p" mozc:keyEdgeFlags="left">
+ mozc:keyHorizontalLayoutWeight="0" mozc:keyEdgeFlags="left">
<KeyState mozc:contentDescription="@string/cd_key_symbol">
<Flick>
<KeyEntity mozc:sourceId="25"
mozc:keyCode="@integer/key_symbol"
- mozc:keyIcon="@raw/twelvekeys__function__symbol__icon">
- <PopUp mozc:popUpIcon="@raw/qwerty__function__symbol__popup" />
- </KeyEntity>
+ mozc:keyIcon="@raw/twelvekeys__function__symbol__icon"
+ mozc:iconWidth="@dimen/unlimited"
+ mozc:iconHeight="@dimen/default_function_icon_height" />
+ </Flick>
+ </KeyState>
+ <KeyState mozc:contentDescription="@string/cd_key_symbol" mozc:metaState="handling_touch_event">
+ <Flick>
+ <KeyEntity mozc:sourceId="65"
+ mozc:keyIcon="@raw/twelvekeys__function__symbol__icon"
+ mozc:iconWidth="@dimen/unlimited"
+ mozc:iconHeight="@dimen/default_function_icon_height" />
</Flick>
</KeyState>
</Key>
+ <Spacer mozc:keyWidth="@dimen/keyboard_separator_width" mozc:keyHorizontalLayoutWeight="0"
+ mozc:keyBackground="keyboardSeparatorCenter"/>
<Key>
<KeyState mozc:contentDescription="@string/cd_key_alphabet_pqrs">
<Flick>
<KeyEntity mozc:sourceId="26"
mozc:keyCode="@integer/uchar_digit_seven"
- mozc:keyIcon="@raw/twelvekeys__alphabet__07">
+ mozc:keyIcon="@raw/twelvekeys__alphabet__support__07_center">
<PopUp mozc:popUpIcon="@raw/twelvekeys__alphabet__support__popup__07" />
</KeyEntity>
</Flick>
<Flick mozc:direction="left">
<KeyEntity mozc:sourceId="27"
mozc:keyCode="@integer/uchar_latin_small_letter_q"
- mozc:keyIcon="@raw/twelvekeys__alphabet__07">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_q" />
+ mozc:keyIcon="@raw/twelvekeys__alphabet__support__07_center">
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__latin_q" />
</KeyEntity>
</Flick>
<Flick mozc:direction="up">
<KeyEntity mozc:sourceId="28"
mozc:keyCode="@integer/uchar_latin_small_letter_r"
- mozc:keyIcon="@raw/twelvekeys__alphabet__07">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_r" />
+ mozc:keyIcon="@raw/twelvekeys__alphabet__support__07_center">
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__latin_r" />
</KeyEntity>
</Flick>
<Flick mozc:direction="right">
<KeyEntity mozc:sourceId="29"
mozc:keyCode="@integer/uchar_latin_small_letter_s"
- mozc:keyIcon="@raw/twelvekeys__alphabet__07">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_s" />
+ mozc:keyIcon="@raw/twelvekeys__alphabet__support__07_center">
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__latin_s" />
+ </KeyEntity>
+ </Flick>
+ <Flick mozc:direction="down">
+ <KeyEntity mozc:sourceId="61"
+ mozc:keyCode="@integer/uchar_less_than_sign"
+ mozc:keyIcon="@raw/twelvekeys__alphabet__support__07_down"
+ mozc:flickHighlight="true">
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__number__seven"/>
</KeyEntity>
</Flick>
</KeyState>
@@ -325,22 +393,30 @@
<Flick>
<KeyEntity mozc:sourceId="30"
mozc:keyCode="@integer/uchar_digit_eight"
- mozc:keyIcon="@raw/twelvekeys__alphabet__08">
+ mozc:keyIcon="@raw/twelvekeys__alphabet__support__08_center">
<PopUp mozc:popUpIcon="@raw/twelvekeys__alphabet__support__popup__08" />
</KeyEntity>
</Flick>
<Flick mozc:direction="left">
<KeyEntity mozc:sourceId="31"
mozc:keyCode="@integer/uchar_latin_small_letter_u"
- mozc:keyIcon="@raw/twelvekeys__alphabet__08">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_u" />
+ mozc:keyIcon="@raw/twelvekeys__alphabet__support__08_center">
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__latin_u" />
</KeyEntity>
</Flick>
<Flick mozc:direction="up">
<KeyEntity mozc:sourceId="32"
mozc:keyCode="@integer/uchar_latin_small_letter_v"
- mozc:keyIcon="@raw/twelvekeys__alphabet__08">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_v" />
+ mozc:keyIcon="@raw/twelvekeys__alphabet__support__08_center">
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__latin_v" />
+ </KeyEntity>
+ </Flick>
+ <Flick mozc:direction="down">
+ <KeyEntity mozc:sourceId="62"
+ mozc:keyCode="@integer/uchar_circumflex_accent"
+ mozc:keyIcon="@raw/twelvekeys__alphabet__support__08_down"
+ mozc:flickHighlight="true">
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__number__eight"/>
</KeyEntity>
</Flick>
</KeyState>
@@ -350,68 +426,80 @@
<Flick>
<KeyEntity mozc:sourceId="33"
mozc:keyCode="@integer/uchar_digit_nine"
- mozc:keyIcon="@raw/twelvekeys__alphabet__09">
+ mozc:keyIcon="@raw/twelvekeys__alphabet__support__09_center">
<PopUp mozc:popUpIcon="@raw/twelvekeys__alphabet__support__popup__09" />
</KeyEntity>
</Flick>
<Flick mozc:direction="left">
<KeyEntity mozc:sourceId="34"
mozc:keyCode="@integer/uchar_latin_small_letter_x"
- mozc:keyIcon="@raw/twelvekeys__alphabet__09">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_x" />
+ mozc:keyIcon="@raw/twelvekeys__alphabet__support__09_center">
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__latin_x" />
</KeyEntity>
</Flick>
<Flick mozc:direction="up">
<KeyEntity mozc:sourceId="35"
mozc:keyCode="@integer/uchar_latin_small_letter_y"
- mozc:keyIcon="@raw/twelvekeys__alphabet__09">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_y" />
+ mozc:keyIcon="@raw/twelvekeys__alphabet__support__09_center">
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__latin_y" />
</KeyEntity>
</Flick>
<Flick mozc:direction="right">
<KeyEntity mozc:sourceId="36"
mozc:keyCode="@integer/uchar_latin_small_letter_z"
- mozc:keyIcon="@raw/twelvekeys__alphabet__09">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_z" />
+ mozc:keyIcon="@raw/twelvekeys__alphabet__support__09_center">
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__latin_z" />
+ </KeyEntity>
+ </Flick>
+ <Flick mozc:direction="down">
+ <KeyEntity mozc:sourceId="63"
+ mozc:keyCode="@integer/uchar_greater_than_sign"
+ mozc:keyIcon="@raw/twelvekeys__alphabet__support__09_down"
+ mozc:flickHighlight="true">
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__number__nine"/>
</KeyEntity>
</Flick>
</KeyState>
</Key>
+ <Spacer mozc:keyWidth="@dimen/keyboard_separator_width" mozc:keyHorizontalLayoutWeight="0"
+ mozc:keyBackground="keyboardSeparatorCenter"/>
<Key mozc:keyBackground="twelvekeysFunctionWithThreeDots"
- mozc:keyWidth="17.3%p" mozc:keyEdgeFlags="right">
+ mozc:keyHorizontalLayoutWeight="0" mozc:keyEdgeFlags="right">
<KeyState mozc:contentDescription="@string/cd_key_uchar_space">
<Flick>
<KeyEntity mozc:sourceId="37"
mozc:keyCode="@integer/uchar_space"
mozc:longPressKeyCode="@integer/key_ime_picker_dialog"
- mozc:keyIcon="@raw/twelvekeys__function__space__icon">
- <PopUp mozc:popUpIcon="@raw/qwerty__function__space__popup" />
- </KeyEntity>
+ mozc:keyIcon="@raw/twelvekeys__function__space__icon"
+ mozc:iconWidth="@dimen/unlimited"
+ mozc:iconHeight="@dimen/default_function_icon_height" />
</Flick>
</KeyState>
</Key>
</Row>
<Row>
<Key mozc:keyBackground="twelvekeysFunctionWithThreeDots"
- mozc:keyWidth="17.3%p" mozc:keyEdgeFlags="left">
- <KeyState mozc:contentDescription="@string/cd_key_chartype_to_123">
+ mozc:keyHorizontalLayoutWeight="0" mozc:keyEdgeFlags="left">
+ <KeyState mozc:contentDescription="@string/cd_key_chartype_to_kana">
<Flick>
<KeyEntity mozc:sourceId="38"
- mozc:keyCode="@integer/key_chartype_to_123"
+ mozc:keyCode="@integer/key_chartype_to_kana"
mozc:longPressKeyCode="@integer/key_menu_dialog"
- mozc:keyIcon="@raw/twelvekeys__function__alphabet__icon">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__function__number__popup" />
- </KeyEntity>
+ mozc:keyIcon="@raw/twelvekeys__function__alphabet__icon"
+ mozc:iconWidth="@dimen/unlimited"
+ mozc:iconHeight="@dimen/default_function_icon_height" />
</Flick>
</KeyState>
</Key>
+ <Spacer mozc:keyWidth="@dimen/keyboard_separator_width" mozc:keyHorizontalLayoutWeight="0"
+ mozc:keyBackground="keyboardSeparatorBottom"/>
<Key>
<KeyState mozc:contentDescription="@string/cd_key_alphabet_capitalize">
<Flick>
<KeyEntity mozc:sourceId="39"
mozc:keyCode="@integer/uchar_asterisk"
mozc:keyIcon="@raw/twelvekeys__alphabet__10">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__alphabet__10" />
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__alphabet__popup__10" />
</KeyEntity>
</Flick>
</KeyState>
@@ -421,29 +509,37 @@
<Flick>
<KeyEntity mozc:sourceId="40"
mozc:keyCode="@integer/uchar_digit_zero"
- mozc:keyIcon="@raw/twelvekeys__alphabet__11">
+ mozc:keyIcon="@raw/twelvekeys__alphabet__support__11_center">
<PopUp mozc:popUpIcon="@raw/twelvekeys__alphabet__support__popup__11" />
</KeyEntity>
</Flick>
<Flick mozc:direction="left">
<KeyEntity mozc:sourceId="41"
mozc:keyCode="@integer/uchar_quotation_mark"
- mozc:keyIcon="@raw/twelvekeys__alphabet__11">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__quotation_mark" />
+ mozc:keyIcon="@raw/twelvekeys__alphabet__support__11_center">
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__quotation_mark" />
</KeyEntity>
</Flick>
<Flick mozc:direction="up">
<KeyEntity mozc:sourceId="42"
mozc:keyCode="@integer/uchar_colon"
- mozc:keyIcon="@raw/twelvekeys__alphabet__11">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__colon" />
+ mozc:keyIcon="@raw/twelvekeys__alphabet__support__11_center">
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__colon" />
</KeyEntity>
</Flick>
<Flick mozc:direction="right">
<KeyEntity mozc:sourceId="43"
mozc:keyCode="@integer/uchar_semicolon"
- mozc:keyIcon="@raw/twelvekeys__alphabet__11">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__semicolon" />
+ mozc:keyIcon="@raw/twelvekeys__alphabet__support__11_center">
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__semicolon" />
+ </KeyEntity>
+ </Flick>
+ <Flick mozc:direction="down">
+ <KeyEntity mozc:sourceId="64"
+ mozc:keyCode="@integer/uchar_number_sign"
+ mozc:keyIcon="@raw/twelvekeys__alphabet__support__11_down"
+ mozc:flickHighlight="true">
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__number__zero"/>
</KeyEntity>
</Flick>
</KeyState>
@@ -453,45 +549,143 @@
<Flick>
<KeyEntity mozc:sourceId="44"
mozc:keyCode="@integer/uchar_full_stop"
- mozc:keyIcon="@raw/twelvekeys__alphabet__12">
+ mozc:keyIcon="@raw/twelvekeys__alphabet__support__12_center">
<PopUp mozc:popUpIcon="@raw/twelvekeys__alphabet__support__popup__12" />
</KeyEntity>
</Flick>
<Flick mozc:direction="left">
<KeyEntity mozc:sourceId="45"
mozc:keyCode="@integer/uchar_comma"
- mozc:keyIcon="@raw/twelvekeys__alphabet__12">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__comma" />
+ mozc:keyIcon="@raw/twelvekeys__alphabet__support__12_center">
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__comma" />
</KeyEntity>
</Flick>
<Flick mozc:direction="up">
<KeyEntity mozc:sourceId="46"
mozc:keyCode="@integer/uchar_question_mark"
- mozc:keyIcon="@raw/twelvekeys__alphabet__12">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__question_mark" />
+ mozc:keyIcon="@raw/twelvekeys__alphabet__support__12_center">
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__question_mark" />
</KeyEntity>
</Flick>
<Flick mozc:direction="right">
<KeyEntity mozc:sourceId="47"
mozc:keyCode="@integer/uchar_exclamation_mark"
- mozc:keyIcon="@raw/twelvekeys__alphabet__12">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__exclamation_mark" />
+ mozc:keyIcon="@raw/twelvekeys__alphabet__support__12_center">
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__exclamation_mark" />
</KeyEntity>
</Flick>
</KeyState>
</Key>
- <Key mozc:keyBackground="twelvekeysFunction"
- mozc:keyWidth="17.3%p" mozc:keyEdgeFlags="right" mozc:isRepeatable="true">
+ <Spacer mozc:keyWidth="@dimen/keyboard_separator_width" mozc:keyHorizontalLayoutWeight="0"
+ mozc:keyBackground="keyboardSeparatorBottom"/>
+ <Key mozc:keyBackground="twelvekeysFunctionWithThreeDots"
+ mozc:keyHorizontalLayoutWeight="0" mozc:keyEdgeFlags="right"
+ mozc:defaultIconWidth="@dimen/keyboard_enter_width"
+ mozc:defaultIconHeight="@dimen/unlimited">
<KeyState mozc:contentDescription="@string/cd_key_uchar_linefeed">
<Flick>
<KeyEntity mozc:sourceId="48"
mozc:keyCode="@integer/uchar_linefeed"
- mozc:keyIcon="@raw/twelvekeys__function__enter__icon">
- <PopUp mozc:popUpIcon="@raw/qwerty__function__enter__popup" />
+ mozc:longPressKeyCode="@integer/key_symbol_emoji"
+ mozc:longPressTimeoutTrigger="false"
+ mozc:keyIcon="@raw/function__enter__icon">
+ <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+ mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
+ </KeyEntity>
+ </Flick>
+ </KeyState>
+ <KeyState mozc:contentDescription="@string/cd_key_composing_done"
+ mozc:metaState="composing">
+ <Flick>
+ <KeyEntity mozc:sourceId="49"
+ mozc:keyCode="@integer/uchar_linefeed"
+ mozc:longPressKeyCode="@integer/key_symbol_emoji"
+ mozc:longPressTimeoutTrigger="false"
+ mozc:keyIcon="@raw/function__enter__icon">
+ <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+ mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
+ </KeyEntity>
+ </Flick>
+ </KeyState>
+ <KeyState mozc:contentDescription="@string/cd_key_action_done"
+ mozc:metaState="action_done">
+ <Flick>
+ <KeyEntity mozc:sourceId="50"
+ mozc:keyCode="@integer/uchar_linefeed"
+ mozc:longPressKeyCode="@integer/key_symbol_emoji"
+ mozc:longPressTimeoutTrigger="false"
+ mozc:keyIcon="@raw/function__action_done__icon">
+ <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+ mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
+ </KeyEntity>
+ </Flick>
+ </KeyState>
+ <KeyState mozc:contentDescription="@string/cd_key_action_go"
+ mozc:metaState="action_go">
+ <Flick>
+ <KeyEntity mozc:sourceId="51"
+ mozc:keyCode="@integer/uchar_linefeed"
+ mozc:longPressKeyCode="@integer/key_symbol_emoji"
+ mozc:longPressTimeoutTrigger="false"
+ mozc:keyIcon="@raw/function__action_go__icon">
+ <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+ mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
+ </KeyEntity>
+ </Flick>
+ </KeyState>
+ <KeyState mozc:contentDescription="@string/cd_key_action_next"
+ mozc:metaState="action_next">
+ <Flick>
+ <KeyEntity mozc:sourceId="52"
+ mozc:keyCode="@integer/uchar_linefeed"
+ mozc:longPressKeyCode="@integer/key_symbol_emoji"
+ mozc:longPressTimeoutTrigger="false"
+ mozc:keyIcon="@raw/function__action_next__icon">
+ <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+ mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
+ </KeyEntity>
+ </Flick>
+ </KeyState>
+ <KeyState mozc:contentDescription="@string/cd_key_action_previous"
+ mozc:metaState="action_previous">
+ <Flick>
+ <KeyEntity mozc:sourceId="53"
+ mozc:keyCode="@integer/uchar_linefeed"
+ mozc:longPressKeyCode="@integer/key_symbol_emoji"
+ mozc:longPressTimeoutTrigger="false"
+ mozc:keyIcon="@raw/function__action_previous__icon">
+ <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+ mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
+ </KeyEntity>
+ </Flick>
+ </KeyState>
+ <KeyState mozc:contentDescription="@string/cd_key_action_search"
+ mozc:metaState="action_search">
+ <Flick>
+ <KeyEntity mozc:sourceId="54"
+ mozc:keyCode="@integer/uchar_linefeed"
+ mozc:longPressKeyCode="@integer/key_symbol_emoji"
+ mozc:longPressTimeoutTrigger="false"
+ mozc:keyIcon="@raw/function__action_search__icon">
+ <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+ mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
+ </KeyEntity>
+ </Flick>
+ </KeyState>
+ <KeyState mozc:contentDescription="@string/cd_key_action_send"
+ mozc:metaState="action_send">
+ <Flick>
+ <KeyEntity mozc:sourceId="55"
+ mozc:keyCode="@integer/uchar_linefeed"
+ mozc:longPressKeyCode="@integer/key_symbol_emoji"
+ mozc:longPressTimeoutTrigger="false"
+ mozc:keyIcon="@raw/function__action_send__icon">
+ <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+ mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
</KeyEntity>
</Flick>
</KeyState>
</Key>
</Row>
- <!-- Next sourceId: 48 -->
+ <!-- Next sourceId: 66 -->
</Keyboard>
diff --git a/src/android/static_resources/resources_oss/res/xml/kbd_12keys_flick_kana.xml b/src/android/static_resources/resources_oss/res/xml/kbd_12keys_flick_kana.xml
index c0e23f8..e250f32 100644
--- a/src/android/static_resources/resources_oss/res/xml/kbd_12keys_flick_kana.xml
+++ b/src/android/static_resources/resources_oss/res/xml/kbd_12keys_flick_kana.xml
@@ -49,31 +49,34 @@
| | '<' | '>' |
+===========+===========+===========+
- TODO(hidehiko): Now the key id is inconsistent between keyIcon and flick popup due to
- historical reason. Standardize them.
- -->
+ TODO(hidehiko): Now the key id is inconsistent between keyIcon and flick popup due to
+ historical reason. Standardize them.
+ -->
<Keyboard
xmlns:mozc="http://schemas.android.com/apk/res-auto"
mozc:keyboardContentDescription="@string/cd_keyboard_kana"
mozc:keyBackground="twelvekeysRegular"
- mozc:keyWidth="21.8%p" mozc:keyHeight="24%p"
+ mozc:keyWidth="17.3%p" mozc:keyHeight="25%p" mozc:keyHorizontalLayoutWeight="1"
mozc:horizontalGap="0dip" mozc:verticalGap="0dip"
- mozc:popUpWidth="@dimen/key_preview_height" mozc:popUpHeight="@dimen/key_preview_height"
- mozc:popUpXOffset="0dip" mozc:popUpYOffset="@dimen/mini_keyboard_vertical_correction">
- <Row mozc:rowEdgeFlags="top" mozc:keyHeight="0dip" mozc:verticalGap="4%p" />
+ mozc:popUpHeight="@dimen/key_preview_height"
+ mozc:popUpIconHeight="@dimen/key_preview_icon_height"
+ mozc:popUpXOffset="0dip" mozc:popUpYOffset="@dimen/mini_keyboard_vertical_correction"
+ mozc:defaultIconWidth="@dimen/unlimited" mozc:defaultIconHeight="@dimen/keyboard_twelvekeys_default_height" >
<Row>
- <Key mozc:keyBackground="twelvekeysFunction"
- mozc:keyWidth="17.3%p" mozc:keyEdgeFlags="left">
+ <Key mozc:keyBackground="twelvekeysFunction" mozc:keyEdgeFlags="left"
+ mozc:keyHorizontalLayoutWeight="0">
<KeyState mozc:contentDescription="@string/cd_key_undo">
<Flick>
<KeyEntity mozc:sourceId="1"
mozc:keyCode="@integer/key_undo"
- mozc:keyIcon="@raw/twelvekeys__function__undo__icon">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__function__undo__popup" />
- </KeyEntity>
+ mozc:keyIcon="@raw/twelvekeys__function__undo__icon"
+ mozc:iconWidth="@dimen/unlimited"
+ mozc:iconHeight="@dimen/default_function_icon_height" />
</Flick>
</KeyState>
</Key>
+ <Spacer mozc:keyWidth="@dimen/keyboard_separator_width" mozc:keyHorizontalLayoutWeight="0"
+ mozc:keyBackground="keyboardSeparatorTop"/>
<Key>
<KeyState mozc:contentDescription="@string/cd_key_kana_line_a">
<Flick>
@@ -89,7 +92,7 @@
mozc:keyCode="@integer/uchar_low_line"
mozc:keyIcon="@raw/twelvekeys__kana__support__01_left"
mozc:flickHighlight="true">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__kana__keyicon__i" />
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__i" />
</KeyEntity>
</Flick>
<Flick mozc:direction="up">
@@ -97,7 +100,7 @@
mozc:keyCode="@integer/uchar_semicolon"
mozc:keyIcon="@raw/twelvekeys__kana__support__01_up"
mozc:flickHighlight="true">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__kana__keyicon__u" />
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__u" />
</KeyEntity>
</Flick>
<Flick mozc:direction="right">
@@ -105,7 +108,7 @@
mozc:keyCode="@integer/uchar_colon"
mozc:keyIcon="@raw/twelvekeys__kana__support__01_right"
mozc:flickHighlight="true">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__kana__keyicon__e" />
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__e" />
</KeyEntity>
</Flick>
<Flick mozc:direction="down">
@@ -113,7 +116,7 @@
mozc:keyCode="@integer/uchar_commercial_at"
mozc:keyIcon="@raw/twelvekeys__kana__support__01_down"
mozc:flickHighlight="true">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__kana__keyicon__o" />
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__o" />
</KeyEntity>
</Flick>
</KeyState>
@@ -133,7 +136,7 @@
mozc:keyCode="@integer/uchar_latin_small_letter_a"
mozc:keyIcon="@raw/twelvekeys__kana__support__02_left"
mozc:flickHighlight="true">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__kana__keyicon__ki" />
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__ki" />
</KeyEntity>
</Flick>
<Flick mozc:direction="up">
@@ -141,7 +144,7 @@
mozc:keyCode="@integer/uchar_latin_small_letter_b"
mozc:keyIcon="@raw/twelvekeys__kana__support__02_up"
mozc:flickHighlight="true">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__kana__keyicon__ku" />
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__ku" />
</KeyEntity>
</Flick>
<Flick mozc:direction="right">
@@ -149,7 +152,7 @@
mozc:keyCode="@integer/uchar_latin_small_letter_c"
mozc:keyIcon="@raw/twelvekeys__kana__support__02_right"
mozc:flickHighlight="true">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__kana__keyicon__ke" />
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__ke" />
</KeyEntity>
</Flick>
<Flick mozc:direction="down">
@@ -157,7 +160,7 @@
mozc:keyCode="@integer/uchar_vertical_line"
mozc:keyIcon="@raw/twelvekeys__kana__support__02_down"
mozc:flickHighlight="true">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__kana__keyicon__ko" />
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__ko" />
</KeyEntity>
</Flick>
</KeyState>
@@ -177,7 +180,7 @@
mozc:keyCode="@integer/uchar_latin_small_letter_d"
mozc:keyIcon="@raw/twelvekeys__kana__support__03_left"
mozc:flickHighlight="true">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__kana__keyicon__shi" />
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__shi" />
</KeyEntity>
</Flick>
<Flick mozc:direction="up">
@@ -185,7 +188,7 @@
mozc:keyCode="@integer/uchar_latin_small_letter_e"
mozc:keyIcon="@raw/twelvekeys__kana__support__03_up"
mozc:flickHighlight="true">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__kana__keyicon__su" />
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__su" />
</KeyEntity>
</Flick>
<Flick mozc:direction="right">
@@ -193,7 +196,7 @@
mozc:keyCode="@integer/uchar_latin_small_letter_f"
mozc:keyIcon="@raw/twelvekeys__kana__support__03_right"
mozc:flickHighlight="true">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__kana__keyicon__se" />
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__se" />
</KeyEntity>
</Flick>
<Flick mozc:direction="down">
@@ -201,37 +204,41 @@
mozc:keyCode="@integer/uchar_tilde"
mozc:keyIcon="@raw/twelvekeys__kana__support__03_down"
mozc:flickHighlight="true">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__kana__keyicon__so" />
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__so" />
</KeyEntity>
</Flick>
</KeyState>
</Key>
- <Key mozc:keyBackground="twelvekeysFunction"
- mozc:keyWidth="17.3%p" mozc:keyEdgeFlags="right" mozc:isRepeatable="true">
+ <Spacer mozc:keyWidth="@dimen/keyboard_separator_width" mozc:keyHorizontalLayoutWeight="0"
+ mozc:keyBackground="keyboardSeparatorTop"/>
+ <Key mozc:keyBackground="twelvekeysFunction" mozc:keyEdgeFlags="right" mozc:isRepeatable="true"
+ mozc:keyHorizontalLayoutWeight="0">
<KeyState mozc:contentDescription="@string/cd_key_uchar_backspace">
<Flick>
<KeyEntity mozc:sourceId="17"
mozc:keyCode="@integer/uchar_backspace"
- mozc:keyIcon="@raw/twelvekeys__function__delete__icon">
- <PopUp mozc:popUpIcon="@raw/qwerty__function__delete__popup" />
- </KeyEntity>
+ mozc:keyIcon="@raw/twelvekeys__function__delete__icon"
+ mozc:iconWidth="@dimen/unlimited"
+ mozc:iconHeight="@dimen/default_function_icon_height" />
</Flick>
</KeyState>
</Key>
</Row>
<Row>
- <Key mozc:keyBackground="twelvekeysFunction"
- mozc:keyWidth="17.3%p" mozc:keyEdgeFlags="left" mozc:isRepeatable="true">
+ <Key mozc:keyBackground="twelvekeysFunction" mozc:keyEdgeFlags="left" mozc:isRepeatable="true"
+ mozc:keyHorizontalLayoutWeight="0">
<KeyState mozc:contentDescription="@string/cd_key_left">
<Flick>
<KeyEntity mozc:sourceId="18"
mozc:keyCode="@integer/key_left"
- mozc:keyIcon="@raw/twelvekeys__function__left_arrow__icon">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__function__left_arrow__popup" />
- </KeyEntity>
+ mozc:keyIcon="@raw/twelvekeys__function__left_arrow__icon"
+ mozc:iconWidth="@dimen/unlimited"
+ mozc:iconHeight="@dimen/default_function_icon_height" />
</Flick>
</KeyState>
</Key>
+ <Spacer mozc:keyWidth="@dimen/keyboard_separator_width" mozc:keyHorizontalLayoutWeight="0"
+ mozc:keyBackground="keyboardSeparatorCenter"/>
<Key>
<KeyState mozc:contentDescription="@string/cd_key_kana_line_ta">
<Flick>
@@ -247,7 +254,7 @@
mozc:keyCode="@integer/uchar_latin_small_letter_g"
mozc:keyIcon="@raw/twelvekeys__kana__support__04_left"
mozc:flickHighlight="true">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__kana__keyicon__chi" />
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__chi" />
</KeyEntity>
</Flick>
<Flick mozc:direction="up">
@@ -255,7 +262,7 @@
mozc:keyCode="@integer/uchar_latin_small_letter_h"
mozc:keyIcon="@raw/twelvekeys__kana__support__04_up"
mozc:flickHighlight="true">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__kana__keyicon__tsu" />
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__tsu" />
</KeyEntity>
</Flick>
<Flick mozc:direction="right">
@@ -263,7 +270,7 @@
mozc:keyCode="@integer/uchar_latin_small_letter_i"
mozc:keyIcon="@raw/twelvekeys__kana__support__04_right"
mozc:flickHighlight="true">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__kana__keyicon__te" />
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__te" />
</KeyEntity>
</Flick>
<Flick mozc:direction="down">
@@ -271,7 +278,7 @@
mozc:keyCode="@integer/uchar_dollar_sign"
mozc:keyIcon="@raw/twelvekeys__kana__support__04_down"
mozc:flickHighlight="true">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__kana__keyicon__to" />
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__to" />
</KeyEntity>
</Flick>
</KeyState>
@@ -291,7 +298,7 @@
mozc:keyCode="@integer/uchar_latin_small_letter_j"
mozc:keyIcon="@raw/twelvekeys__kana__support__05_left"
mozc:flickHighlight="true">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__kana__keyicon__ni" />
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__ni" />
</KeyEntity>
</Flick>
<Flick mozc:direction="up">
@@ -299,7 +306,7 @@
mozc:keyCode="@integer/uchar_latin_small_letter_k"
mozc:keyIcon="@raw/twelvekeys__kana__support__05_up"
mozc:flickHighlight="true">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__kana__keyicon__nu" />
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__nu" />
</KeyEntity>
</Flick>
<Flick mozc:direction="right">
@@ -307,7 +314,7 @@
mozc:keyCode="@integer/uchar_latin_small_letter_l"
mozc:keyIcon="@raw/twelvekeys__kana__support__05_right"
mozc:flickHighlight="true">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__kana__keyicon__ne" />
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__ne" />
</KeyEntity>
</Flick>
<Flick mozc:direction="down">
@@ -315,7 +322,7 @@
mozc:keyCode="@integer/uchar_percent_sign"
mozc:keyIcon="@raw/twelvekeys__kana__support__05_down"
mozc:flickHighlight="true">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__kana__keyicon__no" />
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__no" />
</KeyEntity>
</Flick>
</KeyState>
@@ -335,7 +342,7 @@
mozc:keyCode="@integer/uchar_latin_small_letter_m"
mozc:keyIcon="@raw/twelvekeys__kana__support__06_left"
mozc:flickHighlight="true">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__kana__keyicon__hi" />
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__hi" />
</KeyEntity>
</Flick>
<Flick mozc:direction="up">
@@ -343,7 +350,7 @@
mozc:keyCode="@integer/uchar_latin_small_letter_n"
mozc:keyIcon="@raw/twelvekeys__kana__support__06_up"
mozc:flickHighlight="true">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__kana__keyicon__fu" />
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__fu" />
</KeyEntity>
</Flick>
<Flick mozc:direction="right">
@@ -351,7 +358,7 @@
mozc:keyCode="@integer/uchar_latin_small_letter_o"
mozc:keyIcon="@raw/twelvekeys__kana__support__06_right"
mozc:flickHighlight="true">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__kana__keyicon__he" />
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__he" />
</KeyEntity>
</Flick>
<Flick mozc:direction="down">
@@ -359,37 +366,52 @@
mozc:keyCode="@integer/uchar_ampersand"
mozc:keyIcon="@raw/twelvekeys__kana__support__06_down"
mozc:flickHighlight="true">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__kana__keyicon__ho" />
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__ho" />
</KeyEntity>
</Flick>
</KeyState>
</Key>
- <Key mozc:keyBackground="twelvekeysFunction"
- mozc:keyWidth="17.3%p" mozc:keyEdgeFlags="right" mozc:isRepeatable="true">
+ <Spacer mozc:keyWidth="@dimen/keyboard_separator_width" mozc:keyHorizontalLayoutWeight="0"
+ mozc:keyBackground="keyboardSeparatorCenter"/>
+ <Key mozc:keyBackground="twelvekeysFunction" mozc:keyEdgeFlags="right" mozc:isRepeatable="true"
+ mozc:keyHorizontalLayoutWeight="0">
<KeyState mozc:contentDescription="@string/cd_key_right">
<Flick>
<KeyEntity mozc:sourceId="34"
mozc:keyCode="@integer/key_right"
- mozc:keyIcon="@raw/twelvekeys__function__right_arrow__icon">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__function__right_arrow__popup" />
- </KeyEntity>
+ mozc:keyIcon="@raw/twelvekeys__function__right_arrow__icon"
+ mozc:iconWidth="@dimen/unlimited"
+ mozc:iconHeight="@dimen/default_function_icon_height" />
</Flick>
</KeyState>
</Key>
</Row>
<Row>
- <Key mozc:keyBackground="twelvekeysFunction"
- mozc:keyWidth="17.3%p" mozc:keyEdgeFlags="left">
+ <Key mozc:keyBackground="twelvekeysFunction" mozc:keyEdgeFlags="left"
+ mozc:keyHorizontalLayoutWeight="0">
<KeyState mozc:contentDescription="@string/cd_key_symbol">
<Flick>
<KeyEntity mozc:sourceId="35"
mozc:keyCode="@integer/key_symbol"
- mozc:keyIcon="@raw/twelvekeys__function__symbol__icon">
- <PopUp mozc:popUpIcon="@raw/qwerty__function__symbol__popup" />
- </KeyEntity>
+ mozc:keyIcon="@raw/twelvekeys__function__symbol__icon"
+ mozc:iconWidth="@dimen/unlimited"
+ mozc:iconHeight="@dimen/default_function_icon_height" />
+ </Flick>
+ </KeyState>
+ <!-- When at least one touch events have been already active,
+ symbol key event shouldn't produce keycode.
+ Usually a user wants to show symbol picker by explicit (single-touch) operation. -->
+ <KeyState mozc:contentDescription="@string/cd_key_symbol" mozc:metaState="handling_touch_event">
+ <Flick>
+ <KeyEntity mozc:sourceId="77"
+ mozc:keyIcon="@raw/twelvekeys__function__symbol__icon"
+ mozc:iconWidth="@dimen/unlimited"
+ mozc:iconHeight="@dimen/default_function_icon_height" />
</Flick>
</KeyState>
</Key>
+ <Spacer mozc:keyWidth="@dimen/keyboard_separator_width" mozc:keyHorizontalLayoutWeight="0"
+ mozc:keyBackground="keyboardSeparatorCenter"/>
<Key>
<KeyState mozc:contentDescription="@string/cd_key_kana_line_ma">
<Flick>
@@ -405,7 +427,7 @@
mozc:keyCode="@integer/uchar_latin_small_letter_p"
mozc:keyIcon="@raw/twelvekeys__kana__support__07_left"
mozc:flickHighlight="true">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__kana__keyicon__mi" />
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__mi" />
</KeyEntity>
</Flick>
<Flick mozc:direction="up">
@@ -413,7 +435,7 @@
mozc:keyCode="@integer/uchar_latin_small_letter_q"
mozc:keyIcon="@raw/twelvekeys__kana__support__07_up"
mozc:flickHighlight="true">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__kana__keyicon__mu" />
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__mu" />
</KeyEntity>
</Flick>
<Flick mozc:direction="right">
@@ -421,7 +443,7 @@
mozc:keyCode="@integer/uchar_latin_small_letter_r"
mozc:keyIcon="@raw/twelvekeys__kana__support__07_right"
mozc:flickHighlight="true">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__kana__keyicon__me" />
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__me" />
</KeyEntity>
</Flick>
<Flick mozc:direction="down">
@@ -429,7 +451,7 @@
mozc:keyCode="@integer/uchar_latin_small_letter_s"
mozc:keyIcon="@raw/twelvekeys__kana__support__07_down"
mozc:flickHighlight="true">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__kana__keyicon__mo" />
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__mo" />
</KeyEntity>
</Flick>
</KeyState>
@@ -445,13 +467,11 @@
</KeyEntity>
</Flick>
<Flick mozc:direction="left">
- <!-- flickHighlight is intentionally false because there are no coresponding keyIcon,
- which is required for rendering flick highlight. -->
<KeyEntity mozc:sourceId="64"
mozc:keyCode="@integer/uchar_latin_small_letter_t"
- mozc:keyIcon="@raw/twelvekeys__kana__support__08_center"
- mozc:flickHighlight="false">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__fullwidth_left_parenthesis" />
+ mozc:keyIcon="@raw/twelvekeys__kana__support__08_left"
+ mozc:flickHighlight="true">
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__left_parenthesis" />
</KeyEntity>
</Flick>
<Flick mozc:direction="up">
@@ -459,16 +479,15 @@
mozc:keyCode="@integer/uchar_latin_small_letter_u"
mozc:keyIcon="@raw/twelvekeys__kana__support__08_up"
mozc:flickHighlight="true">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__kana__keyicon__yu" />
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__yu" />
</KeyEntity>
</Flick>
- <!-- c.f. flick left about flickHighlight=false -->
<Flick mozc:direction="right">
<KeyEntity mozc:sourceId="65"
mozc:keyCode="@integer/uchar_latin_small_letter_v"
- mozc:keyIcon="@raw/twelvekeys__kana__support__08_center"
- mozc:flickHighlight="false">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__fullwidth_right_parenthesis" />
+ mozc:keyIcon="@raw/twelvekeys__kana__support__08_right"
+ mozc:flickHighlight="true">
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__right_parenthesis" />
</KeyEntity>
</Flick>
<Flick mozc:direction="down">
@@ -476,7 +495,7 @@
mozc:keyCode="@integer/uchar_circumflex_accent"
mozc:keyIcon="@raw/twelvekeys__kana__support__08_down"
mozc:flickHighlight="true">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__kana__keyicon__yo" />
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__yo" />
</KeyEntity>
</Flick>
</KeyState>
@@ -496,7 +515,7 @@
mozc:keyCode="@integer/uchar_latin_small_letter_w"
mozc:keyIcon="@raw/twelvekeys__kana__support__09_left"
mozc:flickHighlight="true">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__kana__keyicon__ri" />
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__ri" />
</KeyEntity>
</Flick>
<Flick mozc:direction="up">
@@ -504,7 +523,7 @@
mozc:keyCode="@integer/uchar_latin_small_letter_x"
mozc:keyIcon="@raw/twelvekeys__kana__support__09_up"
mozc:flickHighlight="true">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__kana__keyicon__ru" />
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__ru" />
</KeyEntity>
</Flick>
<Flick mozc:direction="right">
@@ -512,7 +531,7 @@
mozc:keyCode="@integer/uchar_latin_small_letter_y"
mozc:keyIcon="@raw/twelvekeys__kana__support__09_right"
mozc:flickHighlight="true">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__kana__keyicon__re" />
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__re" />
</KeyEntity>
</Flick>
<Flick mozc:direction="down">
@@ -520,46 +539,50 @@
mozc:keyCode="@integer/uchar_latin_small_letter_z"
mozc:keyIcon="@raw/twelvekeys__kana__support__09_down"
mozc:flickHighlight="true">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__kana__keyicon__ro" />
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__ro" />
</KeyEntity>
</Flick>
</KeyState>
</Key>
- <Key mozc:keyBackground="twelvekeysFunctionWithThreeDots"
- mozc:keyWidth="17.3%p" mozc:keyEdgeFlags="right">
+ <Spacer mozc:keyWidth="@dimen/keyboard_separator_width" mozc:keyHorizontalLayoutWeight="0"
+ mozc:keyBackground="keyboardSeparatorCenter"/>
+ <Key mozc:keyBackground="twelvekeysFunctionWithThreeDots" mozc:keyEdgeFlags="right"
+ mozc:keyHorizontalLayoutWeight="0">
<KeyState mozc:contentDescription="@string/cd_key_uchar_space">
<Flick>
<KeyEntity mozc:sourceId="49"
mozc:keyCode="@integer/uchar_space"
mozc:longPressKeyCode="@integer/key_ime_picker_dialog"
- mozc:keyIcon="@raw/twelvekeys__function__space__icon">
- <PopUp mozc:popUpIcon="@raw/qwerty__function__space__popup" />
- </KeyEntity>
+ mozc:keyIcon="@raw/twelvekeys__function__space__icon"
+ mozc:iconWidth="@dimen/unlimited"
+ mozc:iconHeight="@dimen/default_function_icon_height" />
</Flick>
</KeyState>
</Key>
</Row>
<Row>
- <Key mozc:keyBackground="twelvekeysFunctionWithThreeDots"
- mozc:keyWidth="17.3%p" mozc:keyEdgeFlags="left">
+ <Key mozc:keyBackground="twelvekeysFunctionWithThreeDots" mozc:keyEdgeFlags="left"
+ mozc:keyHorizontalLayoutWeight="0">
<KeyState mozc:contentDescription="@string/cd_key_chartype_to_abc">
<Flick>
<KeyEntity mozc:sourceId="50"
mozc:keyCode="@integer/key_chartype_to_abc"
mozc:longPressKeyCode="@integer/key_menu_dialog"
- mozc:keyIcon="@raw/twelvekeys__function__kana__icon">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__function__alphabet__popup" />
- </KeyEntity>
+ mozc:keyIcon="@raw/twelvekeys__function__kana__icon"
+ mozc:iconWidth="@dimen/unlimited"
+ mozc:iconHeight="@dimen/default_function_icon_height" />
</Flick>
</KeyState>
</Key>
+ <Spacer mozc:keyWidth="@dimen/keyboard_separator_width" mozc:keyHorizontalLayoutWeight="0"
+ mozc:keyBackground="keyboardSeparatorBottom"/>
<Key>
- <KeyState mozc:contentDescription="@string/cd_key_kana_modifier">
+ <KeyState mozc:contentDescription="@string/cd_key_kana_modifier" mozc:metaState="fallback|composing|no_globe">
<Flick>
<KeyEntity mozc:sourceId="51"
mozc:keyCode="@integer/uchar_asterisk"
mozc:keyIcon="@raw/twelvekeys__kana__10">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__kana__10" />
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__kana__popup__10" />
</KeyEntity>
</Flick>
<Flick mozc:direction="left">
@@ -587,6 +610,32 @@
</KeyEntity>
</Flick>
</KeyState>
+ <!-- Transition status from empty composition to non-empty.
+ The look is kept Globe but the behavior becomes modifier key in advance.
+ This status has been introduced because when a user touch-down a key:
+ - If the behavior is unchanged (=Globe), quick typer might fire IME changing unexpectedly.
+ - If the look is changed (=Modifier), the look blinks unexpectedly (Press a key -> The look changes to modifier -> Release the key -> The look to globe -> Composition text is updated -> The look to modifier). -->
+ <KeyState mozc:contentDescription="@string/cd_key_kana_modifier" mozc:metaState="handling_touch_event" >
+ <Flick>
+ <KeyEntity mozc:sourceId="76"
+ mozc:keyCode="@integer/uchar_asterisk"
+ mozc:keyIcon="@raw/globe_keyicon"
+ mozc:iconWidth="@dimen/unlimited"
+ mozc:iconHeight="@dimen/default_function_icon_height">
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__kana__popup__10" />
+ </KeyEntity>
+ </Flick>
+ </KeyState>
+ <KeyState mozc:contentDescription="@string/cd_key_globe" mozc:metaState="globe" >
+ <Flick>
+ <KeyEntity mozc:sourceId="75"
+ mozc:keyCode="@integer/key_globe"
+ mozc:keyIcon="@raw/globe_keyicon"
+ mozc:iconWidth="@dimen/unlimited"
+ mozc:iconHeight="@dimen/default_function_icon_height"
+ mozc:longPressKeyCode="@integer/key_ime_picker_dialog" />
+ </Flick>
+ </KeyState>
</Key>
<Key>
<KeyState mozc:contentDescription="@string/cd_key_kana_line_wa">
@@ -603,7 +652,7 @@
mozc:keyCode="@integer/uchar_plus_sign"
mozc:keyIcon="@raw/twelvekeys__kana__support__11_left"
mozc:flickHighlight="true">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__kana__keyicon__wo" />
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__wo" />
</KeyEntity>
</Flick>
<Flick mozc:direction="up">
@@ -611,7 +660,7 @@
mozc:keyCode="@integer/uchar_solidus"
mozc:keyIcon="@raw/twelvekeys__kana__support__11_up"
mozc:flickHighlight="true">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__kana__keyicon__nn" />
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__nn" />
</KeyEntity>
</Flick>
<Flick mozc:direction="right">
@@ -619,17 +668,15 @@
mozc:keyCode="@integer/uchar_hyphen_minus"
mozc:keyIcon="@raw/twelvekeys__kana__support__11_right"
mozc:flickHighlight="true">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__kana__keyicon__prolonged_sound_mark" />
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__prolonged_sound_mark" />
</KeyEntity>
</Flick>
<Flick mozc:direction="down">
- <!-- flickHighlight is intentionally false because there are no coresponding keyIcon,
- which is required for rendering flick highlight. -->
<KeyEntity mozc:sourceId="67"
mozc:keyCode="@integer/uchar_less_than_sign"
- mozc:keyIcon="@raw/qwerty__keyicon__wave_dash"
- mozc:flickHighlight="false">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__wave_dash" />
+ mozc:keyIcon="@raw/twelvekeys__kana__support__11_down"
+ mozc:flickHighlight="true">
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__wave_dash" />
</KeyEntity>
</Flick>
</KeyState>
@@ -649,7 +696,7 @@
mozc:keyCode="@integer/uchar_comma"
mozc:keyIcon="@raw/twelvekeys__kana__support__12_left"
mozc:flickHighlight="true">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__kana__keyicon__ideographic_period" />
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__ideographic_period" />
</KeyEntity>
</Flick>
<Flick mozc:direction="up">
@@ -657,7 +704,7 @@
mozc:keyCode="@integer/uchar_question_mark"
mozc:keyIcon="@raw/twelvekeys__kana__support__12_up"
mozc:flickHighlight="true">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__kana__keyicon__question_mark" />
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__question_mark" />
</KeyEntity>
</Flick>
<Flick mozc:direction="right">
@@ -665,33 +712,129 @@
mozc:keyCode="@integer/uchar_exclamation_mark"
mozc:keyIcon="@raw/twelvekeys__kana__support__12_right"
mozc:flickHighlight="true">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__kana__keyicon__exclamation_mark" />
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__exclamation_mark" />
</KeyEntity>
</Flick>
<Flick mozc:direction="down">
- <!-- flickHighlight is intentionally false because there are no coresponding keyIcon,
- which is required for rendering flick highlight. -->
<KeyEntity mozc:sourceId="66"
mozc:keyCode="@integer/uchar_greater_than_sign"
- mozc:keyIcon="@raw/qwerty__keyicon__horizontal_ellipsis"
- mozc:flickHighlight="false">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__horizontal_ellipsis" />
+ mozc:keyIcon="@raw/twelvekeys__kana__support__12_down"
+ mozc:flickHighlight="true">
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__horizontal_ellipsis" />
</KeyEntity>
</Flick>
</KeyState>
</Key>
- <Key mozc:keyBackground="twelvekeysFunction"
- mozc:keyWidth="17.3%p" mozc:keyEdgeFlags="right" mozc:isRepeatable="true">
+ <Spacer mozc:keyWidth="@dimen/keyboard_separator_width" mozc:keyHorizontalLayoutWeight="0"
+ mozc:keyBackground="keyboardSeparatorBottom"/>
+ <Key mozc:keyBackground="twelvekeysFunctionWithThreeDots" mozc:keyEdgeFlags="right"
+ mozc:keyHorizontalLayoutWeight="0"
+ mozc:defaultIconWidth="@dimen/keyboard_enter_width"
+ mozc:defaultIconHeight="@dimen/unlimited">
<KeyState mozc:contentDescription="@string/cd_key_uchar_linefeed">
<Flick>
<KeyEntity mozc:sourceId="60"
mozc:keyCode="@integer/uchar_linefeed"
- mozc:keyIcon="@raw/twelvekeys__function__enter__icon">
- <PopUp mozc:popUpIcon="@raw/qwerty__function__enter__popup" />
+ mozc:longPressKeyCode="@integer/key_symbol_emoji"
+ mozc:longPressTimeoutTrigger="false"
+ mozc:keyIcon="@raw/function__enter__icon">
+ <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+ mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
+ </KeyEntity>
+ </Flick>
+ </KeyState>
+ <KeyState mozc:contentDescription="@string/cd_key_composing_done"
+ mozc:metaState="composing">
+ <Flick>
+ <KeyEntity mozc:sourceId="68"
+ mozc:keyCode="@integer/uchar_linefeed"
+ mozc:longPressKeyCode="@integer/key_symbol_emoji"
+ mozc:longPressTimeoutTrigger="false"
+ mozc:keyIcon="@raw/function__enter__icon">
+ <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+ mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
+ </KeyEntity>
+ </Flick>
+ </KeyState>
+ <KeyState mozc:contentDescription="@string/cd_key_action_done"
+ mozc:metaState="action_done">
+ <Flick>
+ <KeyEntity mozc:sourceId="69"
+ mozc:keyCode="@integer/uchar_linefeed"
+ mozc:longPressKeyCode="@integer/key_symbol_emoji"
+ mozc:longPressTimeoutTrigger="false"
+ mozc:keyIcon="@raw/function__action_done__icon">
+ <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+ mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
+ </KeyEntity>
+ </Flick>
+ </KeyState>
+ <KeyState mozc:contentDescription="@string/cd_key_action_go"
+ mozc:metaState="action_go">
+ <Flick>
+ <KeyEntity mozc:sourceId="70"
+ mozc:keyCode="@integer/uchar_linefeed"
+ mozc:longPressKeyCode="@integer/key_symbol_emoji"
+ mozc:longPressTimeoutTrigger="false"
+ mozc:keyIcon="@raw/function__action_go__icon">
+ <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+ mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
+ </KeyEntity>
+ </Flick>
+ </KeyState>
+ <KeyState mozc:contentDescription="@string/cd_key_action_next"
+ mozc:metaState="action_next">
+ <Flick>
+ <KeyEntity mozc:sourceId="71"
+ mozc:keyCode="@integer/uchar_linefeed"
+ mozc:longPressKeyCode="@integer/key_symbol_emoji"
+ mozc:longPressTimeoutTrigger="false"
+ mozc:keyIcon="@raw/function__action_next__icon">
+ <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+ mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
+ </KeyEntity>
+ </Flick>
+ </KeyState>
+ <KeyState mozc:contentDescription="@string/cd_key_action_previous"
+ mozc:metaState="action_previous">
+ <Flick>
+ <KeyEntity mozc:sourceId="72"
+ mozc:keyCode="@integer/uchar_linefeed"
+ mozc:longPressKeyCode="@integer/key_symbol_emoji"
+ mozc:longPressTimeoutTrigger="false"
+ mozc:keyIcon="@raw/function__action_previous__icon">
+ <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+ mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
+ </KeyEntity>
+ </Flick>
+ </KeyState>
+ <KeyState mozc:contentDescription="@string/cd_key_action_search"
+ mozc:metaState="action_search">
+ <Flick>
+ <KeyEntity mozc:sourceId="73"
+ mozc:keyCode="@integer/uchar_linefeed"
+ mozc:longPressKeyCode="@integer/key_symbol_emoji"
+ mozc:longPressTimeoutTrigger="false"
+ mozc:keyIcon="@raw/function__action_search__icon">
+ <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+ mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
+ </KeyEntity>
+ </Flick>
+ </KeyState>
+ <KeyState mozc:contentDescription="@string/cd_key_action_send"
+ mozc:metaState="action_send">
+ <Flick>
+ <KeyEntity mozc:sourceId="74"
+ mozc:keyCode="@integer/uchar_linefeed"
+ mozc:longPressKeyCode="@integer/key_symbol_emoji"
+ mozc:longPressTimeoutTrigger="false"
+ mozc:keyIcon="@raw/function__action_send__icon">
+ <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+ mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
</KeyEntity>
</Flick>
</KeyState>
</Key>
</Row>
- <!-- Next sourceId: 68 -->
+ <!-- Next sourceId: 78 -->
</Keyboard>
diff --git a/src/android/static_resources/resources_oss/res/xml/kbd_12keys_kana.xml b/src/android/static_resources/resources_oss/res/xml/kbd_12keys_kana.xml
index fc61cf7..ae69ea9 100644
--- a/src/android/static_resources/resources_oss/res/xml/kbd_12keys_kana.xml
+++ b/src/android/static_resources/resources_oss/res/xml/kbd_12keys_kana.xml
@@ -33,31 +33,34 @@
xmlns:mozc="http://schemas.android.com/apk/res-auto"
mozc:keyboardContentDescription="@string/cd_keyboard_kana"
mozc:keyBackground="twelvekeysRegular"
- mozc:keyWidth="21.8%p" mozc:keyHeight="24%p"
+ mozc:keyWidth="17.3%p" mozc:keyHeight="25%p" mozc:keyHorizontalLayoutWeight="1"
mozc:horizontalGap="0dip" mozc:verticalGap="0dip"
- mozc:popUpWidth="@dimen/key_preview_height" mozc:popUpHeight="@dimen/key_preview_height"
- mozc:popUpXOffset="0dip" mozc:popUpYOffset="@dimen/mini_keyboard_vertical_correction">
- <Row mozc:rowEdgeFlags="top" mozc:keyHeight="0dip" mozc:verticalGap="4%p" />
+ mozc:popUpHeight="@dimen/key_preview_height"
+ mozc:popUpIconHeight="@dimen/key_preview_icon_height"
+ mozc:popUpXOffset="0dip" mozc:popUpYOffset="@dimen/mini_keyboard_vertical_correction"
+ mozc:defaultIconWidth="@dimen/unlimited" mozc:defaultIconHeight="@dimen/keyboard_twelvekeys_default_height">
<Row>
<Key mozc:keyBackground="twelvekeysFunction"
- mozc:keyWidth="17.3%p" mozc:keyEdgeFlags="left">
+ mozc:keyHorizontalLayoutWeight="0" mozc:keyEdgeFlags="left">
<KeyState mozc:contentDescription="@string/cd_key_undo">
<Flick>
<KeyEntity mozc:sourceId="1"
mozc:keyCode="@integer/key_undo"
- mozc:keyIcon="@raw/twelvekeys__function__undo__icon">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__function__undo__popup" />
- </KeyEntity>
+ mozc:keyIcon="@raw/twelvekeys__function__undo__icon"
+ mozc:iconWidth="@dimen/unlimited"
+ mozc:iconHeight="@dimen/default_function_icon_height" />
</Flick>
</KeyState>
</Key>
+ <Spacer mozc:keyWidth="@dimen/keyboard_separator_width" mozc:keyHorizontalLayoutWeight="0"
+ mozc:keyBackground="keyboardSeparatorTop"/>
<Key>
<KeyState mozc:contentDescription="@string/cd_key_kana_line_a">
<Flick>
<KeyEntity mozc:sourceId="2"
mozc:keyCode="@integer/uchar_digit_one"
mozc:keyIcon="@raw/twelvekeys__kana__keyicon__a">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__kana__keyicon__a" />
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__a" />
</KeyEntity>
</Flick>
</KeyState>
@@ -68,7 +71,7 @@
<KeyEntity mozc:sourceId="3"
mozc:keyCode="@integer/uchar_digit_two"
mozc:keyIcon="@raw/twelvekeys__kana__keyicon__ka">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__kana__keyicon__ka" />
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__ka" />
</KeyEntity>
</Flick>
</KeyState>
@@ -79,44 +82,48 @@
<KeyEntity mozc:sourceId="4"
mozc:keyCode="@integer/uchar_digit_three"
mozc:keyIcon="@raw/twelvekeys__kana__keyicon__sa">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__kana__keyicon__sa" />
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__sa" />
</KeyEntity>
</Flick>
</KeyState>
</Key>
+ <Spacer mozc:keyWidth="@dimen/keyboard_separator_width" mozc:keyHorizontalLayoutWeight="0"
+ mozc:keyBackground="keyboardSeparatorTop"/>
<Key mozc:keyBackground="twelvekeysFunction"
- mozc:keyWidth="17.3%p" mozc:keyEdgeFlags="right" mozc:isRepeatable="true">
+ mozc:keyHorizontalLayoutWeight="0" mozc:keyEdgeFlags="right" mozc:isRepeatable="true">
<KeyState mozc:contentDescription="@string/cd_key_uchar_backspace">
<Flick>
<KeyEntity mozc:sourceId="5"
mozc:keyCode="@integer/uchar_backspace"
- mozc:keyIcon="@raw/twelvekeys__function__delete__icon">
- <PopUp mozc:popUpIcon="@raw/qwerty__function__delete__popup" />
- </KeyEntity>
+ mozc:keyIcon="@raw/twelvekeys__function__delete__icon"
+ mozc:iconWidth="@dimen/unlimited"
+ mozc:iconHeight="@dimen/default_function_icon_height" />
</Flick>
</KeyState>
</Key>
</Row>
<Row>
<Key mozc:keyBackground="twelvekeysFunction"
- mozc:keyWidth="17.3%p" mozc:keyEdgeFlags="left" mozc:isRepeatable="true">
+ mozc:keyHorizontalLayoutWeight="0" mozc:keyEdgeFlags="left" mozc:isRepeatable="true">
<KeyState mozc:contentDescription="@string/cd_key_left">
<Flick>
<KeyEntity mozc:sourceId="6"
mozc:keyCode="@integer/key_left"
- mozc:keyIcon="@raw/twelvekeys__function__left_arrow__icon">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__function__left_arrow__popup" />
- </KeyEntity>
+ mozc:keyIcon="@raw/twelvekeys__function__left_arrow__icon"
+ mozc:iconWidth="@dimen/unlimited"
+ mozc:iconHeight="@dimen/default_function_icon_height" />
</Flick>
</KeyState>
</Key>
+ <Spacer mozc:keyWidth="@dimen/keyboard_separator_width" mozc:keyHorizontalLayoutWeight="0"
+ mozc:keyBackground="keyboardSeparatorCenter"/>
<Key>
<KeyState mozc:contentDescription="@string/cd_key_kana_line_ta">
<Flick>
<KeyEntity mozc:sourceId="7"
mozc:keyCode="@integer/uchar_digit_four"
mozc:keyIcon="@raw/twelvekeys__kana__keyicon__ta">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__kana__keyicon__ta" />
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__ta" />
</KeyEntity>
</Flick>
</KeyState>
@@ -127,7 +134,7 @@
<KeyEntity mozc:sourceId="8"
mozc:keyCode="@integer/uchar_digit_five"
mozc:keyIcon="@raw/twelvekeys__kana__keyicon__na">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__kana__keyicon__na" />
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__na" />
</KeyEntity>
</Flick>
</KeyState>
@@ -138,44 +145,56 @@
<KeyEntity mozc:sourceId="9"
mozc:keyCode="@integer/uchar_digit_six"
mozc:keyIcon="@raw/twelvekeys__kana__keyicon__ha">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__kana__keyicon__ha" />
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__ha" />
</KeyEntity>
</Flick>
</KeyState>
</Key>
+ <Spacer mozc:keyWidth="@dimen/keyboard_separator_width" mozc:keyHorizontalLayoutWeight="0"
+ mozc:keyBackground="keyboardSeparatorCenter"/>
<Key mozc:keyBackground="twelvekeysFunction"
- mozc:keyWidth="17.3%p" mozc:keyEdgeFlags="right" mozc:isRepeatable="true">
+ mozc:keyHorizontalLayoutWeight="0" mozc:keyEdgeFlags="right" mozc:isRepeatable="true">
<KeyState mozc:contentDescription="@string/cd_key_right">
<Flick>
<KeyEntity mozc:sourceId="10"
mozc:keyCode="@integer/key_right"
- mozc:keyIcon="@raw/twelvekeys__function__right_arrow__icon">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__function__right_arrow__popup" />
- </KeyEntity>
+ mozc:keyIcon="@raw/twelvekeys__function__right_arrow__icon"
+ mozc:iconWidth="@dimen/unlimited"
+ mozc:iconHeight="@dimen/default_function_icon_height" />
</Flick>
</KeyState>
</Key>
</Row>
<Row>
<Key mozc:keyBackground="twelvekeysFunction"
- mozc:keyWidth="17.3%p" mozc:keyEdgeFlags="left">
+ mozc:keyHorizontalLayoutWeight="0" mozc:keyEdgeFlags="left">
<KeyState mozc:contentDescription="@string/cd_key_symbol">
<Flick>
<KeyEntity mozc:sourceId="11"
mozc:keyCode="@integer/key_symbol"
- mozc:keyIcon="@raw/twelvekeys__function__symbol__icon">
- <PopUp mozc:popUpIcon="@raw/qwerty__function__symbol__popup" />
- </KeyEntity>
+ mozc:keyIcon="@raw/twelvekeys__function__symbol__icon"
+ mozc:iconWidth="@dimen/unlimited"
+ mozc:iconHeight="@dimen/default_function_icon_height" />
+ </Flick>
+ </KeyState>
+ <KeyState mozc:contentDescription="@string/cd_key_symbol" mozc:metaState="handling_touch_event">
+ <Flick>
+ <KeyEntity mozc:sourceId="30"
+ mozc:keyIcon="@raw/twelvekeys__function__symbol__icon"
+ mozc:iconWidth="@dimen/unlimited"
+ mozc:iconHeight="@dimen/default_function_icon_height" />
</Flick>
</KeyState>
</Key>
+ <Spacer mozc:keyWidth="@dimen/keyboard_separator_width" mozc:keyHorizontalLayoutWeight="0"
+ mozc:keyBackground="keyboardSeparatorCenter"/>
<Key>
<KeyState mozc:contentDescription="@string/cd_key_kana_line_ma">
<Flick>
<KeyEntity mozc:sourceId="12"
mozc:keyCode="@integer/uchar_digit_seven"
mozc:keyIcon="@raw/twelvekeys__kana__keyicon__ma">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__kana__keyicon__ma" />
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__ma" />
</KeyEntity>
</Flick>
</KeyState>
@@ -186,7 +205,7 @@
<KeyEntity mozc:sourceId="13"
mozc:keyCode="@integer/uchar_digit_eight"
mozc:keyIcon="@raw/twelvekeys__kana__keyicon__ya">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__kana__keyicon__ya" />
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__ya" />
</KeyEntity>
</Flick>
</KeyState>
@@ -197,49 +216,74 @@
<KeyEntity mozc:sourceId="14"
mozc:keyCode="@integer/uchar_digit_nine"
mozc:keyIcon="@raw/twelvekeys__kana__keyicon__ra">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__kana__keyicon__ra" />
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__ra" />
</KeyEntity>
</Flick>
</KeyState>
</Key>
+ <Spacer mozc:keyWidth="@dimen/keyboard_separator_width" mozc:keyHorizontalLayoutWeight="0"
+ mozc:keyBackground="keyboardSeparatorCenter"/>
<Key mozc:keyBackground="twelvekeysFunctionWithThreeDots"
- mozc:keyWidth="17.3%p" mozc:keyEdgeFlags="right">
+ mozc:keyHorizontalLayoutWeight="0" mozc:keyEdgeFlags="right">
<KeyState mozc:contentDescription="@string/cd_key_uchar_space">
<Flick>
<KeyEntity mozc:sourceId="15"
mozc:keyCode="@integer/uchar_space"
mozc:longPressKeyCode="@integer/key_ime_picker_dialog"
- mozc:keyIcon="@raw/twelvekeys__function__space__icon">
- <PopUp mozc:popUpIcon="@raw/qwerty__function__space__popup" />
- </KeyEntity>
+ mozc:keyIcon="@raw/twelvekeys__function__space__icon"
+ mozc:iconWidth="@dimen/unlimited"
+ mozc:iconHeight="@dimen/default_function_icon_height" />
</Flick>
</KeyState>
</Key>
</Row>
<Row>
<Key mozc:keyBackground="twelvekeysFunctionWithThreeDots"
- mozc:keyWidth="17.3%p" mozc:keyEdgeFlags="left">
+ mozc:keyHorizontalLayoutWeight="0" mozc:keyEdgeFlags="left">
<KeyState mozc:contentDescription="@string/cd_key_chartype_to_abc">
<Flick>
<KeyEntity mozc:sourceId="16"
mozc:keyCode="@integer/key_chartype_to_abc"
mozc:longPressKeyCode="@integer/key_menu_dialog"
- mozc:keyIcon="@raw/twelvekeys__function__kana__icon">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__function__alphabet__popup" />
- </KeyEntity>
+ mozc:keyIcon="@raw/twelvekeys__function__kana__icon"
+ mozc:iconWidth="@dimen/unlimited"
+ mozc:iconHeight="@dimen/default_function_icon_height" />
</Flick>
</KeyState>
</Key>
+ <Spacer mozc:keyWidth="@dimen/keyboard_separator_width" mozc:keyHorizontalLayoutWeight="0"
+ mozc:keyBackground="keyboardSeparatorBottom"/>
<Key>
- <KeyState mozc:contentDescription="@string/cd_key_kana_modifier">
+ <KeyState mozc:contentDescription="@string/cd_key_kana_modifier" mozc:metaState="fallback|composing|no_globe">
<Flick>
<KeyEntity mozc:sourceId="17"
mozc:keyCode="@integer/uchar_asterisk"
mozc:keyIcon="@raw/twelvekeys__kana__10">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__kana__10" />
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__kana__popup__10" />
</KeyEntity>
</Flick>
</KeyState>
+ <KeyState mozc:contentDescription="@string/cd_key_kana_modifier" mozc:metaState="handling_touch_event" >
+ <Flick>
+ <KeyEntity mozc:sourceId="29"
+ mozc:keyCode="@integer/uchar_asterisk"
+ mozc:keyIcon="@raw/globe_keyicon"
+ mozc:iconWidth="@dimen/unlimited"
+ mozc:iconHeight="@dimen/default_function_icon_height">
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__kana__popup__10" />
+ </KeyEntity>
+ </Flick>
+ </KeyState>
+ <KeyState mozc:contentDescription="@string/cd_key_globe" mozc:metaState="globe" >
+ <Flick>
+ <KeyEntity mozc:sourceId="28"
+ mozc:keyCode="@integer/key_globe"
+ mozc:keyIcon="@raw/globe_keyicon"
+ mozc:iconWidth="@dimen/unlimited"
+ mozc:iconHeight="@dimen/default_function_icon_height"
+ mozc:longPressKeyCode="@integer/key_ime_picker_dialog" />
+ </Flick>
+ </KeyState>
</Key>
<Key>
<KeyState mozc:contentDescription="@string/cd_key_kana_line_wa">
@@ -247,7 +291,7 @@
<KeyEntity mozc:sourceId="18"
mozc:keyCode="@integer/uchar_digit_zero"
mozc:keyIcon="@raw/twelvekeys__kana__keyicon__wa">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__kana__keyicon__wa" />
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__wa" />
</KeyEntity>
</Flick>
</KeyState>
@@ -263,18 +307,116 @@
</Flick>
</KeyState>
</Key>
- <Key mozc:keyBackground="twelvekeysFunction"
- mozc:keyWidth="17.3%p" mozc:keyEdgeFlags="right" mozc:isRepeatable="true">
+ <Spacer mozc:keyWidth="@dimen/keyboard_separator_width" mozc:keyHorizontalLayoutWeight="0"
+ mozc:keyBackground="keyboardSeparatorBottom"/>
+ <Key mozc:keyBackground="twelvekeysFunctionWithThreeDots"
+ mozc:keyHorizontalLayoutWeight="0" mozc:keyEdgeFlags="right"
+ mozc:defaultIconWidth="@dimen/keyboard_enter_width"
+ mozc:defaultIconHeight="@dimen/unlimited">
<KeyState mozc:contentDescription="@string/cd_key_uchar_linefeed">
<Flick>
<KeyEntity mozc:sourceId="20"
mozc:keyCode="@integer/uchar_linefeed"
- mozc:keyIcon="@raw/twelvekeys__function__enter__icon">
- <PopUp mozc:popUpIcon="@raw/qwerty__function__enter__popup" />
+ mozc:longPressKeyCode="@integer/key_symbol_emoji"
+ mozc:longPressTimeoutTrigger="false"
+ mozc:keyIcon="@raw/function__enter__icon">
+ <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+ mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
+ </KeyEntity>
+ </Flick>
+ </KeyState>
+ <KeyState mozc:contentDescription="@string/cd_key_composing_done"
+ mozc:metaState="composing">
+ <Flick>
+ <KeyEntity mozc:sourceId="21"
+ mozc:keyCode="@integer/uchar_linefeed"
+ mozc:longPressKeyCode="@integer/key_symbol_emoji"
+ mozc:longPressTimeoutTrigger="false"
+ mozc:keyIcon="@raw/function__enter__icon">
+ <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+ mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
+ </KeyEntity>
+ </Flick>
+ </KeyState>
+ <KeyState mozc:contentDescription="@string/cd_key_action_done"
+ mozc:metaState="action_done">
+ <Flick>
+ <KeyEntity mozc:sourceId="22"
+ mozc:keyCode="@integer/uchar_linefeed"
+ mozc:longPressKeyCode="@integer/key_symbol_emoji"
+ mozc:longPressTimeoutTrigger="false"
+ mozc:keyIcon="@raw/function__action_done__icon">
+ <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+ mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
+ </KeyEntity>
+ </Flick>
+ </KeyState>
+ <KeyState mozc:contentDescription="@string/cd_key_action_go"
+ mozc:metaState="action_go">
+ <Flick>
+ <KeyEntity mozc:sourceId="23"
+ mozc:keyCode="@integer/uchar_linefeed"
+ mozc:longPressKeyCode="@integer/key_symbol_emoji"
+ mozc:longPressTimeoutTrigger="false"
+ mozc:keyIcon="@raw/function__action_go__icon">
+ <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+ mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
+ </KeyEntity>
+ </Flick>
+ </KeyState>
+ <KeyState mozc:contentDescription="@string/cd_key_action_next"
+ mozc:metaState="action_next">
+ <Flick>
+ <KeyEntity mozc:sourceId="24"
+ mozc:keyCode="@integer/uchar_linefeed"
+ mozc:longPressKeyCode="@integer/key_symbol_emoji"
+ mozc:longPressTimeoutTrigger="false"
+ mozc:keyIcon="@raw/function__action_next__icon">
+ <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+ mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
+ </KeyEntity>
+ </Flick>
+ </KeyState>
+ <KeyState mozc:contentDescription="@string/cd_key_action_previous"
+ mozc:metaState="action_previous">
+ <Flick>
+ <KeyEntity mozc:sourceId="25"
+ mozc:keyCode="@integer/uchar_linefeed"
+ mozc:longPressKeyCode="@integer/key_symbol_emoji"
+ mozc:longPressTimeoutTrigger="false"
+ mozc:keyIcon="@raw/function__action_previous__icon">
+ <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+ mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
+ </KeyEntity>
+ </Flick>
+ </KeyState>
+ <KeyState mozc:contentDescription="@string/cd_key_action_search"
+ mozc:metaState="action_search">
+ <Flick>
+ <KeyEntity mozc:sourceId="26"
+ mozc:keyCode="@integer/uchar_linefeed"
+ mozc:longPressKeyCode="@integer/key_symbol_emoji"
+ mozc:longPressTimeoutTrigger="false"
+ mozc:keyIcon="@raw/function__action_search__icon">
+ <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+ mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
+ </KeyEntity>
+ </Flick>
+ </KeyState>
+ <KeyState mozc:contentDescription="@string/cd_key_action_send"
+ mozc:metaState="action_send">
+ <Flick>
+ <KeyEntity mozc:sourceId="27"
+ mozc:keyCode="@integer/uchar_linefeed"
+ mozc:longPressKeyCode="@integer/key_symbol_emoji"
+ mozc:longPressTimeoutTrigger="false"
+ mozc:keyIcon="@raw/function__action_send__icon">
+ <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+ mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
</KeyEntity>
</Flick>
</KeyState>
</Key>
</Row>
- <!-- Next sourceId: 21 -->
+ <!-- Next sourceId: 31 -->
</Keyboard>
diff --git a/src/android/static_resources/resources_oss/res/xml/kbd_12keys_qwerty_abc.xml b/src/android/static_resources/resources_oss/res/xml/kbd_12keys_qwerty_abc.xml
deleted file mode 100644
index 4df7101..0000000
--- a/src/android/static_resources/resources_oss/res/xml/kbd_12keys_qwerty_abc.xml
+++ /dev/null
@@ -1,1265 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<Keyboard
- xmlns:mozc="http://schemas.android.com/apk/res-auto"
- mozc:keyboardContentDescription="@string/cd_keyboard_alphabet"
- mozc:keyBackground="qwertyRegular"
- mozc:keyWidth="10%p" mozc:keyHeight="20.5%p"
- mozc:horizontalGap="0.3%p" mozc:verticalGap="4%p"
- mozc:popUpWidth="@dimen/key_preview_height" mozc:popUpHeight="@dimen/key_preview_height"
- mozc:popUpXOffset="0dip" mozc:popUpYOffset="@dimen/mini_keyboard_vertical_correction">
- <Row mozc:rowEdgeFlags="top" mozc:keyHeight="0dip" mozc:verticalGap="4%p" />
- <Row>
- <Key mozc:keyEdgeFlags="left">
- <KeyState mozc:contentDescription="@string/cd_key_uchar_latin_small_letter_q">
- <Flick>
- <KeyEntity mozc:sourceId="1"
- mozc:keyCode="@integer/uchar_latin_small_letter_q"
- mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_q">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_q" />
- </KeyEntity>
- </Flick>
- <Flick mozc:direction="up">
- <KeyEntity mozc:sourceId="121"
- mozc:keyCode="@integer/uchar_digit_one"
- mozc:keyIcon="@raw/qwerty__keyicon__digit_one">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__digit_one" />
- </KeyEntity>
- </Flick>
- <Flick mozc:direction="down">
- <KeyEntity mozc:sourceId="69"
- mozc:keyCode="@integer/uchar_latin_capital_letter_q"
- mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_q">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_q" />
- </KeyEntity>
- </Flick>
- </KeyState>
- <KeyState mozc:contentDescription="@string/cd_key_uchar_latin_capital_letter_q"
- mozc:metaState="shift|capsLock">
- <Flick>
- <KeyEntity mozc:sourceId="2"
- mozc:keyCode="@integer/uchar_latin_capital_letter_q"
- mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_q">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_q" />
- </KeyEntity>
- </Flick>
- <Flick mozc:direction="up">
- <KeyEntity mozc:sourceId="122"
- mozc:keyCode="@integer/uchar_digit_one"
- mozc:keyIcon="@raw/qwerty__keyicon__digit_one">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__digit_one" />
- </KeyEntity>
- </Flick>
- <Flick mozc:direction="down">
- <KeyEntity mozc:sourceId="70"
- mozc:keyCode="@integer/uchar_latin_small_letter_q"
- mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_q">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_q" />
- </KeyEntity>
- </Flick>
- </KeyState>
- </Key>
- <Key>
- <KeyState mozc:contentDescription="@string/cd_key_uchar_latin_small_letter_w">
- <Flick>
- <KeyEntity mozc:sourceId="3"
- mozc:keyCode="@integer/uchar_latin_small_letter_w"
- mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_w">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_w" />
- </KeyEntity>
- </Flick>
- <Flick mozc:direction="up">
- <KeyEntity mozc:sourceId="123"
- mozc:keyCode="@integer/uchar_digit_two"
- mozc:keyIcon="@raw/qwerty__keyicon__digit_two">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__digit_two" />
- </KeyEntity>
- </Flick>
- <Flick mozc:direction="down">
- <KeyEntity mozc:sourceId="71"
- mozc:keyCode="@integer/uchar_latin_capital_letter_w"
- mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_w">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_w" />
- </KeyEntity>
- </Flick>
- </KeyState>
- <KeyState mozc:contentDescription="@string/cd_key_uchar_latin_capital_letter_w"
- mozc:metaState="shift|capsLock">
- <Flick>
- <KeyEntity mozc:sourceId="4"
- mozc:keyCode="@integer/uchar_latin_capital_letter_w"
- mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_w">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_w" />
- </KeyEntity>
- </Flick>
- <Flick mozc:direction="up">
- <KeyEntity mozc:sourceId="124"
- mozc:keyCode="@integer/uchar_digit_two"
- mozc:keyIcon="@raw/qwerty__keyicon__digit_two">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__digit_two" />
- </KeyEntity>
- </Flick>
- <Flick mozc:direction="down">
- <KeyEntity mozc:sourceId="72"
- mozc:keyCode="@integer/uchar_latin_small_letter_w"
- mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_w">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_w" />
- </KeyEntity>
- </Flick>
- </KeyState>
- </Key>
- <Key>
- <KeyState mozc:contentDescription="@string/cd_key_uchar_latin_small_letter_e">
- <Flick>
- <KeyEntity mozc:sourceId="5"
- mozc:keyCode="@integer/uchar_latin_small_letter_e"
- mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_e">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_e" />
- </KeyEntity>
- </Flick>
- <Flick mozc:direction="up">
- <KeyEntity mozc:sourceId="125"
- mozc:keyCode="@integer/uchar_digit_three"
- mozc:keyIcon="@raw/qwerty__keyicon__digit_three">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__digit_three" />
- </KeyEntity>
- </Flick>
- <Flick mozc:direction="down">
- <KeyEntity mozc:sourceId="73"
- mozc:keyCode="@integer/uchar_latin_capital_letter_e"
- mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_e">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_e" />
- </KeyEntity>
- </Flick>
- </KeyState>
- <KeyState mozc:contentDescription="@string/cd_key_uchar_latin_capital_letter_e"
- mozc:metaState="shift|capsLock">
- <Flick>
- <KeyEntity mozc:sourceId="6"
- mozc:keyCode="@integer/uchar_latin_capital_letter_e"
- mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_e">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_e" />
- </KeyEntity>
- </Flick>
- <Flick mozc:direction="up">
- <KeyEntity mozc:sourceId="126"
- mozc:keyCode="@integer/uchar_digit_three"
- mozc:keyIcon="@raw/qwerty__keyicon__digit_three">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__digit_three" />
- </KeyEntity>
- </Flick>
- <Flick mozc:direction="down">
- <KeyEntity mozc:sourceId="74"
- mozc:keyCode="@integer/uchar_latin_small_letter_e"
- mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_e">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_e" />
- </KeyEntity>
- </Flick>
- </KeyState>
- </Key>
- <Key>
- <KeyState mozc:contentDescription="@string/cd_key_uchar_latin_small_letter_r">
- <Flick>
- <KeyEntity mozc:sourceId="7"
- mozc:keyCode="@integer/uchar_latin_small_letter_r"
- mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_r">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_r" />
- </KeyEntity>
- </Flick>
- <Flick mozc:direction="up">
- <KeyEntity mozc:sourceId="127"
- mozc:keyCode="@integer/uchar_digit_four"
- mozc:keyIcon="@raw/qwerty__keyicon__digit_four">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__digit_four" />
- </KeyEntity>
- </Flick>
- <Flick mozc:direction="down">
- <KeyEntity mozc:sourceId="75"
- mozc:keyCode="@integer/uchar_latin_capital_letter_r"
- mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_r">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_r" />
- </KeyEntity>
- </Flick>
- </KeyState>
- <KeyState mozc:contentDescription="@string/cd_key_uchar_latin_capital_letter_r"
- mozc:metaState="shift|capsLock">
- <Flick>
- <KeyEntity mozc:sourceId="8"
- mozc:keyCode="@integer/uchar_latin_capital_letter_r"
- mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_r">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_r" />
- </KeyEntity>
- </Flick>
- <Flick mozc:direction="up">
- <KeyEntity mozc:sourceId="128"
- mozc:keyCode="@integer/uchar_digit_four"
- mozc:keyIcon="@raw/qwerty__keyicon__digit_four">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__digit_four" />
- </KeyEntity>
- </Flick>
- <Flick mozc:direction="down">
- <KeyEntity mozc:sourceId="76"
- mozc:keyCode="@integer/uchar_latin_small_letter_r"
- mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_r">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_r" />
- </KeyEntity>
- </Flick>
- </KeyState>
- </Key>
- <Key>
- <KeyState mozc:contentDescription="@string/cd_key_uchar_latin_small_letter_t">
- <Flick>
- <KeyEntity mozc:sourceId="9"
- mozc:keyCode="@integer/uchar_latin_small_letter_t"
- mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_t">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_t" />
- </KeyEntity>
- </Flick>
- <Flick mozc:direction="up">
- <KeyEntity mozc:sourceId="129"
- mozc:keyCode="@integer/uchar_digit_five"
- mozc:keyIcon="@raw/qwerty__keyicon__digit_five">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__digit_five" />
- </KeyEntity>
- </Flick>
- <Flick mozc:direction="down">
- <KeyEntity mozc:sourceId="77"
- mozc:keyCode="@integer/uchar_latin_capital_letter_t"
- mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_t">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_t" />
- </KeyEntity>
- </Flick>
- </KeyState>
- <KeyState mozc:contentDescription="@string/cd_key_uchar_latin_capital_letter_t"
- mozc:metaState="shift|capsLock">
- <Flick>
- <KeyEntity mozc:sourceId="10"
- mozc:keyCode="@integer/uchar_latin_capital_letter_t"
- mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_t">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_t" />
- </KeyEntity>
- </Flick>
- <Flick mozc:direction="up">
- <KeyEntity mozc:sourceId="130"
- mozc:keyCode="@integer/uchar_digit_five"
- mozc:keyIcon="@raw/qwerty__keyicon__digit_five">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__digit_five" />
- </KeyEntity>
- </Flick>
- <Flick mozc:direction="down">
- <KeyEntity mozc:sourceId="78"
- mozc:keyCode="@integer/uchar_latin_small_letter_t"
- mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_t">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_t" />
- </KeyEntity>
- </Flick>
- </KeyState>
- </Key>
- <Key>
- <KeyState mozc:contentDescription="@string/cd_key_uchar_latin_small_letter_y">
- <Flick>
- <KeyEntity mozc:sourceId="11"
- mozc:keyCode="@integer/uchar_latin_small_letter_y"
- mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_y">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_y" />
- </KeyEntity>
- </Flick>
- <Flick mozc:direction="up">
- <KeyEntity mozc:sourceId="131"
- mozc:keyCode="@integer/uchar_digit_six"
- mozc:keyIcon="@raw/qwerty__keyicon__digit_six">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__digit_six" />
- </KeyEntity>
- </Flick>
- <Flick mozc:direction="down">
- <KeyEntity mozc:sourceId="79"
- mozc:keyCode="@integer/uchar_latin_capital_letter_y"
- mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_y">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_y" />
- </KeyEntity>
- </Flick>
- </KeyState>
- <KeyState mozc:contentDescription="@string/cd_key_uchar_latin_capital_letter_y"
- mozc:metaState="shift|capsLock">
- <Flick>
- <KeyEntity mozc:sourceId="12"
- mozc:keyCode="@integer/uchar_latin_capital_letter_y"
- mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_y">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_y" />
- </KeyEntity>
- </Flick>
- <Flick mozc:direction="up">
- <KeyEntity mozc:sourceId="132"
- mozc:keyCode="@integer/uchar_digit_six"
- mozc:keyIcon="@raw/qwerty__keyicon__digit_six">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__digit_six" />
- </KeyEntity>
- </Flick>
- <Flick mozc:direction="down">
- <KeyEntity mozc:sourceId="80"
- mozc:keyCode="@integer/uchar_latin_small_letter_y"
- mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_y">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_y" />
- </KeyEntity>
- </Flick>
- </KeyState>
- </Key>
- <Key>
- <KeyState mozc:contentDescription="@string/cd_key_uchar_latin_small_letter_u">
- <Flick>
- <KeyEntity mozc:sourceId="13"
- mozc:keyCode="@integer/uchar_latin_small_letter_u"
- mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_u">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_u" />
- </KeyEntity>
- </Flick>
- <Flick mozc:direction="up">
- <KeyEntity mozc:sourceId="133"
- mozc:keyCode="@integer/uchar_digit_seven"
- mozc:keyIcon="@raw/qwerty__keyicon__digit_seven">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__digit_seven" />
- </KeyEntity>
- </Flick>
- <Flick mozc:direction="down">
- <KeyEntity mozc:sourceId="81"
- mozc:keyCode="@integer/uchar_latin_capital_letter_u"
- mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_u">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_u" />
- </KeyEntity>
- </Flick>
- </KeyState>
- <KeyState mozc:contentDescription="@string/cd_key_uchar_latin_capital_letter_u"
- mozc:metaState="shift|capsLock">
- <Flick>
- <KeyEntity mozc:sourceId="14"
- mozc:keyCode="@integer/uchar_latin_capital_letter_u"
- mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_u">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_u" />
- </KeyEntity>
- </Flick>
- <Flick mozc:direction="up">
- <KeyEntity mozc:sourceId="134"
- mozc:keyCode="@integer/uchar_digit_seven"
- mozc:keyIcon="@raw/qwerty__keyicon__digit_seven">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__digit_seven" />
- </KeyEntity>
- </Flick>
- <Flick mozc:direction="down">
- <KeyEntity mozc:sourceId="82"
- mozc:keyCode="@integer/uchar_latin_small_letter_u"
- mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_u">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_u" />
- </KeyEntity>
- </Flick>
- </KeyState>
- </Key>
- <Key>
- <KeyState mozc:contentDescription="@string/cd_key_uchar_latin_small_letter_i">
- <Flick>
- <KeyEntity mozc:sourceId="15"
- mozc:keyCode="@integer/uchar_latin_small_letter_i"
- mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_i">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_i" />
- </KeyEntity>
- </Flick>
- <Flick mozc:direction="up">
- <KeyEntity mozc:sourceId="135"
- mozc:keyCode="@integer/uchar_digit_eight"
- mozc:keyIcon="@raw/qwerty__keyicon__digit_eight">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__digit_eight" />
- </KeyEntity>
- </Flick>
- <Flick mozc:direction="down">
- <KeyEntity mozc:sourceId="83"
- mozc:keyCode="@integer/uchar_latin_capital_letter_i"
- mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_i">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_i" />
- </KeyEntity>
- </Flick>
- </KeyState>
- <KeyState mozc:contentDescription="@string/cd_key_uchar_latin_capital_letter_i"
- mozc:metaState="shift|capsLock">
- <Flick>
- <KeyEntity mozc:sourceId="16"
- mozc:keyCode="@integer/uchar_latin_capital_letter_i"
- mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_i">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_i" />
- </KeyEntity>
- </Flick>
- <Flick mozc:direction="up">
- <KeyEntity mozc:sourceId="136"
- mozc:keyCode="@integer/uchar_digit_eight"
- mozc:keyIcon="@raw/qwerty__keyicon__digit_eight">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__digit_eight" />
- </KeyEntity>
- </Flick>
- <Flick mozc:direction="down">
- <KeyEntity mozc:sourceId="84"
- mozc:keyCode="@integer/uchar_latin_small_letter_i"
- mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_i">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_i" />
- </KeyEntity>
- </Flick>
- </KeyState>
- </Key>
- <Key>
- <KeyState mozc:contentDescription="@string/cd_key_uchar_latin_small_letter_o">
- <Flick>
- <KeyEntity mozc:sourceId="17"
- mozc:keyCode="@integer/uchar_latin_small_letter_o"
- mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_o">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_o" />
- </KeyEntity>
- </Flick>
- <Flick mozc:direction="up">
- <KeyEntity mozc:sourceId="137"
- mozc:keyCode="@integer/uchar_digit_nine"
- mozc:keyIcon="@raw/qwerty__keyicon__digit_nine">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__digit_nine" />
- </KeyEntity>
- </Flick>
- <Flick mozc:direction="down">
- <KeyEntity mozc:sourceId="85"
- mozc:keyCode="@integer/uchar_latin_capital_letter_o"
- mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_o">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_o" />
- </KeyEntity>
- </Flick>
- </KeyState>
- <KeyState mozc:contentDescription="@string/cd_key_uchar_latin_capital_letter_o"
- mozc:metaState="shift|capsLock">
- <Flick>
- <KeyEntity mozc:sourceId="18"
- mozc:keyCode="@integer/uchar_latin_capital_letter_o"
- mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_o">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_o" />
- </KeyEntity>
- </Flick>
- <Flick mozc:direction="up">
- <KeyEntity mozc:sourceId="138"
- mozc:keyCode="@integer/uchar_digit_nine"
- mozc:keyIcon="@raw/qwerty__keyicon__digit_nine">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__digit_nine" />
- </KeyEntity>
- </Flick>
- <Flick mozc:direction="down">
- <KeyEntity mozc:sourceId="86"
- mozc:keyCode="@integer/uchar_latin_small_letter_o"
- mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_o">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_o" />
- </KeyEntity>
- </Flick>
- </KeyState>
- </Key>
- <Key mozc:keyEdgeFlags="right">
- <KeyState mozc:contentDescription="@string/cd_key_uchar_latin_small_letter_p">
- <Flick>
- <KeyEntity mozc:sourceId="19"
- mozc:keyCode="@integer/uchar_latin_small_letter_p"
- mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_p">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_p" />
- </KeyEntity>
- </Flick>
- <Flick mozc:direction="up">
- <KeyEntity mozc:sourceId="139"
- mozc:keyCode="@integer/uchar_digit_zero"
- mozc:keyIcon="@raw/qwerty__keyicon__digit_zero">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__digit_zero" />
- </KeyEntity>
- </Flick>
- <Flick mozc:direction="down">
- <KeyEntity mozc:sourceId="87"
- mozc:keyCode="@integer/uchar_latin_capital_letter_p"
- mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_p">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_p" />
- </KeyEntity>
- </Flick>
- </KeyState>
- <KeyState mozc:contentDescription="@string/cd_key_uchar_latin_capital_letter_p"
- mozc:metaState="shift|capsLock">
- <Flick>
- <KeyEntity mozc:sourceId="20"
- mozc:keyCode="@integer/uchar_latin_capital_letter_p"
- mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_p">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_p" />
- </KeyEntity>
- </Flick>
- <Flick mozc:direction="up">
- <KeyEntity mozc:sourceId="140"
- mozc:keyCode="@integer/uchar_digit_zero"
- mozc:keyIcon="@raw/qwerty__keyicon__digit_zero">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__digit_zero" />
- </KeyEntity>
- </Flick>
- <Flick mozc:direction="down">
- <KeyEntity mozc:sourceId="88"
- mozc:keyCode="@integer/uchar_latin_small_letter_p"
- mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_p">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_p" />
- </KeyEntity>
- </Flick>
- </KeyState>
- </Key>
- </Row>
- <Row>
- <Spacer mozc:horizontalGap="5%p" />
- <Key mozc:keyEdgeFlags="left">
- <KeyState mozc:contentDescription="@string/cd_key_uchar_latin_small_letter_a">
- <Flick>
- <KeyEntity mozc:sourceId="21"
- mozc:keyCode="@integer/uchar_latin_small_letter_a"
- mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_a">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_a" />
- </KeyEntity>
- </Flick>
- <Flick mozc:direction="down">
- <KeyEntity mozc:sourceId="89"
- mozc:keyCode="@integer/uchar_latin_capital_letter_a"
- mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_a">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_a" />
- </KeyEntity>
- </Flick>
- </KeyState>
- <KeyState mozc:contentDescription="@string/cd_key_uchar_latin_capital_letter_a"
- mozc:metaState="shift|capsLock">
- <Flick>
- <KeyEntity mozc:sourceId="22"
- mozc:keyCode="@integer/uchar_latin_capital_letter_a"
- mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_a">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_a" />
- </KeyEntity>
- </Flick>
- <Flick mozc:direction="down">
- <KeyEntity mozc:sourceId="90"
- mozc:keyCode="@integer/uchar_latin_small_letter_a"
- mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_a">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_a" />
- </KeyEntity>
- </Flick>
- </KeyState>
- </Key>
- <Key>
- <KeyState mozc:contentDescription="@string/cd_key_uchar_latin_small_letter_s">
- <Flick>
- <KeyEntity mozc:sourceId="23"
- mozc:keyCode="@integer/uchar_latin_small_letter_s"
- mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_s">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_s" />
- </KeyEntity>
- </Flick>
- <Flick mozc:direction="down">
- <KeyEntity mozc:sourceId="91"
- mozc:keyCode="@integer/uchar_latin_capital_letter_s"
- mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_s">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_s" />
- </KeyEntity>
- </Flick>
- </KeyState>
- <KeyState mozc:contentDescription="@string/cd_key_uchar_latin_capital_letter_s"
- mozc:metaState="shift|capsLock">
- <Flick>
- <KeyEntity mozc:sourceId="24"
- mozc:keyCode="@integer/uchar_latin_capital_letter_s"
- mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_s">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_s" />
- </KeyEntity>
- </Flick>
- <Flick mozc:direction="down">
- <KeyEntity mozc:sourceId="92"
- mozc:keyCode="@integer/uchar_latin_small_letter_s"
- mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_s">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_s" />
- </KeyEntity>
- </Flick>
- </KeyState>
- </Key>
- <Key>
- <KeyState mozc:contentDescription="@string/cd_key_uchar_latin_small_letter_d">
- <Flick>
- <KeyEntity mozc:sourceId="25"
- mozc:keyCode="@integer/uchar_latin_small_letter_d"
- mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_d">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_d" />
- </KeyEntity>
- </Flick>
- <Flick mozc:direction="down">
- <KeyEntity mozc:sourceId="93"
- mozc:keyCode="@integer/uchar_latin_capital_letter_d"
- mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_d">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_d" />
- </KeyEntity>
- </Flick>
- </KeyState>
- <KeyState mozc:contentDescription="@string/cd_key_uchar_latin_capital_letter_d"
- mozc:metaState="shift|capsLock">
- <Flick>
- <KeyEntity mozc:sourceId="26"
- mozc:keyCode="@integer/uchar_latin_capital_letter_d"
- mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_d">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_d" />
- </KeyEntity>
- </Flick>
- <Flick mozc:direction="down">
- <KeyEntity mozc:sourceId="94"
- mozc:keyCode="@integer/uchar_latin_small_letter_d"
- mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_d">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_d" />
- </KeyEntity>
- </Flick>
- </KeyState>
- </Key>
- <Key>
- <KeyState mozc:contentDescription="@string/cd_key_uchar_latin_small_letter_f">
- <Flick>
- <KeyEntity mozc:sourceId="27"
- mozc:keyCode="@integer/uchar_latin_small_letter_f"
- mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_f">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_f" />
- </KeyEntity>
- </Flick>
- <Flick mozc:direction="down">
- <KeyEntity mozc:sourceId="95"
- mozc:keyCode="@integer/uchar_latin_capital_letter_f"
- mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_f">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_f" />
- </KeyEntity>
- </Flick>
- </KeyState>
- <KeyState mozc:contentDescription="@string/cd_key_uchar_latin_capital_letter_f"
- mozc:metaState="shift|capsLock">
- <Flick>
- <KeyEntity mozc:sourceId="28"
- mozc:keyCode="@integer/uchar_latin_capital_letter_f"
- mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_f">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_f" />
- </KeyEntity>
- </Flick>
- <Flick mozc:direction="down">
- <KeyEntity mozc:sourceId="96"
- mozc:keyCode="@integer/uchar_latin_small_letter_f"
- mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_f">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_f" />
- </KeyEntity>
- </Flick>
- </KeyState>
- </Key>
- <Key>
- <KeyState mozc:contentDescription="@string/cd_key_uchar_latin_small_letter_g">
- <Flick>
- <KeyEntity mozc:sourceId="29"
- mozc:keyCode="@integer/uchar_latin_small_letter_g"
- mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_g">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_g" />
- </KeyEntity>
- </Flick>
- <Flick mozc:direction="down">
- <KeyEntity mozc:sourceId="97"
- mozc:keyCode="@integer/uchar_latin_capital_letter_g"
- mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_g">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_g" />
- </KeyEntity>
- </Flick>
- </KeyState>
- <KeyState mozc:contentDescription="@string/cd_key_uchar_latin_capital_letter_g"
- mozc:metaState="shift|capsLock">
- <Flick>
- <KeyEntity mozc:sourceId="30"
- mozc:keyCode="@integer/uchar_latin_capital_letter_g"
- mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_g">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_g" />
- </KeyEntity>
- </Flick>
- <Flick mozc:direction="down">
- <KeyEntity mozc:sourceId="98"
- mozc:keyCode="@integer/uchar_latin_small_letter_g"
- mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_g">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_g" />
- </KeyEntity>
- </Flick>
- </KeyState>
- </Key>
- <Key>
- <KeyState mozc:contentDescription="@string/cd_key_uchar_latin_small_letter_h">
- <Flick>
- <KeyEntity mozc:sourceId="31"
- mozc:keyCode="@integer/uchar_latin_small_letter_h"
- mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_h">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_h" />
- </KeyEntity>
- </Flick>
- <Flick mozc:direction="down">
- <KeyEntity mozc:sourceId="99"
- mozc:keyCode="@integer/uchar_latin_capital_letter_h"
- mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_h">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_h" />
- </KeyEntity>
- </Flick>
- </KeyState>
- <KeyState mozc:contentDescription="@string/cd_key_uchar_latin_capital_letter_h"
- mozc:metaState="shift|capsLock">
- <Flick>
- <KeyEntity mozc:sourceId="32"
- mozc:keyCode="@integer/uchar_latin_capital_letter_h"
- mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_h">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_h" />
- </KeyEntity>
- </Flick>
- <Flick mozc:direction="down">
- <KeyEntity mozc:sourceId="100"
- mozc:keyCode="@integer/uchar_latin_small_letter_h"
- mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_h">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_h" />
- </KeyEntity>
- </Flick>
- </KeyState>
- </Key>
- <Key>
- <KeyState mozc:contentDescription="@string/cd_key_uchar_latin_small_letter_j">
- <Flick>
- <KeyEntity mozc:sourceId="33"
- mozc:keyCode="@integer/uchar_latin_small_letter_j"
- mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_j">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_j" />
- </KeyEntity>
- </Flick>
- <Flick mozc:direction="down">
- <KeyEntity mozc:sourceId="101"
- mozc:keyCode="@integer/uchar_latin_capital_letter_j"
- mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_j">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_j" />
- </KeyEntity>
- </Flick>
- </KeyState>
- <KeyState mozc:contentDescription="@string/cd_key_uchar_latin_capital_letter_j"
- mozc:metaState="shift|capsLock">
- <Flick>
- <KeyEntity mozc:sourceId="34"
- mozc:keyCode="@integer/uchar_latin_capital_letter_j"
- mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_j">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_j" />
- </KeyEntity>
- </Flick>
- <Flick mozc:direction="down">
- <KeyEntity mozc:sourceId="102"
- mozc:keyCode="@integer/uchar_latin_small_letter_j"
- mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_j">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_j" />
- </KeyEntity>
- </Flick>
- </KeyState>
- </Key>
- <Key>
- <KeyState mozc:contentDescription="@string/cd_key_uchar_latin_small_letter_k">
- <Flick>
- <KeyEntity mozc:sourceId="35"
- mozc:keyCode="@integer/uchar_latin_small_letter_k"
- mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_k">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_k" />
- </KeyEntity>
- </Flick>
- <Flick mozc:direction="down">
- <KeyEntity mozc:sourceId="103"
- mozc:keyCode="@integer/uchar_latin_capital_letter_k"
- mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_k">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_k" />
- </KeyEntity>
- </Flick>
- </KeyState>
- <KeyState mozc:contentDescription="@string/cd_key_uchar_latin_capital_letter_k"
- mozc:metaState="shift|capsLock">
- <Flick>
- <KeyEntity mozc:sourceId="36"
- mozc:keyCode="@integer/uchar_latin_capital_letter_k"
- mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_k">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_k" />
- </KeyEntity>
- </Flick>
- <Flick mozc:direction="down">
- <KeyEntity mozc:sourceId="104"
- mozc:keyCode="@integer/uchar_latin_small_letter_k"
- mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_k">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_k" />
- </KeyEntity>
- </Flick>
- </KeyState>
- </Key>
- <Key mozc:keyEdgeFlags="right">
- <KeyState mozc:contentDescription="@string/cd_key_uchar_latin_small_letter_l">
- <Flick>
- <KeyEntity mozc:sourceId="37"
- mozc:keyCode="@integer/uchar_latin_small_letter_l"
- mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_l">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_l" />
- </KeyEntity>
- </Flick>
- <Flick mozc:direction="down">
- <KeyEntity mozc:sourceId="105"
- mozc:keyCode="@integer/uchar_latin_capital_letter_l"
- mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_l">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_l" />
- </KeyEntity>
- </Flick>
- </KeyState>
- <KeyState mozc:contentDescription="@string/cd_key_uchar_latin_capital_letter_l"
- mozc:metaState="shift|capsLock">
- <Flick>
- <KeyEntity mozc:sourceId="38"
- mozc:keyCode="@integer/uchar_latin_capital_letter_l"
- mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_l">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_l" />
- </KeyEntity>
- </Flick>
- <Flick mozc:direction="down">
- <KeyEntity mozc:sourceId="106"
- mozc:keyCode="@integer/uchar_latin_small_letter_l"
- mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_l">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_l" />
- </KeyEntity>
- </Flick>
- </KeyState>
- </Key>
- <Spacer mozc:horizontalGap="5%p" />
- </Row>
- <Row>
- <Key mozc:keyBackground="qwertyFunction"
- mozc:keyWidth="13%p" mozc:keyEdgeFlags="left"
- mozc:isSticky="true" mozc:isModifier="true">
- <KeyState mozc:contentDescription="@string/cd_key_shift"
- mozc:nextMetaState="shift">
- <Flick>
- <KeyEntity mozc:sourceId="39"
- mozc:keyCode="@integer/key_capslock"
- mozc:keyIcon="@raw/qwerty__shift_off" />
- </Flick>
- </KeyState>
- <KeyState mozc:contentDescription="@string/cd_key_capslock"
- mozc:metaState="shift" mozc:nextMetaState="capsLock"
- mozc:nextRemovedMetaStates="shift">
- <Flick>
- <KeyEntity mozc:sourceId="40"
- mozc:keyCode="@integer/key_capslock"
- mozc:keyIcon="@raw/qwerty__shift_on" />
- </Flick>
- </KeyState>
- <KeyState mozc:contentDescription="@string/cd_key_capsunlock"
- mozc:metaState="capsLock" mozc:nextRemovedMetaStates="capsLock">
- <Flick>
- <KeyEntity mozc:sourceId="41"
- mozc:keyCode="@integer/key_capslock"
- mozc:keyIcon="@raw/qwerty__caps_on" />
- </Flick>
- </KeyState>
- </Key>
- <Spacer mozc:horizontalGap="2%" mozc:stick="right" />
- <Key>
- <KeyState mozc:contentDescription="@string/cd_key_uchar_latin_small_letter_z">
- <Flick>
- <KeyEntity mozc:sourceId="42"
- mozc:keyCode="@integer/uchar_latin_small_letter_z"
- mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_z">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_z" />
- </KeyEntity>
- </Flick>
- <Flick mozc:direction="down">
- <KeyEntity mozc:sourceId="107"
- mozc:keyCode="@integer/uchar_latin_capital_letter_z"
- mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_z">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_z" />
- </KeyEntity>
- </Flick>
- </KeyState>
- <KeyState mozc:contentDescription="@string/cd_key_uchar_latin_capital_letter_z"
- mozc:metaState="shift|capsLock">
- <Flick>
- <KeyEntity mozc:sourceId="43"
- mozc:keyCode="@integer/uchar_latin_capital_letter_z"
- mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_z">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_z" />
- </KeyEntity>
- </Flick>
- <Flick mozc:direction="down">
- <KeyEntity mozc:sourceId="108"
- mozc:keyCode="@integer/uchar_latin_small_letter_z"
- mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_z">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_z" />
- </KeyEntity>
- </Flick>
- </KeyState>
- </Key>
- <Key>
- <KeyState mozc:contentDescription="@string/cd_key_uchar_latin_small_letter_x">
- <Flick>
- <KeyEntity mozc:sourceId="44"
- mozc:keyCode="@integer/uchar_latin_small_letter_x"
- mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_x">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_x" />
- </KeyEntity>
- </Flick>
- <Flick mozc:direction="down">
- <KeyEntity mozc:sourceId="109"
- mozc:keyCode="@integer/uchar_latin_capital_letter_x"
- mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_x">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_x" />
- </KeyEntity>
- </Flick>
- </KeyState>
- <KeyState mozc:contentDescription="@string/cd_key_uchar_latin_capital_letter_x"
- mozc:metaState="shift|capsLock">
- <Flick>
- <KeyEntity mozc:sourceId="45"
- mozc:keyCode="@integer/uchar_latin_capital_letter_x"
- mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_x">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_x" />
- </KeyEntity>
- </Flick>
- <Flick mozc:direction="down">
- <KeyEntity mozc:sourceId="110"
- mozc:keyCode="@integer/uchar_latin_small_letter_x"
- mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_x">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_x" />
- </KeyEntity>
- </Flick>
- </KeyState>
- </Key>
- <Key>
- <KeyState mozc:contentDescription="@string/cd_key_uchar_latin_small_letter_c">
- <Flick>
- <KeyEntity mozc:sourceId="46"
- mozc:keyCode="@integer/uchar_latin_small_letter_c"
- mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_c">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_c" />
- </KeyEntity>
- </Flick>
- <Flick mozc:direction="down">
- <KeyEntity mozc:sourceId="111"
- mozc:keyCode="@integer/uchar_latin_capital_letter_c"
- mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_c">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_c" />
- </KeyEntity>
- </Flick>
- </KeyState>
- <KeyState mozc:contentDescription="@string/cd_key_uchar_latin_capital_letter_c"
- mozc:metaState="shift|capsLock">
- <Flick>
- <KeyEntity mozc:sourceId="47"
- mozc:keyCode="@integer/uchar_latin_capital_letter_c"
- mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_c">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_c" />
- </KeyEntity>
- </Flick>
- <Flick mozc:direction="down">
- <KeyEntity mozc:sourceId="112"
- mozc:keyCode="@integer/uchar_latin_small_letter_c"
- mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_c">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_c" />
- </KeyEntity>
- </Flick>
- </KeyState>
- </Key>
- <Key>
- <KeyState mozc:contentDescription="@string/cd_key_uchar_latin_small_letter_v">
- <Flick>
- <KeyEntity mozc:sourceId="48"
- mozc:keyCode="@integer/uchar_latin_small_letter_v"
- mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_v">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_v" />
- </KeyEntity>
- </Flick>
- <Flick mozc:direction="down">
- <KeyEntity mozc:sourceId="113"
- mozc:keyCode="@integer/uchar_latin_capital_letter_v"
- mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_v">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_v" />
- </KeyEntity>
- </Flick>
- </KeyState>
- <KeyState mozc:contentDescription="@string/cd_key_uchar_latin_capital_letter_v"
- mozc:metaState="shift|capsLock">
- <Flick>
- <KeyEntity mozc:sourceId="49"
- mozc:keyCode="@integer/uchar_latin_capital_letter_v"
- mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_v">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_v" />
- </KeyEntity>
- </Flick>
- <Flick mozc:direction="down">
- <KeyEntity mozc:sourceId="114"
- mozc:keyCode="@integer/uchar_latin_small_letter_v"
- mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_v">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_v" />
- </KeyEntity>
- </Flick>
- </KeyState>
- </Key>
- <Key>
- <KeyState mozc:contentDescription="@string/cd_key_uchar_latin_small_letter_b">
- <Flick>
- <KeyEntity mozc:sourceId="50"
- mozc:keyCode="@integer/uchar_latin_small_letter_b"
- mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_b">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_b" />
- </KeyEntity>
- </Flick>
- <Flick mozc:direction="down">
- <KeyEntity mozc:sourceId="115"
- mozc:keyCode="@integer/uchar_latin_capital_letter_b"
- mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_b">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_b" />
- </KeyEntity>
- </Flick>
- </KeyState>
- <KeyState mozc:contentDescription="@string/cd_key_uchar_latin_capital_letter_b"
- mozc:metaState="shift|capsLock">
- <Flick>
- <KeyEntity mozc:sourceId="51"
- mozc:keyCode="@integer/uchar_latin_capital_letter_b"
- mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_b">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_b" />
- </KeyEntity>
- </Flick>
- <Flick mozc:direction="down">
- <KeyEntity mozc:sourceId="116"
- mozc:keyCode="@integer/uchar_latin_small_letter_b"
- mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_b">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_b" />
- </KeyEntity>
- </Flick>
- </KeyState>
- </Key>
- <Key>
- <KeyState mozc:contentDescription="@string/cd_key_uchar_latin_small_letter_n">
- <Flick>
- <KeyEntity mozc:sourceId="52"
- mozc:keyCode="@integer/uchar_latin_small_letter_n"
- mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_n">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_n" />
- </KeyEntity>
- </Flick>
- <Flick mozc:direction="down">
- <KeyEntity mozc:sourceId="117"
- mozc:keyCode="@integer/uchar_latin_capital_letter_n"
- mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_n">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_n" />
- </KeyEntity>
- </Flick>
- </KeyState>
- <KeyState mozc:contentDescription="@string/cd_key_uchar_latin_capital_letter_n"
- mozc:metaState="shift|capsLock">
- <Flick>
- <KeyEntity mozc:sourceId="53"
- mozc:keyCode="@integer/uchar_latin_capital_letter_n"
- mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_n">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_n" />
- </KeyEntity>
- </Flick>
- <Flick mozc:direction="down">
- <KeyEntity mozc:sourceId="118"
- mozc:keyCode="@integer/uchar_latin_small_letter_n"
- mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_n">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_n" />
- </KeyEntity>
- </Flick>
- </KeyState>
- </Key>
- <Key>
- <KeyState mozc:contentDescription="@string/cd_key_uchar_latin_small_letter_m">
- <Flick>
- <KeyEntity mozc:sourceId="54"
- mozc:keyCode="@integer/uchar_latin_small_letter_m"
- mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_m">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_m" />
- </KeyEntity>
- </Flick>
- <Flick mozc:direction="down">
- <KeyEntity mozc:sourceId="119"
- mozc:keyCode="@integer/uchar_latin_capital_letter_m"
- mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_m">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_m" />
- </KeyEntity>
- </Flick>
- </KeyState>
- <KeyState mozc:contentDescription="@string/cd_key_uchar_latin_capital_letter_m"
- mozc:metaState="shift|capsLock">
- <Flick>
- <KeyEntity mozc:sourceId="55"
- mozc:keyCode="@integer/uchar_latin_capital_letter_m"
- mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_m">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_m" />
- </KeyEntity>
- </Flick>
- <Flick mozc:direction="down">
- <KeyEntity mozc:sourceId="120"
- mozc:keyCode="@integer/uchar_latin_small_letter_m"
- mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_m">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_m" />
- </KeyEntity>
- </Flick>
- </KeyState>
- </Key>
- <Spacer mozc:horizontalGap="2%" mozc:stick="left" />
- <Key mozc:keyBackground="qwertyFunction"
- mozc:keyWidth="13%p" mozc:keyEdgeFlags="right" mozc:isRepeatable="true">
- <KeyState mozc:contentDescription="@string/cd_key_uchar_backspace">
- <Flick>
- <KeyEntity mozc:sourceId="56"
- mozc:keyCode="@integer/key_backspace"
- mozc:keyIcon="@raw/qwerty__function__delete__icon">
- <PopUp mozc:popUpIcon="@raw/qwerty__function__delete__popup" />
- </KeyEntity>
- </Flick>
- </KeyState>
- </Key>
- </Row>
- <Row>
- <Key mozc:keyBackground="qwertyFunctionWithThreeDots"
- mozc:keyWidth="13%p" mozc:keyEdgeFlags="left">
- <KeyState mozc:contentDescription="@string/cd_key_chartype_to_123">
- <Flick>
- <KeyEntity mozc:sourceId="57"
- mozc:keyCode="@integer/key_chartype_to_123"
- mozc:longPressKeyCode="@integer/key_menu_dialog"
- mozc:keyIcon="@raw/twelvekeys__function__alphabet__icon">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__function__number__popup" />
- </KeyEntity>
- </Flick>
- </KeyState>
- </Key>
- <Key mozc:keyBackground="qwertyFunction"
- mozc:keyWidth="13%p">
- <KeyState mozc:contentDescription="@string/cd_key_chartype_to_abc_123">
- <Flick>
- <KeyEntity mozc:sourceId="58"
- mozc:keyCode="@integer/key_chartype_to_abc_123"
- mozc:keyIcon="@raw/qwerty__function__number_alphabet__icon">
- <PopUp mozc:popUpIcon="@raw/qwerty__function__number_alphabet__popup" />
- </KeyEntity>
- </Flick>
- </KeyState>
- </Key>
- <Key mozc:keyBackground="qwertyFunction"
- mozc:keyWidth="10%p">
- <KeyState mozc:contentDescription="@string/cd_key_uchar_comma">
- <Flick>
- <KeyEntity mozc:sourceId="59"
- mozc:keyCode="@integer/uchar_comma"
- mozc:keyIcon="@raw/qwerty__function__comma">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__comma" />
- </KeyEntity>
- </Flick>
- </KeyState>
- <KeyState mozc:contentDescription="@string/cd_key_uchar_solidus"
- mozc:metaState="variation_uri" >
- <Flick>
- <KeyEntity mozc:sourceId="141"
- mozc:keyCode="@integer/uchar_solidus"
- mozc:keyIcon="@raw/qwerty__function__solidus">
- <PopUp mozc:popUpIcon="@raw/qwerty__function__solidus" />
- </KeyEntity>
- </Flick>
- </KeyState>
- <KeyState mozc:contentDescription="@string/cd_key_uchar_commercial_at"
- mozc:metaState="variation_email_address" >
- <Flick>
- <KeyEntity mozc:sourceId="142"
- mozc:keyCode="@integer/uchar_commercial_at"
- mozc:keyIcon="@raw/qwerty__function__commercial_at">
- <PopUp mozc:popUpIcon="@raw/qwerty__function__commercial_at" />
- </KeyEntity>
- </Flick>
- </KeyState>
- </Key>
- <Key mozc:keyBackground="qwertyFunctionWithThreeDots"
- mozc:keyWidth="21%p">
- <KeyState mozc:contentDescription="@string/cd_key_uchar_space">
- <Flick>
- <KeyEntity mozc:sourceId="60"
- mozc:keyCode="@integer/uchar_space"
- mozc:longPressKeyCode="@integer/key_ime_picker_dialog"
- mozc:keyIcon="@raw/qwerty__function__space__icon">
- <PopUp mozc:popUpIcon="@raw/qwerty__function__space__popup" />
- </KeyEntity>
- </Flick>
- </KeyState>
- </Key>
- <Key mozc:keyBackground="qwertyFunction"
- mozc:keyWidth="10%p">
- <KeyState mozc:contentDescription="@string/cd_key_uchar_full_stop">
- <Flick>
- <KeyEntity mozc:sourceId="61"
- mozc:keyCode="@integer/uchar_full_stop"
- mozc:keyIcon="@raw/qwerty__function__full_stop">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__full_stop" />
- </KeyEntity>
- </Flick>
- </KeyState>
- </Key>
- <Key mozc:keyBackground="qwertyFunction"
- mozc:keyWidth="10%p"
- mozc:isRepeatable="true">
- <KeyState mozc:contentDescription="@string/cd_key_left">
- <Flick>
- <KeyEntity mozc:sourceId="66"
- mozc:keyCode="@integer/key_left"
- mozc:keyIcon="@raw/twelvekeys__function__left_arrow__icon">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__function__left_arrow__popup" />
- </KeyEntity>
- </Flick>
- </KeyState>
- </Key>
- <Key mozc:keyBackground="qwertyFunction"
- mozc:keyWidth="10%p"
- mozc:isRepeatable="true">
- <KeyState mozc:contentDescription="@string/cd_key_right">
- <Flick>
- <KeyEntity mozc:sourceId="67"
- mozc:keyCode="@integer/key_right"
- mozc:keyIcon="@raw/twelvekeys__function__right_arrow__icon">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__function__right_arrow__popup" />
- </KeyEntity>
- </Flick>
- </KeyState>
- </Key>
- <Key mozc:keyBackground="qwertyFunction"
- mozc:keyWidth="13%p" mozc:keyEdgeFlags="right" mozc:isRepeatable="true">
- <KeyState mozc:contentDescription="@string/cd_key_uchar_linefeed">
- <Flick>
- <KeyEntity mozc:sourceId="63"
- mozc:keyCode="@integer/uchar_linefeed"
- mozc:keyIcon="@raw/qwerty__function__enter__icon">
- <PopUp mozc:popUpIcon="@raw/qwerty__function__enter__popup" />
- </KeyEntity>
- </Flick>
- </KeyState>
- </Key>
- </Row>
- <!-- Next sourceId: 143 -->
-</Keyboard>
diff --git a/src/android/static_resources/resources_oss/res/xml/kbd_godan_kana.xml b/src/android/static_resources/resources_oss/res/xml/kbd_godan_kana.xml
index 192852b..b83c468 100644
--- a/src/android/static_resources/resources_oss/res/xml/kbd_godan_kana.xml
+++ b/src/android/static_resources/resources_oss/res/xml/kbd_godan_kana.xml
@@ -58,24 +58,27 @@
mozc:keyboardContentDescription="@string/cd_keyboard_kana"
mozc:flickThreshold="32dip"
mozc:keyBackground="twelvekeysRegular"
- mozc:keyWidth="21.8%p" mozc:keyHeight="19.2%p"
+ mozc:keyWidth="17.3%p" mozc:keyHeight="20%p" mozc:keyHorizontalLayoutWeight="1"
mozc:horizontalGap="0dip" mozc:verticalGap="0dip"
- mozc:popUpWidth="@dimen/key_preview_height" mozc:popUpHeight="@dimen/key_preview_height"
- mozc:popUpXOffset="0dip" mozc:popUpYOffset="@dimen/mini_keyboard_vertical_correction">
- <Row mozc:rowEdgeFlags="top" mozc:keyHeight="0dip" mozc:verticalGap="4%p"/>
+ mozc:popUpHeight="@dimen/key_preview_height"
+ mozc:popUpIconHeight="@dimen/key_preview_icon_height"
+ mozc:popUpXOffset="0dip" mozc:popUpYOffset="@dimen/mini_keyboard_vertical_correction"
+ mozc:defaultIconWidth="@dimen/unlimited" mozc:defaultIconHeight="@dimen/keyboard_godan_default_height">
<Row>
<Key mozc:keyBackground="twelvekeysFunction"
- mozc:keyWidth="17.3%p" mozc:keyEdgeFlags="left">
+ mozc:keyHorizontalLayoutWeight="0" mozc:keyEdgeFlags="left">
<KeyState mozc:contentDescription="@string/cd_key_undo">
<Flick>
<KeyEntity mozc:sourceId="101"
mozc:keyCode="@integer/key_undo"
- mozc:keyIcon="@raw/godan__function__undo__icon">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__function__undo__popup"/>
- </KeyEntity>
+ mozc:keyIcon="@raw/twelvekeys__function__undo__icon"
+ mozc:iconWidth="@dimen/unlimited"
+ mozc:iconHeight="@dimen/default_function_icon_height" />
</Flick>
</KeyState>
</Key>
+ <Spacer mozc:keyWidth="@dimen/keyboard_separator_width" mozc:keyHorizontalLayoutWeight="0"
+ mozc:keyBackground="keyboardSeparatorTop"/>
<Key>
<KeyState mozc:contentDescription="@string/cd_key_uchar_latin_small_letter_a">
<Flick>
@@ -115,7 +118,7 @@
mozc:keyCode="@integer/uchar_digit_one"
mozc:keyIcon="@raw/godan__kana__support__01_down"
mozc:flickHighlight="true">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__digit_one"/>
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__one"/>
</KeyEntity>
</Flick>
</KeyState>
@@ -135,7 +138,7 @@
mozc:keyCode="@integer/uchar_latin_small_letter_q"
mozc:keyIcon="@raw/godan__kana__support__02_up"
mozc:flickHighlight="true">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_q"/>
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__latin_q"/>
</KeyEntity>
</Flick>
<Flick mozc:direction="right">
@@ -143,7 +146,7 @@
mozc:keyCode="@integer/uchar_latin_small_letter_g"
mozc:keyIcon="@raw/godan__kana__support__02_right"
mozc:flickHighlight="true">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_g"/>
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__latin_g"/>
</KeyEntity>
</Flick>
<Flick mozc:direction="down">
@@ -151,7 +154,7 @@
mozc:keyCode="@integer/uchar_digit_two"
mozc:keyIcon="@raw/godan__kana__support__02_down"
mozc:flickHighlight="true">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__digit_two"/>
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__two"/>
</KeyEntity>
</Flick>
</KeyState>
@@ -171,7 +174,7 @@
mozc:keyCode="@integer/uchar_latin_small_letter_p"
mozc:keyIcon="@raw/godan__kana__support__03_left"
mozc:flickHighlight="true">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_p"/>
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__latin_p"/>
</KeyEntity>
</Flick>
<Flick mozc:direction="up">
@@ -179,7 +182,7 @@
mozc:keyCode="@integer/uchar_latin_small_letter_f"
mozc:keyIcon="@raw/godan__kana__support__03_up"
mozc:flickHighlight="true">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_f"/>
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__latin_f"/>
</KeyEntity>
</Flick>
<Flick mozc:direction="right">
@@ -187,7 +190,7 @@
mozc:keyCode="@integer/uchar_latin_small_letter_b"
mozc:keyIcon="@raw/godan__kana__support__03_right"
mozc:flickHighlight="true">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_b"/>
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__latin_b"/>
</KeyEntity>
</Flick>
<Flick mozc:direction="down">
@@ -195,37 +198,41 @@
mozc:keyCode="@integer/uchar_digit_three"
mozc:keyIcon="@raw/godan__kana__support__03_down"
mozc:flickHighlight="true">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__digit_three"/>
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__three"/>
</KeyEntity>
</Flick>
</KeyState>
</Key>
+ <Spacer mozc:keyWidth="@dimen/keyboard_separator_width" mozc:keyHorizontalLayoutWeight="0"
+ mozc:keyBackground="keyboardSeparatorTop"/>
<Key mozc:keyBackground="twelvekeysFunction"
- mozc:keyWidth="17.3%p" mozc:keyEdgeFlags="right" mozc:isRepeatable="true">
+ mozc:keyHorizontalLayoutWeight="0" mozc:keyEdgeFlags="right" mozc:isRepeatable="true">
<KeyState mozc:contentDescription="@string/cd_key_uchar_backspace">
<Flick>
<KeyEntity mozc:sourceId="102"
mozc:keyCode="@integer/uchar_backspace"
- mozc:keyIcon="@raw/godan__function__delete__icon">
- <PopUp mozc:popUpIcon="@raw/qwerty__function__delete__popup"/>
- </KeyEntity>
+ mozc:keyIcon="@raw/twelvekeys__function__delete__icon"
+ mozc:iconWidth="@dimen/unlimited"
+ mozc:iconHeight="@dimen/default_function_icon_height" />
</Flick>
</KeyState>
</Key>
</Row>
<Row>
<Key mozc:keyBackground="twelvekeysFunction"
- mozc:keyWidth="17.3%p" mozc:keyEdgeFlags="left" mozc:isRepeatable="true">
+ mozc:keyHorizontalLayoutWeight="0" mozc:keyEdgeFlags="left" mozc:isRepeatable="true">
<KeyState mozc:contentDescription="@string/cd_key_left">
<Flick>
<KeyEntity mozc:sourceId="103"
mozc:keyCode="@integer/key_left"
- mozc:keyIcon="@raw/godan__function__left_arrow__icon">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__function__left_arrow__popup"/>
- </KeyEntity>
+ mozc:keyIcon="@raw/twelvekeys__function__left_arrow__icon"
+ mozc:iconWidth="@dimen/unlimited"
+ mozc:iconHeight="@dimen/default_function_icon_height" />
</Flick>
</KeyState>
</Key>
+ <Spacer mozc:keyWidth="@dimen/keyboard_separator_width" mozc:keyHorizontalLayoutWeight="0"
+ mozc:keyBackground="keyboardSeparatorCenter"/>
<Key>
<KeyState mozc:contentDescription="@string/cd_key_uchar_latin_small_letter_i">
<Flick>
@@ -265,7 +272,7 @@
mozc:keyCode="@integer/uchar_digit_four"
mozc:keyIcon="@raw/godan__kana__support__04_down"
mozc:flickHighlight="true">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__digit_four"/>
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__four"/>
</KeyEntity>
</Flick>
</KeyState>
@@ -285,7 +292,7 @@
mozc:keyCode="@integer/uchar_latin_small_letter_j"
mozc:keyIcon="@raw/godan__kana__support__05_up"
mozc:flickHighlight="true">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_j"/>
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__latin_j"/>
</KeyEntity>
</Flick>
<Flick mozc:direction="right">
@@ -293,7 +300,7 @@
mozc:keyCode="@integer/uchar_latin_small_letter_z"
mozc:keyIcon="@raw/godan__kana__support__05_right"
mozc:flickHighlight="true">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_z"/>
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__latin_z"/>
</KeyEntity>
</Flick>
<Flick mozc:direction="down">
@@ -301,7 +308,7 @@
mozc:keyCode="@integer/uchar_digit_five"
mozc:keyIcon="@raw/godan__kana__support__05_down"
mozc:flickHighlight="true">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__digit_five"/>
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__five"/>
</KeyEntity>
</Flick>
</KeyState>
@@ -319,9 +326,9 @@
<Flick mozc:direction="left">
<KeyEntity mozc:sourceId="27"
mozc:keyCode="@integer/uchar_solidus"
- mozc:keyIcon="@raw/godan__kana__support__06_center"
+ mozc:keyIcon="@raw/godan__kana__support__06_left"
mozc:flickHighlight="true">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__fullwidth_solidus"/>
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__fullwidth_solidus"/>
</KeyEntity>
</Flick>
<Flick mozc:direction="up">
@@ -329,7 +336,7 @@
mozc:keyCode="@integer/uchar_latin_small_letter_l"
mozc:keyIcon="@raw/godan__kana__support__06_up"
mozc:flickHighlight="true">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_l"/>
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__latin_l"/>
</KeyEntity>
</Flick>
<Flick mozc:direction="right">
@@ -345,37 +352,49 @@
mozc:keyCode="@integer/uchar_digit_six"
mozc:keyIcon="@raw/godan__kana__support__06_down"
mozc:flickHighlight="true">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__digit_six"/>
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__six"/>
</KeyEntity>
</Flick>
</KeyState>
</Key>
+ <Spacer mozc:keyWidth="@dimen/keyboard_separator_width" mozc:keyHorizontalLayoutWeight="0"
+ mozc:keyBackground="keyboardSeparatorCenter"/>
<Key mozc:keyBackground="twelvekeysFunction"
- mozc:keyWidth="17.3%p" mozc:keyEdgeFlags="right" mozc:isRepeatable="true">
+ mozc:keyHorizontalLayoutWeight="0" mozc:keyEdgeFlags="right" mozc:isRepeatable="true">
<KeyState mozc:contentDescription="@string/cd_key_right">
<Flick>
<KeyEntity mozc:sourceId="104"
mozc:keyCode="@integer/key_right"
- mozc:keyIcon="@raw/godan__function__right_arrow__icon">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__function__right_arrow__popup"/>
- </KeyEntity>
+ mozc:keyIcon="@raw/twelvekeys__function__right_arrow__icon"
+ mozc:iconWidth="@dimen/unlimited"
+ mozc:iconHeight="@dimen/default_function_icon_height" />
</Flick>
</KeyState>
</Key>
</Row>
<Row>
<Key mozc:keyBackground="twelvekeysFunction"
- mozc:keyWidth="17.3%p" mozc:keyEdgeFlags="left">
+ mozc:keyHorizontalLayoutWeight="0" mozc:keyEdgeFlags="left">
<KeyState mozc:contentDescription="@string/cd_key_symbol">
<Flick>
<KeyEntity mozc:sourceId="105"
mozc:keyCode="@integer/key_symbol"
- mozc:keyIcon="@raw/godan__function__symbol__icon">
- <PopUp mozc:popUpIcon="@raw/qwerty__function__symbol__popup"/>
- </KeyEntity>
+ mozc:keyIcon="@raw/twelvekeys__function__symbol__icon"
+ mozc:iconWidth="@dimen/unlimited"
+ mozc:iconHeight="@dimen/default_function_icon_height" />
+ </Flick>
+ </KeyState>
+ <KeyState mozc:contentDescription="@string/cd_key_symbol" mozc:metaState="handling_touch_event">
+ <Flick>
+ <KeyEntity mozc:sourceId="118"
+ mozc:keyIcon="@raw/twelvekeys__function__symbol__icon"
+ mozc:iconWidth="@dimen/unlimited"
+ mozc:iconHeight="@dimen/default_function_icon_height" />
</Flick>
</KeyState>
</Key>
+ <Spacer mozc:keyWidth="@dimen/keyboard_separator_width" mozc:keyHorizontalLayoutWeight="0"
+ mozc:keyBackground="keyboardSeparatorCenter"/>
<Key>
<KeyState mozc:contentDescription="@string/cd_key_uchar_latin_small_letter_u">
<Flick>
@@ -415,7 +434,7 @@
mozc:keyCode="@integer/uchar_digit_seven"
mozc:keyIcon="@raw/godan__kana__support__07_down"
mozc:flickHighlight="true">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__digit_seven"/>
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__seven"/>
</KeyEntity>
</Flick>
</KeyState>
@@ -435,7 +454,7 @@
mozc:keyCode="@integer/uchar_latin_small_letter_c"
mozc:keyIcon="@raw/godan__kana__support__08_up"
mozc:flickHighlight="true">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_c"/>
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__latin_c"/>
</KeyEntity>
</Flick>
<Flick mozc:direction="right">
@@ -443,7 +462,7 @@
mozc:keyCode="@integer/uchar_latin_small_letter_d"
mozc:keyIcon="@raw/godan__kana__support__08_right"
mozc:flickHighlight="true">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_d"/>
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__latin_d"/>
</KeyEntity>
</Flick>
<Flick mozc:direction="down">
@@ -451,7 +470,7 @@
mozc:keyCode="@integer/uchar_digit_eight"
mozc:keyIcon="@raw/godan__kana__support__08_down"
mozc:flickHighlight="true">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__digit_eight"/>
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__eight"/>
</KeyEntity>
</Flick>
</KeyState>
@@ -469,9 +488,9 @@
<Flick mozc:direction="left">
<KeyEntity mozc:sourceId="42"
mozc:keyCode="@integer/uchar_left_parenthesis"
- mozc:keyIcon="@raw/godan__kana__support__09_center"
+ mozc:keyIcon="@raw/godan__kana__support__09_left"
mozc:flickHighlight="true">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__left_parenthesis"/>
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__left_parenthesis"/>
</KeyEntity>
</Flick>
<Flick mozc:direction="up">
@@ -479,15 +498,15 @@
mozc:keyCode="@integer/uchar_latin_small_letter_x"
mozc:keyIcon="@raw/godan__kana__support__09_up"
mozc:flickHighlight="true">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_x"/>
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__latin_x"/>
</KeyEntity>
</Flick>
<Flick mozc:direction="right">
<KeyEntity mozc:sourceId="44"
mozc:keyCode="@integer/uchar_right_parenthesis"
- mozc:keyIcon="@raw/godan__kana__support__09_center"
+ mozc:keyIcon="@raw/godan__kana__support__09_right"
mozc:flickHighlight="true">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__right_parenthesis"/>
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__right_parenthesis"/>
</KeyEntity>
</Flick>
<Flick mozc:direction="down">
@@ -495,40 +514,44 @@
mozc:keyCode="@integer/uchar_digit_nine"
mozc:keyIcon="@raw/godan__kana__support__09_down"
mozc:flickHighlight="true">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__digit_nine"/>
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__nine"/>
</KeyEntity>
</Flick>
</KeyState>
</Key>
+ <Spacer mozc:keyWidth="@dimen/keyboard_separator_width" mozc:keyHorizontalLayoutWeight="0"
+ mozc:keyBackground="keyboardSeparatorCenter"/>
<Key mozc:keyBackground="twelvekeysFunctionWithThreeDots"
- mozc:keyWidth="17.3%p" mozc:keyEdgeFlags="right">
+ mozc:keyHorizontalLayoutWeight="0" mozc:keyEdgeFlags="right">
<KeyState mozc:contentDescription="@string/cd_key_uchar_space">
<Flick>
<KeyEntity mozc:sourceId="106"
mozc:keyCode="@integer/uchar_space"
mozc:longPressKeyCode="@integer/key_ime_picker_dialog"
- mozc:keyIcon="@raw/godan__function__space__icon">
- <PopUp mozc:popUpIcon="@raw/qwerty__function__space__popup"/>
- </KeyEntity>
+ mozc:keyIcon="@raw/twelvekeys__function__space__icon"
+ mozc:iconWidth="@dimen/unlimited"
+ mozc:iconHeight="@dimen/default_function_icon_height" />
</Flick>
</KeyState>
</Key>
</Row>
<Row>
<Key mozc:keyBackground="twelvekeysFunctionWithThreeDots"
- mozc:keyWidth="17.3%p" mozc:keyHeight="38.4%p"
+ mozc:keyHorizontalLayoutWeight="0" mozc:keyHeight="40%p"
mozc:keyEdgeFlags="left">
<KeyState mozc:contentDescription="@string/cd_key_chartype_to_abc">
<Flick>
<KeyEntity mozc:sourceId="107"
mozc:keyCode="@integer/key_chartype_to_abc"
mozc:longPressKeyCode="@integer/key_menu_dialog"
- mozc:keyIcon="@raw/godan__function__kana__icon">
- <PopUp mozc:popUpIcon="@raw/qwerty__function__alphabet__popup"/>
- </KeyEntity>
+ mozc:keyIcon="@raw/twelvekeys__function__kana__icon"
+ mozc:iconWidth="@dimen/unlimited"
+ mozc:iconHeight="@dimen/default_function_icon_height" />
</Flick>
</KeyState>
</Key>
+ <Spacer mozc:keyWidth="@dimen/keyboard_separator_width" mozc:keyHorizontalLayoutWeight="0"
+ mozc:keyBackground="keyboardSeparatorCenter"/>
<Key>
<KeyState mozc:contentDescription="@string/cd_key_uchar_latin_small_letter_e">
<Flick>
@@ -578,9 +601,9 @@
<Flick mozc:direction="left">
<KeyEntity mozc:sourceId="52"
mozc:keyCode="@integer/uchar_colon"
- mozc:keyIcon="@raw/godan__kana__support__11_center"
+ mozc:keyIcon="@raw/godan__kana__support__11_left"
mozc:flickHighlight="true">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__fullwidth_colon"/>
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__fullwidth_colon"/>
</KeyEntity>
</Flick>
<Flick mozc:direction="up">
@@ -594,9 +617,9 @@
<Flick mozc:direction="right">
<KeyEntity mozc:sourceId="54"
mozc:keyCode="@integer/uchar_semicolon"
- mozc:keyIcon="@raw/godan__kana__support__11_center"
+ mozc:keyIcon="@raw/godan__kana__support__11_right"
mozc:flickHighlight="true">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__katakana_middle_dot"/>
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__katakana_middle_dot"/>
</KeyEntity>
</Flick>
<Flick mozc:direction="down">
@@ -604,7 +627,7 @@
mozc:keyCode="@integer/uchar_digit_zero"
mozc:keyIcon="@raw/godan__kana__support__11_down"
mozc:flickHighlight="true">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__digit_zero"/>
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__zero"/>
</KeyEntity>
</Flick>
</KeyState>
@@ -624,7 +647,7 @@
mozc:keyCode="@integer/uchar_full_stop"
mozc:keyIcon="@raw/godan__kana__support__12_left"
mozc:flickHighlight="true">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__ideographic_full_stop"/>
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__ideographic_full_stop"/>
</KeyEntity>
</Flick>
<Flick mozc:direction="up">
@@ -648,27 +671,127 @@
mozc:keyCode="@integer/uchar_comma"
mozc:keyIcon="@raw/godan__kana__support__12_down"
mozc:flickHighlight="true">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__ideographic_comma"/>
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__ideographic_comma"/>
</KeyEntity>
</Flick>
</KeyState>
</Key>
- <Key mozc:keyBackground="twelvekeysFunction"
- mozc:keyWidth="17.3%p" mozc:keyHeight="38.4%p"
- mozc:keyEdgeFlags="right" mozc:isRepeatable="true">
+ <Spacer mozc:keyWidth="@dimen/keyboard_separator_width" mozc:keyHorizontalLayoutWeight="0"
+ mozc:keyBackground="keyboardSeparatorCenter"/>
+ <Key mozc:keyBackground="twelvekeysFunctionWithThreeDots"
+ mozc:keyHorizontalLayoutWeight="0" mozc:keyHeight="40%p"
+ mozc:keyEdgeFlags="right"
+ mozc:defaultIconWidth="@dimen/keyboard_enter_width"
+ mozc:defaultIconHeight="@dimen/unlimited">
<KeyState mozc:contentDescription="@string/cd_key_uchar_linefeed">
<Flick>
<KeyEntity mozc:sourceId="108"
mozc:keyCode="@integer/uchar_linefeed"
- mozc:keyIcon="@raw/godan__function__enter__icon">
- <PopUp mozc:popUpIcon="@raw/qwerty__function__enter__popup"/>
+ mozc:longPressKeyCode="@integer/key_symbol_emoji"
+ mozc:longPressTimeoutTrigger="false"
+ mozc:keyIcon="@raw/function__enter__icon">
+ <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+ mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
+ </KeyEntity>
+ </Flick>
+ </KeyState>
+ <KeyState mozc:contentDescription="@string/cd_key_composing_done"
+ mozc:metaState="composing">
+ <Flick>
+ <KeyEntity mozc:sourceId="109"
+ mozc:keyCode="@integer/uchar_linefeed"
+ mozc:longPressKeyCode="@integer/key_symbol_emoji"
+ mozc:longPressTimeoutTrigger="false"
+ mozc:keyIcon="@raw/function__enter__icon">
+ <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+ mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
+ </KeyEntity>
+ </Flick>
+ </KeyState>
+ <KeyState mozc:contentDescription="@string/cd_key_action_done"
+ mozc:metaState="action_done">
+ <Flick>
+ <KeyEntity mozc:sourceId="110"
+ mozc:keyCode="@integer/uchar_linefeed"
+ mozc:longPressKeyCode="@integer/key_symbol_emoji"
+ mozc:longPressTimeoutTrigger="false"
+ mozc:keyIcon="@raw/function__action_done__icon">
+ <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+ mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
+ </KeyEntity>
+ </Flick>
+ </KeyState>
+ <KeyState mozc:contentDescription="@string/cd_key_action_go"
+ mozc:metaState="action_go">
+ <Flick>
+ <KeyEntity mozc:sourceId="111"
+ mozc:keyCode="@integer/uchar_linefeed"
+ mozc:longPressKeyCode="@integer/key_symbol_emoji"
+ mozc:longPressTimeoutTrigger="false"
+ mozc:keyIcon="@raw/function__action_go__icon">
+ <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+ mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
+ </KeyEntity>
+ </Flick>
+ </KeyState>
+ <KeyState mozc:contentDescription="@string/cd_key_action_next"
+ mozc:metaState="action_next">
+ <Flick>
+ <KeyEntity mozc:sourceId="112"
+ mozc:keyCode="@integer/uchar_linefeed"
+ mozc:longPressKeyCode="@integer/key_symbol_emoji"
+ mozc:longPressTimeoutTrigger="false"
+ mozc:keyIcon="@raw/function__action_next__icon">
+ <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+ mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
+ </KeyEntity>
+ </Flick>
+ </KeyState>
+ <KeyState mozc:contentDescription="@string/cd_key_action_previous"
+ mozc:metaState="action_previous">
+ <Flick>
+ <KeyEntity mozc:sourceId="113"
+ mozc:keyCode="@integer/uchar_linefeed"
+ mozc:longPressKeyCode="@integer/key_symbol_emoji"
+ mozc:longPressTimeoutTrigger="false"
+ mozc:keyIcon="@raw/function__action_previous__icon">
+ <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+ mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
+ </KeyEntity>
+ </Flick>
+ </KeyState>
+ <KeyState mozc:contentDescription="@string/cd_key_action_search"
+ mozc:metaState="action_search">
+ <Flick>
+ <KeyEntity mozc:sourceId="114"
+ mozc:keyCode="@integer/uchar_linefeed"
+ mozc:longPressKeyCode="@integer/key_symbol_emoji"
+ mozc:longPressTimeoutTrigger="false"
+ mozc:keyIcon="@raw/function__action_search__icon">
+ <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+ mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
+ </KeyEntity>
+ </Flick>
+ </KeyState>
+ <KeyState mozc:contentDescription="@string/cd_key_action_send"
+ mozc:metaState="action_send">
+ <Flick>
+ <KeyEntity mozc:sourceId="115"
+ mozc:keyCode="@integer/uchar_linefeed"
+ mozc:longPressKeyCode="@integer/key_symbol_emoji"
+ mozc:longPressTimeoutTrigger="false"
+ mozc:keyIcon="@raw/function__action_send__icon">
+ <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+ mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
</KeyEntity>
</Flick>
</KeyState>
</Key>
</Row>
<Row>
- <Spacer mozc:horizontalGap="17.3%p"/>
+ <Spacer mozc:keyHorizontalLayoutWeight="0" mozc:keyBackground="transparent"/>
+ <Spacer mozc:keyWidth="@dimen/keyboard_separator_width" mozc:keyHorizontalLayoutWeight="0"
+ mozc:keyBackground="keyboardSeparatorBottom"/>
<Key>
<KeyState mozc:contentDescription="@string/cd_key_uchar_latin_small_letter_o">
<Flick>
@@ -706,7 +829,7 @@
</KeyState>
</Key>
<Key>
- <KeyState mozc:contentDescription="@string/cd_key_uchar_asterisk">
+ <KeyState mozc:contentDescription="@string/cd_key_kana_modifier" mozc:metaState="fallback|composing|no_globe">
<Flick>
<KeyEntity mozc:sourceId="66"
mozc:keyCode="@integer/uchar_asterisk"
@@ -739,6 +862,27 @@
</KeyEntity>
</Flick>
</KeyState>
+ <KeyState mozc:contentDescription="@string/cd_key_kana_modifier" mozc:metaState="handling_touch_event" >
+ <Flick>
+ <KeyEntity mozc:sourceId="117"
+ mozc:keyCode="@integer/uchar_asterisk"
+ mozc:keyIcon="@raw/globe_keyicon"
+ mozc:iconWidth="@dimen/unlimited"
+ mozc:iconHeight="@dimen/default_function_icon_height">
+ <PopUp mozc:popUpIcon="@raw/godan__kana__14"/>
+ </KeyEntity>
+ </Flick>
+ </KeyState>
+ <KeyState mozc:contentDescription="@string/cd_key_globe" mozc:metaState="globe" >
+ <Flick>
+ <KeyEntity mozc:sourceId="116"
+ mozc:keyCode="@integer/key_globe"
+ mozc:keyIcon="@raw/globe_keyicon"
+ mozc:iconWidth="@dimen/unlimited"
+ mozc:iconHeight="@dimen/default_function_icon_height"
+ mozc:longPressKeyCode="@integer/key_ime_picker_dialog" />
+ </Flick>
+ </KeyState>
</Key>
<Key>
<KeyState mozc:contentDescription="@string/cd_key_uchar_latin_small_letter_w">
@@ -753,9 +897,9 @@
<Flick mozc:direction="left">
<KeyEntity mozc:sourceId="72"
mozc:keyCode="@integer/uchar_left_square_bracket"
- mozc:keyIcon="@raw/godan__kana__support__15_center"
+ mozc:keyIcon="@raw/godan__kana__support__15_left"
mozc:flickHighlight="true">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__left_corner_bracket"/>
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__left_corner_bracket"/>
</KeyEntity>
</Flick>
<Flick mozc:direction="up">
@@ -763,19 +907,22 @@
mozc:keyCode="@integer/uchar_latin_small_letter_v"
mozc:keyIcon="@raw/godan__kana__support__15_up"
mozc:flickHighlight="true">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_v"/>
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__latin_v"/>
</KeyEntity>
</Flick>
<Flick mozc:direction="right">
<KeyEntity mozc:sourceId="74"
mozc:keyCode="@integer/uchar_right_square_bracket"
- mozc:keyIcon="@raw/godan__kana__support__15_center"
+ mozc:keyIcon="@raw/godan__kana__support__15_right"
mozc:flickHighlight="true">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__right_corner_bracket"/>
+ <PopUp mozc:popUpIcon="@raw/twelvekeys__popup__right_corner_bracket"/>
</KeyEntity>
</Flick>
</KeyState>
</Key>
- <Spacer mozc:horizontalGap="17.3%p"/>
+ <Spacer mozc:keyWidth="@dimen/keyboard_separator_width" mozc:keyHorizontalLayoutWeight="0"
+ mozc:keyBackground="keyboardSeparatorBottom"/>
+ <Spacer mozc:keyHorizontalLayoutWeight="0" mozc:keyBackground="transparent"/>
</Row>
+ <!-- Next sourceId: 119 -->
</Keyboard>
diff --git a/src/android/static_resources/resources_oss/res/xml/kbd_qwerty_abc.xml b/src/android/static_resources/resources_oss/res/xml/kbd_qwerty_abc.xml
index fd0753f..5cd3bfb 100644
--- a/src/android/static_resources/resources_oss/res/xml/kbd_qwerty_abc.xml
+++ b/src/android/static_resources/resources_oss/res/xml/kbd_qwerty_abc.xml
@@ -33,19 +33,27 @@
xmlns:mozc="http://schemas.android.com/apk/res-auto"
mozc:keyboardContentDescription="@string/cd_keyboard_alphabet"
mozc:keyBackground="qwertyRegular"
- mozc:keyWidth="10%p" mozc:keyHeight="20.5%p"
+ mozc:keyWidth="10%p" mozc:keyHeight="21%p"
mozc:horizontalGap="0.3%p" mozc:verticalGap="4%p"
- mozc:popUpWidth="@dimen/key_preview_height" mozc:popUpHeight="@dimen/key_preview_height"
- mozc:popUpXOffset="0dip" mozc:popUpYOffset="@dimen/mini_keyboard_vertical_correction">
- <Row mozc:rowEdgeFlags="top" mozc:keyHeight="0dip" mozc:verticalGap="4%p" />
+ mozc:popUpHeight="@dimen/key_preview_height"
+ mozc:popUpIconHeight="@dimen/key_preview_qwerty_icon_height"
+ mozc:popUpXOffset="0dip" mozc:popUpYOffset="@dimen/mini_keyboard_vertical_correction"
+ mozc:defaultIconWidth="@dimen/unlimited"
+ mozc:defaultIconHeight="@dimen/keyboard_qwerty_default_height"
+ mozc:defaultHorizontalPadding="@fraction/keyboard_qwerty_default_horizontal_padding"
+ mozc:defaultVerticalPadding="@fraction/keyboard_qwerty_default_vertical_padding">
+ <Row mozc:rowEdgeFlags="top" mozc:keyHeight="0dip" mozc:verticalGap="2%p" />
<Row>
<Key mozc:keyEdgeFlags="left">
<KeyState mozc:contentDescription="@string/cd_key_uchar_latin_small_letter_q">
<Flick>
<KeyEntity mozc:sourceId="1"
mozc:keyCode="@integer/uchar_latin_small_letter_q"
+ mozc:longPressKeyCode="@integer/uchar_digit_one"
+ mozc:longPressTimeoutTrigger="false"
mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_q">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_q" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__popup__latin_small_letter_q"
+ mozc:popUpLongPressIcon="@raw/qwerty__keyicon__digit_one" />
</KeyEntity>
</Flick>
<Flick mozc:direction="up">
@@ -59,7 +67,7 @@
<KeyEntity mozc:sourceId="69"
mozc:keyCode="@integer/uchar_latin_capital_letter_q"
mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_q">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_q" />
+ <PopUp mozc:popUpIcon="@raw/qwerty__popup__latin_capital_letter_q" />
</KeyEntity>
</Flick>
</KeyState>
@@ -68,8 +76,11 @@
<Flick>
<KeyEntity mozc:sourceId="2"
mozc:keyCode="@integer/uchar_latin_capital_letter_q"
+ mozc:longPressKeyCode="@integer/uchar_digit_one"
+ mozc:longPressTimeoutTrigger="false"
mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_q">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_q" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__popup__latin_capital_letter_q"
+ mozc:popUpLongPressIcon="@raw/qwerty__keyicon__digit_one" />
</KeyEntity>
</Flick>
<Flick mozc:direction="up">
@@ -83,7 +94,7 @@
<KeyEntity mozc:sourceId="70"
mozc:keyCode="@integer/uchar_latin_small_letter_q"
mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_q">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_q" />
+ <PopUp mozc:popUpIcon="@raw/qwerty__popup__latin_small_letter_q" />
</KeyEntity>
</Flick>
</KeyState>
@@ -93,8 +104,11 @@
<Flick>
<KeyEntity mozc:sourceId="3"
mozc:keyCode="@integer/uchar_latin_small_letter_w"
+ mozc:longPressKeyCode="@integer/uchar_digit_two"
+ mozc:longPressTimeoutTrigger="false"
mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_w">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_w" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__popup__latin_small_letter_w"
+ mozc:popUpLongPressIcon="@raw/qwerty__keyicon__digit_two" />
</KeyEntity>
</Flick>
<Flick mozc:direction="up">
@@ -108,7 +122,7 @@
<KeyEntity mozc:sourceId="71"
mozc:keyCode="@integer/uchar_latin_capital_letter_w"
mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_w">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_w" />
+ <PopUp mozc:popUpIcon="@raw/qwerty__popup__latin_capital_letter_w" />
</KeyEntity>
</Flick>
</KeyState>
@@ -117,8 +131,11 @@
<Flick>
<KeyEntity mozc:sourceId="4"
mozc:keyCode="@integer/uchar_latin_capital_letter_w"
+ mozc:longPressKeyCode="@integer/uchar_digit_two"
+ mozc:longPressTimeoutTrigger="false"
mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_w">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_w" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__popup__latin_capital_letter_w"
+ mozc:popUpLongPressIcon="@raw/qwerty__keyicon__digit_two" />
</KeyEntity>
</Flick>
<Flick mozc:direction="up">
@@ -132,7 +149,7 @@
<KeyEntity mozc:sourceId="72"
mozc:keyCode="@integer/uchar_latin_small_letter_w"
mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_w">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_w" />
+ <PopUp mozc:popUpIcon="@raw/qwerty__popup__latin_small_letter_w" />
</KeyEntity>
</Flick>
</KeyState>
@@ -142,8 +159,11 @@
<Flick>
<KeyEntity mozc:sourceId="5"
mozc:keyCode="@integer/uchar_latin_small_letter_e"
+ mozc:longPressKeyCode="@integer/uchar_digit_three"
+ mozc:longPressTimeoutTrigger="false"
mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_e">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_e" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__popup__latin_small_letter_e"
+ mozc:popUpLongPressIcon="@raw/qwerty__keyicon__digit_three" />
</KeyEntity>
</Flick>
<Flick mozc:direction="up">
@@ -157,7 +177,7 @@
<KeyEntity mozc:sourceId="73"
mozc:keyCode="@integer/uchar_latin_capital_letter_e"
mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_e">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_e" />
+ <PopUp mozc:popUpIcon="@raw/qwerty__popup__latin_capital_letter_e" />
</KeyEntity>
</Flick>
</KeyState>
@@ -166,8 +186,11 @@
<Flick>
<KeyEntity mozc:sourceId="6"
mozc:keyCode="@integer/uchar_latin_capital_letter_e"
+ mozc:longPressKeyCode="@integer/uchar_digit_three"
+ mozc:longPressTimeoutTrigger="false"
mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_e">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_e" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__popup__latin_capital_letter_e"
+ mozc:popUpLongPressIcon="@raw/qwerty__keyicon__digit_three" />
</KeyEntity>
</Flick>
<Flick mozc:direction="up">
@@ -181,7 +204,7 @@
<KeyEntity mozc:sourceId="74"
mozc:keyCode="@integer/uchar_latin_small_letter_e"
mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_e">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_e" />
+ <PopUp mozc:popUpIcon="@raw/qwerty__popup__latin_small_letter_e" />
</KeyEntity>
</Flick>
</KeyState>
@@ -191,8 +214,11 @@
<Flick>
<KeyEntity mozc:sourceId="7"
mozc:keyCode="@integer/uchar_latin_small_letter_r"
+ mozc:longPressKeyCode="@integer/uchar_digit_four"
+ mozc:longPressTimeoutTrigger="false"
mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_r">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_r" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__popup__latin_small_letter_r"
+ mozc:popUpLongPressIcon="@raw/qwerty__keyicon__digit_four" />
</KeyEntity>
</Flick>
<Flick mozc:direction="up">
@@ -206,7 +232,7 @@
<KeyEntity mozc:sourceId="75"
mozc:keyCode="@integer/uchar_latin_capital_letter_r"
mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_r">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_r" />
+ <PopUp mozc:popUpIcon="@raw/qwerty__popup__latin_capital_letter_r" />
</KeyEntity>
</Flick>
</KeyState>
@@ -215,8 +241,11 @@
<Flick>
<KeyEntity mozc:sourceId="8"
mozc:keyCode="@integer/uchar_latin_capital_letter_r"
+ mozc:longPressKeyCode="@integer/uchar_digit_four"
+ mozc:longPressTimeoutTrigger="false"
mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_r">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_r" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__popup__latin_capital_letter_r"
+ mozc:popUpLongPressIcon="@raw/qwerty__keyicon__digit_four" />
</KeyEntity>
</Flick>
<Flick mozc:direction="up">
@@ -230,7 +259,7 @@
<KeyEntity mozc:sourceId="76"
mozc:keyCode="@integer/uchar_latin_small_letter_r"
mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_r">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_r" />
+ <PopUp mozc:popUpIcon="@raw/qwerty__popup__latin_small_letter_r" />
</KeyEntity>
</Flick>
</KeyState>
@@ -240,8 +269,11 @@
<Flick>
<KeyEntity mozc:sourceId="9"
mozc:keyCode="@integer/uchar_latin_small_letter_t"
+ mozc:longPressKeyCode="@integer/uchar_digit_five"
+ mozc:longPressTimeoutTrigger="false"
mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_t">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_t" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__popup__latin_small_letter_t"
+ mozc:popUpLongPressIcon="@raw/qwerty__keyicon__digit_five" />
</KeyEntity>
</Flick>
<Flick mozc:direction="up">
@@ -255,7 +287,7 @@
<KeyEntity mozc:sourceId="77"
mozc:keyCode="@integer/uchar_latin_capital_letter_t"
mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_t">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_t" />
+ <PopUp mozc:popUpIcon="@raw/qwerty__popup__latin_capital_letter_t" />
</KeyEntity>
</Flick>
</KeyState>
@@ -264,8 +296,11 @@
<Flick>
<KeyEntity mozc:sourceId="10"
mozc:keyCode="@integer/uchar_latin_capital_letter_t"
+ mozc:longPressKeyCode="@integer/uchar_digit_five"
+ mozc:longPressTimeoutTrigger="false"
mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_t">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_t" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__popup__latin_capital_letter_t"
+ mozc:popUpLongPressIcon="@raw/qwerty__keyicon__digit_five" />
</KeyEntity>
</Flick>
<Flick mozc:direction="up">
@@ -279,7 +314,7 @@
<KeyEntity mozc:sourceId="78"
mozc:keyCode="@integer/uchar_latin_small_letter_t"
mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_t">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_t" />
+ <PopUp mozc:popUpIcon="@raw/qwerty__popup__latin_small_letter_t" />
</KeyEntity>
</Flick>
</KeyState>
@@ -289,8 +324,11 @@
<Flick>
<KeyEntity mozc:sourceId="11"
mozc:keyCode="@integer/uchar_latin_small_letter_y"
+ mozc:longPressKeyCode="@integer/uchar_digit_six"
+ mozc:longPressTimeoutTrigger="false"
mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_y">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_y" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__popup__latin_small_letter_y"
+ mozc:popUpLongPressIcon="@raw/qwerty__keyicon__digit_six" />
</KeyEntity>
</Flick>
<Flick mozc:direction="up">
@@ -304,7 +342,7 @@
<KeyEntity mozc:sourceId="79"
mozc:keyCode="@integer/uchar_latin_capital_letter_y"
mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_y">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_y" />
+ <PopUp mozc:popUpIcon="@raw/qwerty__popup__latin_capital_letter_y" />
</KeyEntity>
</Flick>
</KeyState>
@@ -313,8 +351,11 @@
<Flick>
<KeyEntity mozc:sourceId="12"
mozc:keyCode="@integer/uchar_latin_capital_letter_y"
+ mozc:longPressKeyCode="@integer/uchar_digit_six"
+ mozc:longPressTimeoutTrigger="false"
mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_y">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_y" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__popup__latin_capital_letter_y"
+ mozc:popUpLongPressIcon="@raw/qwerty__keyicon__digit_six" />
</KeyEntity>
</Flick>
<Flick mozc:direction="up">
@@ -328,7 +369,7 @@
<KeyEntity mozc:sourceId="80"
mozc:keyCode="@integer/uchar_latin_small_letter_y"
mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_y">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_y" />
+ <PopUp mozc:popUpIcon="@raw/qwerty__popup__latin_small_letter_y" />
</KeyEntity>
</Flick>
</KeyState>
@@ -338,8 +379,11 @@
<Flick>
<KeyEntity mozc:sourceId="13"
mozc:keyCode="@integer/uchar_latin_small_letter_u"
+ mozc:longPressKeyCode="@integer/uchar_digit_seven"
+ mozc:longPressTimeoutTrigger="false"
mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_u">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_u" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__popup__latin_small_letter_u"
+ mozc:popUpLongPressIcon="@raw/qwerty__keyicon__digit_seven" />
</KeyEntity>
</Flick>
<Flick mozc:direction="up">
@@ -353,7 +397,7 @@
<KeyEntity mozc:sourceId="81"
mozc:keyCode="@integer/uchar_latin_capital_letter_u"
mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_u">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_u" />
+ <PopUp mozc:popUpIcon="@raw/qwerty__popup__latin_capital_letter_u" />
</KeyEntity>
</Flick>
</KeyState>
@@ -362,8 +406,11 @@
<Flick>
<KeyEntity mozc:sourceId="14"
mozc:keyCode="@integer/uchar_latin_capital_letter_u"
+ mozc:longPressKeyCode="@integer/uchar_digit_seven"
+ mozc:longPressTimeoutTrigger="false"
mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_u">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_u" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__popup__latin_capital_letter_u"
+ mozc:popUpLongPressIcon="@raw/qwerty__keyicon__digit_seven" />
</KeyEntity>
</Flick>
<Flick mozc:direction="up">
@@ -377,7 +424,7 @@
<KeyEntity mozc:sourceId="82"
mozc:keyCode="@integer/uchar_latin_small_letter_u"
mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_u">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_u" />
+ <PopUp mozc:popUpIcon="@raw/qwerty__popup__latin_small_letter_u" />
</KeyEntity>
</Flick>
</KeyState>
@@ -387,8 +434,11 @@
<Flick>
<KeyEntity mozc:sourceId="15"
mozc:keyCode="@integer/uchar_latin_small_letter_i"
+ mozc:longPressKeyCode="@integer/uchar_digit_eight"
+ mozc:longPressTimeoutTrigger="false"
mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_i">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_i" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__popup__latin_small_letter_i"
+ mozc:popUpLongPressIcon="@raw/qwerty__keyicon__digit_eight" />
</KeyEntity>
</Flick>
<Flick mozc:direction="up">
@@ -402,7 +452,7 @@
<KeyEntity mozc:sourceId="83"
mozc:keyCode="@integer/uchar_latin_capital_letter_i"
mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_i">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_i" />
+ <PopUp mozc:popUpIcon="@raw/qwerty__popup__latin_capital_letter_i" />
</KeyEntity>
</Flick>
</KeyState>
@@ -411,8 +461,11 @@
<Flick>
<KeyEntity mozc:sourceId="16"
mozc:keyCode="@integer/uchar_latin_capital_letter_i"
+ mozc:longPressKeyCode="@integer/uchar_digit_eight"
+ mozc:longPressTimeoutTrigger="false"
mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_i">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_i" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__popup__latin_capital_letter_i"
+ mozc:popUpLongPressIcon="@raw/qwerty__keyicon__digit_eight" />
</KeyEntity>
</Flick>
<Flick mozc:direction="up">
@@ -426,7 +479,7 @@
<KeyEntity mozc:sourceId="84"
mozc:keyCode="@integer/uchar_latin_small_letter_i"
mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_i">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_i" />
+ <PopUp mozc:popUpIcon="@raw/qwerty__popup__latin_small_letter_i" />
</KeyEntity>
</Flick>
</KeyState>
@@ -436,8 +489,11 @@
<Flick>
<KeyEntity mozc:sourceId="17"
mozc:keyCode="@integer/uchar_latin_small_letter_o"
+ mozc:longPressKeyCode="@integer/uchar_digit_nine"
+ mozc:longPressTimeoutTrigger="false"
mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_o">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_o" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__popup__latin_small_letter_o"
+ mozc:popUpLongPressIcon="@raw/qwerty__keyicon__digit_nine" />
</KeyEntity>
</Flick>
<Flick mozc:direction="up">
@@ -451,7 +507,7 @@
<KeyEntity mozc:sourceId="85"
mozc:keyCode="@integer/uchar_latin_capital_letter_o"
mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_o">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_o" />
+ <PopUp mozc:popUpIcon="@raw/qwerty__popup__latin_capital_letter_o" />
</KeyEntity>
</Flick>
</KeyState>
@@ -460,8 +516,11 @@
<Flick>
<KeyEntity mozc:sourceId="18"
mozc:keyCode="@integer/uchar_latin_capital_letter_o"
+ mozc:longPressKeyCode="@integer/uchar_digit_nine"
+ mozc:longPressTimeoutTrigger="false"
mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_o">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_o" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__popup__latin_capital_letter_o"
+ mozc:popUpLongPressIcon="@raw/qwerty__keyicon__digit_nine" />
</KeyEntity>
</Flick>
<Flick mozc:direction="up">
@@ -475,7 +534,7 @@
<KeyEntity mozc:sourceId="86"
mozc:keyCode="@integer/uchar_latin_small_letter_o"
mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_o">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_o" />
+ <PopUp mozc:popUpIcon="@raw/qwerty__popup__latin_small_letter_o" />
</KeyEntity>
</Flick>
</KeyState>
@@ -485,8 +544,11 @@
<Flick>
<KeyEntity mozc:sourceId="19"
mozc:keyCode="@integer/uchar_latin_small_letter_p"
+ mozc:longPressKeyCode="@integer/uchar_digit_zero"
+ mozc:longPressTimeoutTrigger="false"
mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_p">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_p" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__popup__latin_small_letter_p"
+ mozc:popUpLongPressIcon="@raw/qwerty__keyicon__digit_zero" />
</KeyEntity>
</Flick>
<Flick mozc:direction="up">
@@ -500,7 +562,7 @@
<KeyEntity mozc:sourceId="87"
mozc:keyCode="@integer/uchar_latin_capital_letter_p"
mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_p">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_p" />
+ <PopUp mozc:popUpIcon="@raw/qwerty__popup__latin_capital_letter_p" />
</KeyEntity>
</Flick>
</KeyState>
@@ -509,8 +571,11 @@
<Flick>
<KeyEntity mozc:sourceId="20"
mozc:keyCode="@integer/uchar_latin_capital_letter_p"
+ mozc:longPressKeyCode="@integer/uchar_digit_zero"
+ mozc:longPressTimeoutTrigger="false"
mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_p">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_p" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__popup__latin_capital_letter_p"
+ mozc:popUpLongPressIcon="@raw/qwerty__keyicon__digit_zero" />
</KeyEntity>
</Flick>
<Flick mozc:direction="up">
@@ -524,21 +589,21 @@
<KeyEntity mozc:sourceId="88"
mozc:keyCode="@integer/uchar_latin_small_letter_p"
mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_p">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_p" />
+ <PopUp mozc:popUpIcon="@raw/qwerty__popup__latin_small_letter_p" />
</KeyEntity>
</Flick>
</KeyState>
</Key>
</Row>
<Row>
- <Spacer mozc:horizontalGap="5%p" />
+ <Spacer mozc:keyWidth="5%p" mozc:keyBackground="transparent" />
<Key mozc:keyEdgeFlags="left">
<KeyState mozc:contentDescription="@string/cd_key_uchar_latin_small_letter_a">
<Flick>
<KeyEntity mozc:sourceId="21"
mozc:keyCode="@integer/uchar_latin_small_letter_a"
mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_a">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_a" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__latin_small_letter_a" />
</KeyEntity>
</Flick>
<Flick mozc:direction="down">
@@ -555,7 +620,7 @@
<KeyEntity mozc:sourceId="22"
mozc:keyCode="@integer/uchar_latin_capital_letter_a"
mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_a">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_a" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__latin_capital_letter_a" />
</KeyEntity>
</Flick>
<Flick mozc:direction="down">
@@ -573,7 +638,7 @@
<KeyEntity mozc:sourceId="23"
mozc:keyCode="@integer/uchar_latin_small_letter_s"
mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_s">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_s" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__latin_small_letter_s" />
</KeyEntity>
</Flick>
<Flick mozc:direction="down">
@@ -590,7 +655,7 @@
<KeyEntity mozc:sourceId="24"
mozc:keyCode="@integer/uchar_latin_capital_letter_s"
mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_s">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_s" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__latin_capital_letter_s" />
</KeyEntity>
</Flick>
<Flick mozc:direction="down">
@@ -608,7 +673,7 @@
<KeyEntity mozc:sourceId="25"
mozc:keyCode="@integer/uchar_latin_small_letter_d"
mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_d">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_d" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__latin_small_letter_d" />
</KeyEntity>
</Flick>
<Flick mozc:direction="down">
@@ -625,7 +690,7 @@
<KeyEntity mozc:sourceId="26"
mozc:keyCode="@integer/uchar_latin_capital_letter_d"
mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_d">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_d" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__latin_capital_letter_d" />
</KeyEntity>
</Flick>
<Flick mozc:direction="down">
@@ -643,7 +708,7 @@
<KeyEntity mozc:sourceId="27"
mozc:keyCode="@integer/uchar_latin_small_letter_f"
mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_f">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_f" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__latin_small_letter_f" />
</KeyEntity>
</Flick>
<Flick mozc:direction="down">
@@ -660,7 +725,7 @@
<KeyEntity mozc:sourceId="28"
mozc:keyCode="@integer/uchar_latin_capital_letter_f"
mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_f">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_f" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__latin_capital_letter_f" />
</KeyEntity>
</Flick>
<Flick mozc:direction="down">
@@ -678,7 +743,7 @@
<KeyEntity mozc:sourceId="29"
mozc:keyCode="@integer/uchar_latin_small_letter_g"
mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_g">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_g" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__latin_small_letter_g" />
</KeyEntity>
</Flick>
<Flick mozc:direction="down">
@@ -695,7 +760,7 @@
<KeyEntity mozc:sourceId="30"
mozc:keyCode="@integer/uchar_latin_capital_letter_g"
mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_g">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_g" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__latin_capital_letter_g" />
</KeyEntity>
</Flick>
<Flick mozc:direction="down">
@@ -713,7 +778,7 @@
<KeyEntity mozc:sourceId="31"
mozc:keyCode="@integer/uchar_latin_small_letter_h"
mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_h">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_h" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__latin_small_letter_h" />
</KeyEntity>
</Flick>
<Flick mozc:direction="down">
@@ -730,7 +795,7 @@
<KeyEntity mozc:sourceId="32"
mozc:keyCode="@integer/uchar_latin_capital_letter_h"
mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_h">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_h" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__latin_capital_letter_h" />
</KeyEntity>
</Flick>
<Flick mozc:direction="down">
@@ -748,7 +813,7 @@
<KeyEntity mozc:sourceId="33"
mozc:keyCode="@integer/uchar_latin_small_letter_j"
mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_j">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_j" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__latin_small_letter_j" />
</KeyEntity>
</Flick>
<Flick mozc:direction="down">
@@ -765,7 +830,7 @@
<KeyEntity mozc:sourceId="34"
mozc:keyCode="@integer/uchar_latin_capital_letter_j"
mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_j">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_j" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__latin_capital_letter_j" />
</KeyEntity>
</Flick>
<Flick mozc:direction="down">
@@ -783,7 +848,7 @@
<KeyEntity mozc:sourceId="35"
mozc:keyCode="@integer/uchar_latin_small_letter_k"
mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_k">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_k" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__latin_small_letter_k" />
</KeyEntity>
</Flick>
<Flick mozc:direction="down">
@@ -800,7 +865,7 @@
<KeyEntity mozc:sourceId="36"
mozc:keyCode="@integer/uchar_latin_capital_letter_k"
mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_k">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_k" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__latin_capital_letter_k" />
</KeyEntity>
</Flick>
<Flick mozc:direction="down">
@@ -818,7 +883,7 @@
<KeyEntity mozc:sourceId="37"
mozc:keyCode="@integer/uchar_latin_small_letter_l"
mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_l">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_l" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__latin_small_letter_l" />
</KeyEntity>
</Flick>
<Flick mozc:direction="down">
@@ -835,7 +900,7 @@
<KeyEntity mozc:sourceId="38"
mozc:keyCode="@integer/uchar_latin_capital_letter_l"
mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_l">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_l" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__latin_capital_letter_l" />
</KeyEntity>
</Flick>
<Flick mozc:direction="down">
@@ -847,12 +912,13 @@
</Flick>
</KeyState>
</Key>
- <Spacer mozc:horizontalGap="5%p" />
+ <Spacer mozc:keyWidth="5%p" mozc:keyBackground="transparent" />
</Row>
<Row>
<Key mozc:keyBackground="qwertyFunction"
- mozc:keyWidth="13%p" mozc:keyEdgeFlags="left"
- mozc:isSticky="true" mozc:isModifier="true">
+ mozc:keyWidth="13%p" mozc:keyEdgeFlags="left" mozc:isModifier="true"
+ mozc:defaultIconWidth="@dimen/unlimited"
+ mozc:defaultIconHeight="@dimen/default_function_icon_height">
<KeyState mozc:contentDescription="@string/cd_key_shift"
mozc:nextMetaState="shift">
<Flick>
@@ -879,14 +945,14 @@
</Flick>
</KeyState>
</Key>
- <Spacer mozc:horizontalGap="2%" mozc:stick="right" />
+ <Spacer mozc:keyWidth="2%" mozc:stick="right" mozc:keyBackground="transparent" />
<Key>
<KeyState mozc:contentDescription="@string/cd_key_uchar_latin_small_letter_z">
<Flick>
<KeyEntity mozc:sourceId="42"
mozc:keyCode="@integer/uchar_latin_small_letter_z"
mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_z">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_z" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__latin_small_letter_z" />
</KeyEntity>
</Flick>
<Flick mozc:direction="down">
@@ -903,7 +969,7 @@
<KeyEntity mozc:sourceId="43"
mozc:keyCode="@integer/uchar_latin_capital_letter_z"
mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_z">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_z" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__latin_capital_letter_z" />
</KeyEntity>
</Flick>
<Flick mozc:direction="down">
@@ -921,7 +987,7 @@
<KeyEntity mozc:sourceId="44"
mozc:keyCode="@integer/uchar_latin_small_letter_x"
mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_x">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_x" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__latin_small_letter_x" />
</KeyEntity>
</Flick>
<Flick mozc:direction="down">
@@ -938,7 +1004,7 @@
<KeyEntity mozc:sourceId="45"
mozc:keyCode="@integer/uchar_latin_capital_letter_x"
mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_x">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_x" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__latin_capital_letter_x" />
</KeyEntity>
</Flick>
<Flick mozc:direction="down">
@@ -956,7 +1022,7 @@
<KeyEntity mozc:sourceId="46"
mozc:keyCode="@integer/uchar_latin_small_letter_c"
mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_c">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_c" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__latin_small_letter_c" />
</KeyEntity>
</Flick>
<Flick mozc:direction="down">
@@ -973,7 +1039,7 @@
<KeyEntity mozc:sourceId="47"
mozc:keyCode="@integer/uchar_latin_capital_letter_c"
mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_c">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_c" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__latin_capital_letter_c" />
</KeyEntity>
</Flick>
<Flick mozc:direction="down">
@@ -991,7 +1057,7 @@
<KeyEntity mozc:sourceId="48"
mozc:keyCode="@integer/uchar_latin_small_letter_v"
mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_v">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_v" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__latin_small_letter_v" />
</KeyEntity>
</Flick>
<Flick mozc:direction="down">
@@ -1008,7 +1074,7 @@
<KeyEntity mozc:sourceId="49"
mozc:keyCode="@integer/uchar_latin_capital_letter_v"
mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_v">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_v" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__latin_capital_letter_v" />
</KeyEntity>
</Flick>
<Flick mozc:direction="down">
@@ -1026,7 +1092,7 @@
<KeyEntity mozc:sourceId="50"
mozc:keyCode="@integer/uchar_latin_small_letter_b"
mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_b">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_b" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__latin_small_letter_b" />
</KeyEntity>
</Flick>
<Flick mozc:direction="down">
@@ -1043,7 +1109,7 @@
<KeyEntity mozc:sourceId="51"
mozc:keyCode="@integer/uchar_latin_capital_letter_b"
mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_b">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_b" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__latin_capital_letter_b" />
</KeyEntity>
</Flick>
<Flick mozc:direction="down">
@@ -1061,7 +1127,7 @@
<KeyEntity mozc:sourceId="52"
mozc:keyCode="@integer/uchar_latin_small_letter_n"
mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_n">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_n" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__latin_small_letter_n" />
</KeyEntity>
</Flick>
<Flick mozc:direction="down">
@@ -1078,7 +1144,7 @@
<KeyEntity mozc:sourceId="53"
mozc:keyCode="@integer/uchar_latin_capital_letter_n"
mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_n">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_n" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__latin_capital_letter_n" />
</KeyEntity>
</Flick>
<Flick mozc:direction="down">
@@ -1096,7 +1162,7 @@
<KeyEntity mozc:sourceId="54"
mozc:keyCode="@integer/uchar_latin_small_letter_m"
mozc:keyIcon="@raw/qwerty__keyicon__latin_small_letter_m">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_small_letter_m" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__latin_small_letter_m" />
</KeyEntity>
</Flick>
<Flick mozc:direction="down">
@@ -1113,7 +1179,7 @@
<KeyEntity mozc:sourceId="55"
mozc:keyCode="@integer/uchar_latin_capital_letter_m"
mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_m">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_m" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__latin_capital_letter_m" />
</KeyEntity>
</Flick>
<Flick mozc:direction="down">
@@ -1125,15 +1191,16 @@
</Flick>
</KeyState>
</Key>
- <Spacer mozc:horizontalGap="2%" mozc:stick="left" />
+ <Spacer mozc:keyWidth="2%" mozc:stick="left" mozc:keyBackground="transparent" />
<Key mozc:keyBackground="qwertyFunction"
mozc:keyWidth="13%p" mozc:keyEdgeFlags="right" mozc:isRepeatable="true">
<KeyState mozc:contentDescription="@string/cd_key_uchar_backspace">
<Flick>
<KeyEntity mozc:sourceId="56"
mozc:keyCode="@integer/key_backspace"
- mozc:keyIcon="@raw/qwerty__function__delete__icon">
- <PopUp mozc:popUpIcon="@raw/qwerty__function__delete__popup" />
+ mozc:keyIcon="@raw/qwerty__function__delete__icon"
+ mozc:iconWidth="@dimen/unlimited"
+ mozc:iconHeight="@dimen/default_function_icon_height">
</KeyEntity>
</Flick>
</KeyState>
@@ -1147,21 +1214,21 @@
<KeyEntity mozc:sourceId="57"
mozc:keyCode="@integer/key_chartype_to_kana"
mozc:longPressKeyCode="@integer/key_menu_dialog"
- mozc:keyIcon="@raw/qwerty__function__alphabet__icon">
- <PopUp mozc:popUpIcon="@raw/qwerty__function__kana__popup" />
- </KeyEntity>
+ mozc:keyIcon="@raw/qwerty__function__alphabet__icon"
+ mozc:iconWidth="@dimen/unlimited"
+ mozc:iconHeight="@dimen/default_function_icon_height" />
</Flick>
</KeyState>
</Key>
<Key mozc:keyBackground="qwertyFunction"
- mozc:keyWidth="13%p">
+ mozc:keyHorizontalLayoutWeight="1" >
<KeyState mozc:contentDescription="@string/cd_key_chartype_to_abc_123">
<Flick>
<KeyEntity mozc:sourceId="58"
mozc:keyCode="@integer/key_chartype_to_abc_123"
- mozc:keyIcon="@raw/qwerty__function__number_alphabet__icon">
- <PopUp mozc:popUpIcon="@raw/qwerty__function__number_alphabet__popup" />
- </KeyEntity>
+ mozc:keyIcon="@raw/qwerty__function__number_alphabet__icon"
+ mozc:iconWidth="@dimen/unlimited"
+ mozc:iconHeight="@dimen/default_function_icon_height" />
</Flick>
</KeyState>
</Key>
@@ -1172,7 +1239,7 @@
<KeyEntity mozc:sourceId="59"
mozc:keyCode="@integer/uchar_comma"
mozc:keyIcon="@raw/qwerty__function__comma">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__comma" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__comma" />
</KeyEntity>
</Flick>
</KeyState>
@@ -1182,7 +1249,7 @@
<KeyEntity mozc:sourceId="141"
mozc:keyCode="@integer/uchar_solidus"
mozc:keyIcon="@raw/qwerty__function__solidus">
- <PopUp mozc:popUpIcon="@raw/qwerty__function__solidus" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__solidus" />
</KeyEntity>
</Flick>
</KeyState>
@@ -1192,21 +1259,31 @@
<KeyEntity mozc:sourceId="142"
mozc:keyCode="@integer/uchar_commercial_at"
mozc:keyIcon="@raw/qwerty__function__commercial_at">
- <PopUp mozc:popUpIcon="@raw/qwerty__function__commercial_at" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__commercial_at" />
</KeyEntity>
</Flick>
</KeyState>
</Key>
- <Key mozc:keyBackground="qwertyFunctionWithThreeDots"
+ <Key mozc:keyBackground="qwertyFunctionSpaceWithThreeDots"
mozc:keyWidth="21%p">
<KeyState mozc:contentDescription="@string/cd_key_uchar_space">
<Flick>
<KeyEntity mozc:sourceId="60"
mozc:keyCode="@integer/uchar_space"
mozc:longPressKeyCode="@integer/key_ime_picker_dialog"
- mozc:keyIcon="@raw/qwerty__function__space__icon">
- <PopUp mozc:popUpIcon="@raw/qwerty__function__space__popup" />
- </KeyEntity>
+ mozc:keyIcon="@raw/qwerty__function__space__icon"
+ mozc:iconWidth="@dimen/unlimited"
+ mozc:iconHeight="@dimen/keyboard_qwerty_space_height" />
+ </Flick>
+ </KeyState>
+ <KeyState mozc:contentDescription="@string/cd_key_uchar_space" mozc:metaState="no_globe">
+ <Flick>
+ <KeyEntity mozc:sourceId="150"
+ mozc:keyCode="@integer/uchar_space"
+ mozc:longPressKeyCode="@integer/key_ime_picker_dialog"
+ mozc:keyIcon="@null"
+ mozc:iconWidth="@dimen/unlimited"
+ mozc:iconHeight="@dimen/keyboard_qwerty_space_height" />
</Flick>
</KeyState>
</Key>
@@ -1217,7 +1294,7 @@
<KeyEntity mozc:sourceId="61"
mozc:keyCode="@integer/uchar_full_stop"
mozc:keyIcon="@raw/qwerty__function__full_stop">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__full_stop" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__full_stop" />
</KeyEntity>
</Flick>
</KeyState>
@@ -1229,9 +1306,9 @@
<Flick>
<KeyEntity mozc:sourceId="66"
mozc:keyCode="@integer/key_left"
- mozc:keyIcon="@raw/twelvekeys__function__left_arrow__icon">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__function__left_arrow__popup" />
- </KeyEntity>
+ mozc:keyIcon="@raw/qwerty__function__left_arrow__icon"
+ mozc:iconWidth="@dimen/unlimited"
+ mozc:iconHeight="@dimen/default_function_icon_height" />
</Flick>
</KeyState>
</Key>
@@ -1242,24 +1319,120 @@
<Flick>
<KeyEntity mozc:sourceId="67"
mozc:keyCode="@integer/key_right"
- mozc:keyIcon="@raw/twelvekeys__function__right_arrow__icon">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__function__right_arrow__popup" />
- </KeyEntity>
+ mozc:keyIcon="@raw/qwerty__function__right_arrow__icon"
+ mozc:iconWidth="@dimen/unlimited"
+ mozc:iconHeight="@dimen/default_function_icon_height" />
</Flick>
</KeyState>
</Key>
- <Key mozc:keyBackground="qwertyFunction"
- mozc:keyWidth="13%p" mozc:keyEdgeFlags="right" mozc:isRepeatable="true">
+ <Key mozc:keyBackground="qwertyFunctionWithThreeDots"
+ mozc:keyWidth="13%p" mozc:keyEdgeFlags="right"
+ mozc:defaultIconWidth="@dimen/keyboard_enter_width"
+ mozc:defaultIconHeight="@dimen/unlimited">
<KeyState mozc:contentDescription="@string/cd_key_uchar_linefeed">
<Flick>
<KeyEntity mozc:sourceId="63"
mozc:keyCode="@integer/uchar_linefeed"
- mozc:keyIcon="@raw/qwerty__function__enter__icon">
- <PopUp mozc:popUpIcon="@raw/qwerty__function__enter__popup" />
+ mozc:longPressKeyCode="@integer/key_symbol_emoji"
+ mozc:longPressTimeoutTrigger="false"
+ mozc:keyIcon="@raw/function__enter__icon" >
+ <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+ mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
+ </KeyEntity>
+ </Flick>
+ </KeyState>
+ <KeyState mozc:contentDescription="@string/cd_key_composing_done"
+ mozc:metaState="composing">
+ <Flick>
+ <KeyEntity mozc:sourceId="143"
+ mozc:keyCode="@integer/uchar_linefeed"
+ mozc:longPressKeyCode="@integer/key_symbol_emoji"
+ mozc:longPressTimeoutTrigger="false"
+ mozc:keyIcon="@raw/function__enter__icon">
+ <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+ mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
+ </KeyEntity>
+ </Flick>
+ </KeyState>
+ <KeyState mozc:contentDescription="@string/cd_key_action_done"
+ mozc:metaState="action_done">
+ <Flick>
+ <KeyEntity mozc:sourceId="144"
+ mozc:keyCode="@integer/uchar_linefeed"
+ mozc:longPressKeyCode="@integer/key_symbol_emoji"
+ mozc:longPressTimeoutTrigger="false"
+ mozc:keyIcon="@raw/function__action_done__icon">
+ <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+ mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
+ </KeyEntity>
+ </Flick>
+ </KeyState>
+ <KeyState mozc:contentDescription="@string/cd_key_action_go"
+ mozc:metaState="action_go">
+ <Flick>
+ <KeyEntity mozc:sourceId="145"
+ mozc:keyCode="@integer/uchar_linefeed"
+ mozc:longPressKeyCode="@integer/key_symbol_emoji"
+ mozc:longPressTimeoutTrigger="false"
+ mozc:keyIcon="@raw/function__action_go__icon">
+ <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+ mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
+ </KeyEntity>
+ </Flick>
+ </KeyState>
+ <KeyState mozc:contentDescription="@string/cd_key_action_next"
+ mozc:metaState="action_next">
+ <Flick>
+ <KeyEntity mozc:sourceId="146"
+ mozc:keyCode="@integer/uchar_linefeed"
+ mozc:longPressKeyCode="@integer/key_symbol_emoji"
+ mozc:longPressTimeoutTrigger="false"
+ mozc:keyIcon="@raw/function__action_next__icon" >
+ <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+ mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
+ </KeyEntity>
+ </Flick>
+ </KeyState>
+ <KeyState mozc:contentDescription="@string/cd_key_action_previous"
+ mozc:metaState="action_previous">
+ <Flick>
+ <KeyEntity mozc:sourceId="147"
+ mozc:keyCode="@integer/uchar_linefeed"
+ mozc:longPressKeyCode="@integer/key_symbol_emoji"
+ mozc:longPressTimeoutTrigger="false"
+ mozc:keyIcon="@raw/function__action_previous__icon">
+ <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+ mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
+ </KeyEntity>
+ </Flick>
+ </KeyState>
+ <KeyState mozc:contentDescription="@string/cd_key_action_search"
+ mozc:metaState="action_search">
+ <Flick>
+ <KeyEntity mozc:sourceId="148"
+ mozc:keyCode="@integer/uchar_linefeed"
+ mozc:longPressKeyCode="@integer/key_symbol_emoji"
+ mozc:longPressTimeoutTrigger="false"
+ mozc:keyIcon="@raw/function__action_search__icon">
+ <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+ mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
+ </KeyEntity>
+ </Flick>
+ </KeyState>
+ <KeyState mozc:contentDescription="@string/cd_key_action_send"
+ mozc:metaState="action_send">
+ <Flick>
+ <KeyEntity mozc:sourceId="149"
+ mozc:keyCode="@integer/uchar_linefeed"
+ mozc:longPressKeyCode="@integer/key_symbol_emoji"
+ mozc:longPressTimeoutTrigger="false"
+ mozc:keyIcon="@raw/function__action_send__icon">
+ <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+ mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
</KeyEntity>
</Flick>
</KeyState>
</Key>
</Row>
- <!-- Next sourceId: 143 -->
+ <!-- Next sourceId: 151 -->
</Keyboard>
diff --git a/src/android/static_resources/resources_oss/res/xml/kbd_qwerty_abc_123.xml b/src/android/static_resources/resources_oss/res/xml/kbd_qwerty_abc_123.xml
index ddbed9f..19b14ea 100644
--- a/src/android/static_resources/resources_oss/res/xml/kbd_qwerty_abc_123.xml
+++ b/src/android/static_resources/resources_oss/res/xml/kbd_qwerty_abc_123.xml
@@ -33,11 +33,16 @@
xmlns:mozc="http://schemas.android.com/apk/res-auto"
mozc:keyboardContentDescription="@string/cd_keyboard_number"
mozc:keyBackground="qwertyRegular"
- mozc:keyWidth="10%p" mozc:keyHeight="20.5%"
- mozc:horizontalGap="0.3%p" mozc:verticalGap="4%"
- mozc:popUpWidth="@dimen/key_preview_height" mozc:popUpHeight="@dimen/key_preview_height"
- mozc:popUpXOffset="0dip" mozc:popUpYOffset="@dimen/mini_keyboard_vertical_correction">
- <Row mozc:rowEdgeFlags="top" mozc:keyHeight="0dip" mozc:verticalGap="4%p" />
+ mozc:keyWidth="10%p" mozc:keyHeight="21%p"
+ mozc:horizontalGap="0.3%p" mozc:verticalGap="4%p"
+ mozc:popUpHeight="@dimen/key_preview_height"
+ mozc:popUpIconHeight="@dimen/key_preview_qwerty_icon_height"
+ mozc:popUpXOffset="0dip" mozc:popUpYOffset="@dimen/mini_keyboard_vertical_correction"
+ mozc:defaultIconWidth="@dimen/unlimited"
+ mozc:defaultIconHeight="@dimen/keyboard_qwerty_default_height"
+ mozc:defaultHorizontalPadding="@fraction/keyboard_qwerty_default_horizontal_padding"
+ mozc:defaultVerticalPadding="@fraction/keyboard_qwerty_default_vertical_padding">
+ <Row mozc:rowEdgeFlags="top" mozc:keyHeight="0dip" mozc:verticalGap="2%p" />
<Row>
<Key mozc:keyEdgeFlags="left">
<KeyState mozc:contentDescription="@string/cd_key_uchar_digit_one">
@@ -45,7 +50,7 @@
<KeyEntity mozc:sourceId="1"
mozc:keyCode="@integer/uchar_digit_one"
mozc:keyIcon="@raw/qwerty__keyicon__digit_one">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__digit_one" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__digit_one" />
</KeyEntity>
</Flick>
</KeyState>
@@ -55,7 +60,7 @@
<KeyEntity mozc:sourceId="2"
mozc:keyCode="@integer/uchar_grave_accent"
mozc:keyIcon="@raw/qwerty__keyicon__grave_accent">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__grave_accent" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__grave_accent" />
</KeyEntity>
</Flick>
</KeyState>
@@ -66,7 +71,7 @@
<KeyEntity mozc:sourceId="3"
mozc:keyCode="@integer/uchar_digit_two"
mozc:keyIcon="@raw/qwerty__keyicon__digit_two">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__digit_two" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__digit_two" />
</KeyEntity>
</Flick>
</KeyState>
@@ -76,7 +81,7 @@
<KeyEntity mozc:sourceId="4"
mozc:keyCode="@integer/uchar_tilde"
mozc:keyIcon="@raw/qwerty__keyicon__tilde">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__tilde" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__tilde" />
</KeyEntity>
</Flick>
</KeyState>
@@ -87,7 +92,7 @@
<KeyEntity mozc:sourceId="5"
mozc:keyCode="@integer/uchar_digit_three"
mozc:keyIcon="@raw/qwerty__keyicon__digit_three">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__digit_three" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__digit_three" />
</KeyEntity>
</Flick>
</KeyState>
@@ -97,7 +102,7 @@
<KeyEntity mozc:sourceId="6"
mozc:keyCode="@integer/uchar_ampersand"
mozc:keyIcon="@raw/qwerty__keyicon__ampersand">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__ampersand" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__ampersand" />
</KeyEntity>
</Flick>
</KeyState>
@@ -108,7 +113,7 @@
<KeyEntity mozc:sourceId="7"
mozc:keyCode="@integer/uchar_digit_four"
mozc:keyIcon="@raw/qwerty__keyicon__digit_four">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__digit_four" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__digit_four" />
</KeyEntity>
</Flick>
</KeyState>
@@ -118,7 +123,7 @@
<KeyEntity mozc:sourceId="8"
mozc:keyCode="@integer/uchar_vertical_line"
mozc:keyIcon="@raw/qwerty__keyicon__vertical_line">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__vertical_line" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__vertical_line" />
</KeyEntity>
</Flick>
</KeyState>
@@ -129,7 +134,7 @@
<KeyEntity mozc:sourceId="9"
mozc:keyCode="@integer/uchar_digit_five"
mozc:keyIcon="@raw/qwerty__keyicon__digit_five">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__digit_five" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__digit_five" />
</KeyEntity>
</Flick>
</KeyState>
@@ -139,7 +144,7 @@
<KeyEntity mozc:sourceId="10"
mozc:keyCode="@integer/uchar_circumflex_accent"
mozc:keyIcon="@raw/qwerty__keyicon__circumflex_accent">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__circumflex_accent" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__circumflex_accent" />
</KeyEntity>
</Flick>
</KeyState>
@@ -150,7 +155,7 @@
<KeyEntity mozc:sourceId="11"
mozc:keyCode="@integer/uchar_digit_six"
mozc:keyIcon="@raw/qwerty__keyicon__digit_six">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__digit_six" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__digit_six" />
</KeyEntity>
</Flick>
</KeyState>
@@ -160,7 +165,7 @@
<KeyEntity mozc:sourceId="12"
mozc:keyCode="@integer/uchar_plus_sign"
mozc:keyIcon="@raw/qwerty__keyicon__plus_sign">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__plus_sign" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__plus_sign" />
</KeyEntity>
</Flick>
</KeyState>
@@ -171,7 +176,7 @@
<KeyEntity mozc:sourceId="13"
mozc:keyCode="@integer/uchar_digit_seven"
mozc:keyIcon="@raw/qwerty__keyicon__digit_seven">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__digit_seven" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__digit_seven" />
</KeyEntity>
</Flick>
</KeyState>
@@ -181,7 +186,7 @@
<KeyEntity mozc:sourceId="14"
mozc:keyCode="@integer/uchar_hyphen_minus"
mozc:keyIcon="@raw/qwerty__keyicon__hyphen_minus">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__hyphen_minus" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__hyphen_minus" />
</KeyEntity>
</Flick>
</KeyState>
@@ -192,7 +197,7 @@
<KeyEntity mozc:sourceId="15"
mozc:keyCode="@integer/uchar_digit_eight"
mozc:keyIcon="@raw/qwerty__keyicon__digit_eight">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__digit_eight" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__digit_eight" />
</KeyEntity>
</Flick>
</KeyState>
@@ -202,7 +207,7 @@
<KeyEntity mozc:sourceId="16"
mozc:keyCode="@integer/uchar_asterisk"
mozc:keyIcon="@raw/qwerty__keyicon__asterisk">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__asterisk" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__asterisk" />
</KeyEntity>
</Flick>
</KeyState>
@@ -213,7 +218,7 @@
<KeyEntity mozc:sourceId="17"
mozc:keyCode="@integer/uchar_digit_nine"
mozc:keyIcon="@raw/qwerty__keyicon__digit_nine">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__digit_nine" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__digit_nine" />
</KeyEntity>
</Flick>
</KeyState>
@@ -223,7 +228,7 @@
<KeyEntity mozc:sourceId="18"
mozc:keyCode="@integer/uchar_solidus"
mozc:keyIcon="@raw/qwerty__keyicon__solidus">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__solidus" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__solidus" />
</KeyEntity>
</Flick>
</KeyState>
@@ -234,7 +239,7 @@
<KeyEntity mozc:sourceId="19"
mozc:keyCode="@integer/uchar_digit_zero"
mozc:keyIcon="@raw/qwerty__keyicon__digit_zero">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__digit_zero" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__digit_zero" />
</KeyEntity>
</Flick>
</KeyState>
@@ -244,21 +249,21 @@
<KeyEntity mozc:sourceId="20"
mozc:keyCode="@integer/uchar_equals_sign"
mozc:keyIcon="@raw/qwerty__keyicon__equals_sign">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__equals_sign" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__equals_sign" />
</KeyEntity>
</Flick>
</KeyState>
</Key>
</Row>
<Row>
- <Spacer mozc:horizontalGap="5%p" />
+ <Spacer mozc:keyWidth="5%p" mozc:keyBackground="transparent" />
<Key mozc:keyEdgeFlags="left" >
<KeyState mozc:contentDescription="@string/cd_key_uchar_commercial_at">
<Flick>
<KeyEntity mozc:sourceId="21"
mozc:keyCode="@integer/uchar_commercial_at"
mozc:keyIcon="@raw/qwerty__keyicon__commercial_at">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__commercial_at" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__commercial_at" />
</KeyEntity>
</Flick>
</KeyState>
@@ -268,7 +273,7 @@
<KeyEntity mozc:sourceId="22"
mozc:keyCode="@integer/uchar_reverse_solidus"
mozc:keyIcon="@raw/qwerty__keyicon__reverse_solidus">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__reverse_solidus" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__reverse_solidus" />
</KeyEntity>
</Flick>
</KeyState>
@@ -279,7 +284,7 @@
<KeyEntity mozc:sourceId="23"
mozc:keyCode="@integer/uchar_number_sign"
mozc:keyIcon="@raw/qwerty__keyicon__number_sign">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__number_sign" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__number_sign" />
</KeyEntity>
</Flick>
</KeyState>
@@ -289,7 +294,7 @@
<KeyEntity mozc:sourceId="24"
mozc:keyCode="@integer/uchar_less_than_sign"
mozc:keyIcon="@raw/qwerty__keyicon__less_than_sign">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__less_than_sign" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__less_than_sign" />
</KeyEntity>
</Flick>
</KeyState>
@@ -300,7 +305,7 @@
<KeyEntity mozc:sourceId="25"
mozc:keyCode="@integer/uchar_ampersand"
mozc:keyIcon="@raw/qwerty__keyicon__ampersand">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__ampersand" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__ampersand" />
</KeyEntity>
</Flick>
</KeyState>
@@ -310,7 +315,7 @@
<KeyEntity mozc:sourceId="26"
mozc:keyCode="@integer/uchar_greater_than_sign"
mozc:keyIcon="@raw/qwerty__keyicon__greater_than_sign">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__greater_than_sign" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__greater_than_sign" />
</KeyEntity>
</Flick>
</KeyState>
@@ -321,7 +326,7 @@
<KeyEntity mozc:sourceId="27"
mozc:keyCode="@integer/uchar_hyphen_minus"
mozc:keyIcon="@raw/qwerty__keyicon__hyphen_minus">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__hyphen_minus" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__hyphen_minus" />
</KeyEntity>
</Flick>
</KeyState>
@@ -331,7 +336,7 @@
<KeyEntity mozc:sourceId="28"
mozc:keyCode="@integer/uchar_left_square_bracket"
mozc:keyIcon="@raw/qwerty__keyicon__left_square_bracket">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__left_square_bracket" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__left_square_bracket" />
</KeyEntity>
</Flick>
</KeyState>
@@ -342,7 +347,7 @@
<KeyEntity mozc:sourceId="29"
mozc:keyCode="@integer/uchar_solidus"
mozc:keyIcon="@raw/qwerty__keyicon__solidus">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__solidus" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__solidus" />
</KeyEntity>
</Flick>
</KeyState>
@@ -352,7 +357,7 @@
<KeyEntity mozc:sourceId="30"
mozc:keyCode="@integer/uchar_right_square_bracket"
mozc:keyIcon="@raw/qwerty__keyicon__right_square_bracket">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__right_square_bracket" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__right_square_bracket" />
</KeyEntity>
</Flick>
</KeyState>
@@ -363,7 +368,7 @@
<KeyEntity mozc:sourceId="31"
mozc:keyCode="@integer/uchar_dollar_sign"
mozc:keyIcon="@raw/qwerty__keyicon__dollar_sign">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__dollar_sign" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__dollar_sign" />
</KeyEntity>
</Flick>
</KeyState>
@@ -373,7 +378,7 @@
<KeyEntity mozc:sourceId="32"
mozc:keyCode="@integer/uchar_left_curly_bracket"
mozc:keyIcon="@raw/qwerty__keyicon__left_curly_bracket">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__left_curly_bracket" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__left_curly_bracket" />
</KeyEntity>
</Flick>
</KeyState>
@@ -384,7 +389,7 @@
<KeyEntity mozc:sourceId="33"
mozc:keyCode="@integer/uchar_percent_sign"
mozc:keyIcon="@raw/qwerty__keyicon__percent_sign">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__percent_sign" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__percent_sign" />
</KeyEntity>
</Flick>
</KeyState>
@@ -394,7 +399,7 @@
<KeyEntity mozc:sourceId="34"
mozc:keyCode="@integer/uchar_right_curly_bracket"
mozc:keyIcon="@raw/qwerty__keyicon__right_curly_bracket">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__right_curly_bracket" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__right_curly_bracket" />
</KeyEntity>
</Flick>
</KeyState>
@@ -405,7 +410,7 @@
<KeyEntity mozc:sourceId="35"
mozc:keyCode="@integer/uchar_left_parenthesis"
mozc:keyIcon="@raw/qwerty__keyicon__left_parenthesis">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__left_parenthesis" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__left_parenthesis" />
</KeyEntity>
</Flick>
</KeyState>
@@ -416,44 +421,43 @@
<KeyEntity mozc:sourceId="36"
mozc:keyCode="@integer/uchar_right_parenthesis"
mozc:keyIcon="@raw/qwerty__keyicon__right_parenthesis">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__right_parenthesis" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__right_parenthesis" />
</KeyEntity>
</Flick>
</KeyState>
</Key>
- <Spacer mozc:horizontalGap="5%p" />
+ <Spacer mozc:keyWidth="5%p" mozc:keyBackground="transparent" />
</Row>
<Row>
- <Key
- mozc:keyWidth="13%p" mozc:keyEdgeFlags="left"
- mozc:isModifier="true" mozc:isSticky="true">
+ <Key mozc:keyWidth="13%p" mozc:keyEdgeFlags="left" mozc:isModifier="true"
+ mozc:keyBackground="qwertyFunction"
+ mozc:defaultIconWidth="@dimen/unlimited"
+ mozc:defaultIconHeight="@dimen/default_function_icon_height">
<KeyState mozc:contentDescription="@string/cd_key_alt"
- mozc:nextMetaState="alt"
- mozc:keyBackground="qwertyFunctionLightOff" >
+ mozc:nextMetaState="alt" >
<Flick>
<KeyEntity mozc:sourceId="37"
mozc:keyCode="@integer/key_alt"
- mozc:keyIcon="@raw/qwerty__function__alt__icon" />
+ mozc:keyIcon="@raw/qwerty__function__alt__base_icon" />
</Flick>
</KeyState>
<KeyState mozc:contentDescription="@string/cd_key_alt_unmodified"
- mozc:metaState="alt" mozc:nextRemovedMetaStates="alt"
- mozc:keyBackground="qwertyFunctionLightOn" >
+ mozc:metaState="alt" mozc:nextRemovedMetaStates="alt" >
<Flick>
<KeyEntity mozc:sourceId="38"
mozc:keyCode="@integer/key_alt"
- mozc:keyIcon="@raw/qwerty__function__alt__icon" />
+ mozc:keyIcon="@raw/qwerty__function__alt__alted_icon" />
</Flick>
</KeyState>
</Key>
- <Spacer mozc:horizontalGap="2%p" mozc:stick="right" />
+ <Spacer mozc:keyWidth="2%p" mozc:stick="right" mozc:keyBackground="transparent" />
<Key>
<KeyState mozc:contentDescription="@string/cd_key_uchar_exclamation_mark">
<Flick>
<KeyEntity mozc:sourceId="39"
mozc:keyCode="@integer/uchar_exclamation_mark"
mozc:keyIcon="@raw/qwerty__keyicon__exclamation_mark">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__exclamation_mark" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__exclamation_mark" />
</KeyEntity>
</Flick>
</KeyState>
@@ -464,7 +468,7 @@
<KeyEntity mozc:sourceId="40"
mozc:keyCode="@integer/uchar_question_mark"
mozc:keyIcon="@raw/qwerty__keyicon__question_mark">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__question_mark" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__question_mark" />
</KeyEntity>
</Flick>
</KeyState>
@@ -475,7 +479,7 @@
<KeyEntity mozc:sourceId="41"
mozc:keyCode="@integer/uchar_apostrophe"
mozc:keyIcon="@raw/qwerty__keyicon__apostrophe">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__apostrophe" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__apostrophe" />
</KeyEntity>
</Flick>
</KeyState>
@@ -486,7 +490,7 @@
<KeyEntity mozc:sourceId="42"
mozc:keyCode="@integer/uchar_quotation_mark"
mozc:keyIcon="@raw/qwerty__keyicon__quotation_mark">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__quotation_mark" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__quotation_mark" />
</KeyEntity>
</Flick>
</KeyState>
@@ -497,7 +501,7 @@
<KeyEntity mozc:sourceId="43"
mozc:keyCode="@integer/uchar_colon"
mozc:keyIcon="@raw/qwerty__keyicon__colon">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__colon" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__colon" />
</KeyEntity>
</Flick>
</KeyState>
@@ -508,7 +512,7 @@
<KeyEntity mozc:sourceId="44"
mozc:keyCode="@integer/uchar_semicolon"
mozc:keyIcon="@raw/qwerty__keyicon__semicolon">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__semicolon" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__semicolon" />
</KeyEntity>
</Flick>
</KeyState>
@@ -519,36 +523,36 @@
<KeyEntity mozc:sourceId="45"
mozc:keyCode="@integer/uchar_low_line"
mozc:keyIcon="@raw/qwerty__keyicon__low_line">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__low_line" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__low_line" />
</KeyEntity>
</Flick>
</KeyState>
</Key>
- <Spacer mozc:horizontalGap="2%p" mozc:stick="left" />
+ <Spacer mozc:keyWidth="2%p" mozc:stick="left" mozc:keyBackground="transparent" />
<Key mozc:keyBackground="qwertyFunction"
mozc:keyWidth="13%p" mozc:keyEdgeFlags="right" mozc:isRepeatable="true">
<KeyState mozc:contentDescription="@string/cd_key_uchar_backspace">
<Flick>
<KeyEntity mozc:sourceId="46"
mozc:keyCode="@integer/key_backspace"
- mozc:keyIcon="@raw/qwerty__function__delete__icon">
- <PopUp mozc:popUpIcon="@raw/qwerty__function__delete__popup" />
- </KeyEntity>
+ mozc:keyIcon="@raw/qwerty__function__delete__icon"
+ mozc:iconWidth="@dimen/unlimited"
+ mozc:iconHeight="@dimen/default_function_icon_height" />
</Flick>
</KeyState>
</Key>
</Row>
<Row>
<Key mozc:keyBackground="qwertyFunctionWithThreeDots"
- mozc:keyWidth="26%p" mozc:keyEdgeFlags="left">
+ mozc:keyHorizontalLayoutWeight="1" mozc:keyEdgeFlags="left">
<KeyState mozc:contentDescription="@string/cd_key_chartype_to_abc">
<Flick>
<KeyEntity mozc:sourceId="47"
mozc:keyCode="@integer/key_chartype_to_abc"
mozc:longPressKeyCode="@integer/key_menu_dialog"
- mozc:keyIcon="@raw/qwerty__function__text_alphabet__icon">
- <PopUp mozc:popUpIcon="@raw/qwerty__function__text_alphabet__popup" />
- </KeyEntity>
+ mozc:keyIcon="@raw/qwerty__function__text_alphabet__icon"
+ mozc:iconWidth="@dimen/unlimited"
+ mozc:iconHeight="@dimen/default_function_icon_height" />
</Flick>
</KeyState>
</Key>
@@ -559,21 +563,31 @@
<KeyEntity mozc:sourceId="48"
mozc:keyCode="@integer/uchar_comma"
mozc:keyIcon="@raw/qwerty__function__comma">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__comma" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__comma" />
</KeyEntity>
</Flick>
</KeyState>
</Key>
- <Key mozc:keyBackground="qwertyFunctionWithThreeDots"
+ <Key mozc:keyBackground="qwertyFunctionSpaceWithThreeDots"
mozc:keyWidth="21%p">
<KeyState mozc:contentDescription="@string/cd_key_uchar_space">
<Flick>
<KeyEntity mozc:sourceId="49"
mozc:keyCode="@integer/uchar_space"
mozc:longPressKeyCode="@integer/key_ime_picker_dialog"
- mozc:keyIcon="@raw/qwerty__function__space__icon">
- <PopUp mozc:popUpIcon="@raw/qwerty__function__space__popup" />
- </KeyEntity>
+ mozc:keyIcon="@raw/qwerty__function__space__icon"
+ mozc:iconWidth="@dimen/unlimited"
+ mozc:iconHeight="@dimen/keyboard_qwerty_space_height" />
+ </Flick>
+ </KeyState>
+ <KeyState mozc:contentDescription="@string/cd_key_uchar_space" mozc:metaState="no_globe">
+ <Flick>
+ <KeyEntity mozc:sourceId="64"
+ mozc:keyCode="@integer/uchar_space"
+ mozc:longPressKeyCode="@integer/key_ime_picker_dialog"
+ mozc:keyIcon="@null"
+ mozc:iconWidth="@dimen/unlimited"
+ mozc:iconHeight="@dimen/keyboard_qwerty_space_height" />
</Flick>
</KeyState>
</Key>
@@ -584,7 +598,7 @@
<KeyEntity mozc:sourceId="50"
mozc:keyCode="@integer/uchar_full_stop"
mozc:keyIcon="@raw/qwerty__function__full_stop">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__full_stop" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__full_stop" />
</KeyEntity>
</Flick>
</KeyState>
@@ -596,9 +610,9 @@
<Flick>
<KeyEntity mozc:sourceId="55"
mozc:keyCode="@integer/key_left"
- mozc:keyIcon="@raw/twelvekeys__function__left_arrow__icon">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__function__left_arrow__popup" />
- </KeyEntity>
+ mozc:keyIcon="@raw/qwerty__function__left_arrow__icon"
+ mozc:iconWidth="@dimen/unlimited"
+ mozc:iconHeight="@dimen/default_function_icon_height" />
</Flick>
</KeyState>
</Key>
@@ -609,24 +623,120 @@
<Flick>
<KeyEntity mozc:sourceId="56"
mozc:keyCode="@integer/key_right"
- mozc:keyIcon="@raw/twelvekeys__function__right_arrow__icon">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__function__right_arrow__popup" />
- </KeyEntity>
+ mozc:keyIcon="@raw/qwerty__function__right_arrow__icon"
+ mozc:iconWidth="@dimen/unlimited"
+ mozc:iconHeight="@dimen/default_function_icon_height" />
</Flick>
</KeyState>
</Key>
- <Key mozc:keyBackground="qwertyFunction"
- mozc:keyWidth="13%p" mozc:keyEdgeFlags="right" mozc:isRepeatable="true">
+ <Key mozc:keyBackground="qwertyFunctionWithThreeDots"
+ mozc:keyWidth="13%p" mozc:keyEdgeFlags="right"
+ mozc:defaultIconWidth="@dimen/keyboard_enter_width"
+ mozc:defaultIconHeight="@dimen/unlimited">
<KeyState mozc:contentDescription="@string/cd_key_uchar_linefeed">
<Flick>
<KeyEntity mozc:sourceId="52"
mozc:keyCode="@integer/uchar_linefeed"
- mozc:keyIcon="@raw/qwerty__function__enter__icon">
- <PopUp mozc:popUpIcon="@raw/qwerty__function__enter__popup" />
+ mozc:longPressKeyCode="@integer/key_symbol_emoji"
+ mozc:longPressTimeoutTrigger="false"
+ mozc:keyIcon="@raw/function__enter__icon" >
+ <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+ mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
+ </KeyEntity>
+ </Flick>
+ </KeyState>
+ <KeyState mozc:contentDescription="@string/cd_key_composing_done"
+ mozc:metaState="composing">
+ <Flick>
+ <KeyEntity mozc:sourceId="57"
+ mozc:keyCode="@integer/uchar_linefeed"
+ mozc:longPressKeyCode="@integer/key_symbol_emoji"
+ mozc:longPressTimeoutTrigger="false"
+ mozc:keyIcon="@raw/function__enter__icon">
+ <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+ mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
+ </KeyEntity>
+ </Flick>
+ </KeyState>
+ <KeyState mozc:contentDescription="@string/cd_key_action_done"
+ mozc:metaState="action_done">
+ <Flick>
+ <KeyEntity mozc:sourceId="58"
+ mozc:keyCode="@integer/uchar_linefeed"
+ mozc:longPressKeyCode="@integer/key_symbol_emoji"
+ mozc:longPressTimeoutTrigger="false"
+ mozc:keyIcon="@raw/function__action_done__icon">
+ <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+ mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
+ </KeyEntity>
+ </Flick>
+ </KeyState>
+ <KeyState mozc:contentDescription="@string/cd_key_action_go"
+ mozc:metaState="action_go">
+ <Flick>
+ <KeyEntity mozc:sourceId="59"
+ mozc:keyCode="@integer/uchar_linefeed"
+ mozc:longPressKeyCode="@integer/key_symbol_emoji"
+ mozc:longPressTimeoutTrigger="false"
+ mozc:keyIcon="@raw/function__action_go__icon">
+ <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+ mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
+ </KeyEntity>
+ </Flick>
+ </KeyState>
+ <KeyState mozc:contentDescription="@string/cd_key_action_next"
+ mozc:metaState="action_next">
+ <Flick>
+ <KeyEntity mozc:sourceId="60"
+ mozc:keyCode="@integer/uchar_linefeed"
+ mozc:longPressKeyCode="@integer/key_symbol_emoji"
+ mozc:longPressTimeoutTrigger="false"
+ mozc:keyIcon="@raw/function__action_next__icon" >
+ <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+ mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
+ </KeyEntity>
+ </Flick>
+ </KeyState>
+ <KeyState mozc:contentDescription="@string/cd_key_action_previous"
+ mozc:metaState="action_previous">
+ <Flick>
+ <KeyEntity mozc:sourceId="61"
+ mozc:keyCode="@integer/uchar_linefeed"
+ mozc:longPressKeyCode="@integer/key_symbol_emoji"
+ mozc:longPressTimeoutTrigger="false"
+ mozc:keyIcon="@raw/function__action_previous__icon">
+ <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+ mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
+ </KeyEntity>
+ </Flick>
+ </KeyState>
+ <KeyState mozc:contentDescription="@string/cd_key_action_search"
+ mozc:metaState="action_search">
+ <Flick>
+ <KeyEntity mozc:sourceId="62"
+ mozc:keyCode="@integer/uchar_linefeed"
+ mozc:longPressKeyCode="@integer/key_symbol_emoji"
+ mozc:longPressTimeoutTrigger="false"
+ mozc:keyIcon="@raw/function__action_search__icon">
+ <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+ mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
+ </KeyEntity>
+ </Flick>
+ </KeyState>
+ <KeyState mozc:contentDescription="@string/cd_key_action_send"
+ mozc:metaState="action_send">
+ <Flick>
+ <KeyEntity mozc:sourceId="63"
+ mozc:keyCode="@integer/uchar_linefeed"
+ mozc:longPressKeyCode="@integer/key_symbol_emoji"
+ mozc:longPressTimeoutTrigger="false"
+ mozc:keyIcon="@raw/function__action_send__icon" >
+ <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+ mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
</KeyEntity>
</Flick>
</KeyState>
</Key>
</Row>
- <!-- Next sourceId: 57 -->
+ <!-- Next sourceId: 65 -->
</Keyboard>
diff --git a/src/android/static_resources/resources_oss/res/xml/kbd_qwerty_kana.xml b/src/android/static_resources/resources_oss/res/xml/kbd_qwerty_kana.xml
index 6f41993..acc50ec 100644
--- a/src/android/static_resources/resources_oss/res/xml/kbd_qwerty_kana.xml
+++ b/src/android/static_resources/resources_oss/res/xml/kbd_qwerty_kana.xml
@@ -33,19 +33,27 @@
xmlns:mozc="http://schemas.android.com/apk/res-auto"
mozc:keyboardContentDescription="@string/cd_keyboard_kana"
mozc:keyBackground="qwertyRegular"
- mozc:keyWidth="10%p" mozc:keyHeight="20.5%p"
+ mozc:keyWidth="10%p" mozc:keyHeight="21%p"
mozc:horizontalGap="0.3%p" mozc:verticalGap="4%p"
- mozc:popUpWidth="@dimen/key_preview_height" mozc:popUpHeight="@dimen/key_preview_height"
- mozc:popUpXOffset="0dip" mozc:popUpYOffset="@dimen/mini_keyboard_vertical_correction">
- <Row mozc:rowEdgeFlags="top" mozc:keyHeight="0dip" mozc:verticalGap="4%p" />
+ mozc:popUpHeight="@dimen/key_preview_height"
+ mozc:popUpIconHeight="@dimen/key_preview_qwerty_icon_height"
+ mozc:popUpXOffset="0dip" mozc:popUpYOffset="@dimen/mini_keyboard_vertical_correction"
+ mozc:defaultIconWidth="@dimen/unlimited"
+ mozc:defaultIconHeight="@dimen/keyboard_qwerty_default_height"
+ mozc:defaultHorizontalPadding="@fraction/keyboard_qwerty_default_horizontal_padding"
+ mozc:defaultVerticalPadding="@fraction/keyboard_qwerty_default_vertical_padding">
+ <Row mozc:rowEdgeFlags="top" mozc:keyHeight="0dip" mozc:verticalGap="2%p" />
<Row>
<Key mozc:keyEdgeFlags="left">
<KeyState mozc:contentDescription="@string/cd_key_uchar_latin_small_letter_q">
<Flick>
<KeyEntity mozc:sourceId="1"
mozc:keyCode="@integer/uchar_latin_small_letter_q"
+ mozc:longPressKeyCode="@integer/uchar_digit_one"
+ mozc:longPressTimeoutTrigger="false"
mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_q">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_q" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__popup__latin_capital_letter_q"
+ mozc:popUpLongPressIcon="@raw/qwerty__keyicon__digit_one" />
</KeyEntity>
</Flick>
<Flick mozc:direction="up">
@@ -62,8 +70,11 @@
<Flick>
<KeyEntity mozc:sourceId="2"
mozc:keyCode="@integer/uchar_latin_small_letter_w"
+ mozc:longPressKeyCode="@integer/uchar_digit_two"
+ mozc:longPressTimeoutTrigger="false"
mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_w">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_w" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__popup__latin_capital_letter_w"
+ mozc:popUpLongPressIcon="@raw/qwerty__keyicon__digit_two" />
</KeyEntity>
</Flick>
<Flick mozc:direction="up">
@@ -80,8 +91,11 @@
<Flick>
<KeyEntity mozc:sourceId="3"
mozc:keyCode="@integer/uchar_latin_small_letter_e"
+ mozc:longPressKeyCode="@integer/uchar_digit_three"
+ mozc:longPressTimeoutTrigger="false"
mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_e">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_e" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__popup__latin_capital_letter_e"
+ mozc:popUpLongPressIcon="@raw/qwerty__keyicon__digit_three" />
</KeyEntity>
</Flick>
<Flick mozc:direction="up">
@@ -98,8 +112,11 @@
<Flick>
<KeyEntity mozc:sourceId="4"
mozc:keyCode="@integer/uchar_latin_small_letter_r"
+ mozc:longPressKeyCode="@integer/uchar_digit_four"
+ mozc:longPressTimeoutTrigger="false"
mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_r">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_r" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__popup__latin_capital_letter_r"
+ mozc:popUpLongPressIcon="@raw/qwerty__keyicon__digit_four" />
</KeyEntity>
</Flick>
<Flick mozc:direction="up">
@@ -116,8 +133,11 @@
<Flick>
<KeyEntity mozc:sourceId="5"
mozc:keyCode="@integer/uchar_latin_small_letter_t"
+ mozc:longPressKeyCode="@integer/uchar_digit_five"
+ mozc:longPressTimeoutTrigger="false"
mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_t">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_t" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__popup__latin_capital_letter_t"
+ mozc:popUpLongPressIcon="@raw/qwerty__keyicon__digit_five" />
</KeyEntity>
</Flick>
<Flick mozc:direction="up">
@@ -134,8 +154,11 @@
<Flick>
<KeyEntity mozc:sourceId="6"
mozc:keyCode="@integer/uchar_latin_small_letter_y"
+ mozc:longPressKeyCode="@integer/uchar_digit_six"
+ mozc:longPressTimeoutTrigger="false"
mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_y">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_y" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__popup__latin_capital_letter_y"
+ mozc:popUpLongPressIcon="@raw/qwerty__keyicon__digit_six" />
</KeyEntity>
</Flick>
<Flick mozc:direction="up">
@@ -152,8 +175,11 @@
<Flick>
<KeyEntity mozc:sourceId="7"
mozc:keyCode="@integer/uchar_latin_small_letter_u"
+ mozc:longPressKeyCode="@integer/uchar_digit_seven"
+ mozc:longPressTimeoutTrigger="false"
mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_u">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_u" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__popup__latin_capital_letter_u"
+ mozc:popUpLongPressIcon="@raw/qwerty__keyicon__digit_seven" />
</KeyEntity>
</Flick>
<Flick mozc:direction="up">
@@ -170,8 +196,11 @@
<Flick>
<KeyEntity mozc:sourceId="8"
mozc:keyCode="@integer/uchar_latin_small_letter_i"
+ mozc:longPressKeyCode="@integer/uchar_digit_eight"
+ mozc:longPressTimeoutTrigger="false"
mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_i">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_i" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__popup__latin_capital_letter_i"
+ mozc:popUpLongPressIcon="@raw/qwerty__keyicon__digit_eight" />
</KeyEntity>
</Flick>
<Flick mozc:direction="up">
@@ -188,8 +217,11 @@
<Flick>
<KeyEntity mozc:sourceId="9"
mozc:keyCode="@integer/uchar_latin_small_letter_o"
+ mozc:longPressKeyCode="@integer/uchar_digit_nine"
+ mozc:longPressTimeoutTrigger="false"
mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_o">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_o" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__popup__latin_capital_letter_o"
+ mozc:popUpLongPressIcon="@raw/qwerty__keyicon__digit_nine" />
</KeyEntity>
</Flick>
<Flick mozc:direction="up">
@@ -206,8 +238,11 @@
<Flick>
<KeyEntity mozc:sourceId="10"
mozc:keyCode="@integer/uchar_latin_small_letter_p"
+ mozc:longPressKeyCode="@integer/uchar_digit_zero"
+ mozc:longPressTimeoutTrigger="false"
mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_p">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_p" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__popup__latin_capital_letter_p"
+ mozc:popUpLongPressIcon="@raw/qwerty__keyicon__digit_zero" />
</KeyEntity>
</Flick>
<Flick mozc:direction="up">
@@ -227,7 +262,7 @@
<KeyEntity mozc:sourceId="11"
mozc:keyCode="@integer/uchar_latin_small_letter_a"
mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_a">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_a" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__latin_capital_letter_a" />
</KeyEntity>
</Flick>
</KeyState>
@@ -238,7 +273,7 @@
<KeyEntity mozc:sourceId="12"
mozc:keyCode="@integer/uchar_latin_small_letter_s"
mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_s">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_s" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__latin_capital_letter_s" />
</KeyEntity>
</Flick>
</KeyState>
@@ -249,7 +284,7 @@
<KeyEntity mozc:sourceId="13"
mozc:keyCode="@integer/uchar_latin_small_letter_d"
mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_d">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_d" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__latin_capital_letter_d" />
</KeyEntity>
</Flick>
</KeyState>
@@ -260,7 +295,7 @@
<KeyEntity mozc:sourceId="14"
mozc:keyCode="@integer/uchar_latin_small_letter_f"
mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_f">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_f" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__latin_capital_letter_f" />
</KeyEntity>
</Flick>
</KeyState>
@@ -271,7 +306,7 @@
<KeyEntity mozc:sourceId="15"
mozc:keyCode="@integer/uchar_latin_small_letter_g"
mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_g">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_g" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__latin_capital_letter_g" />
</KeyEntity>
</Flick>
</KeyState>
@@ -282,7 +317,7 @@
<KeyEntity mozc:sourceId="16"
mozc:keyCode="@integer/uchar_latin_small_letter_h"
mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_h">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_h" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__latin_capital_letter_h" />
</KeyEntity>
</Flick>
</KeyState>
@@ -293,7 +328,7 @@
<KeyEntity mozc:sourceId="17"
mozc:keyCode="@integer/uchar_latin_small_letter_j"
mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_j">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_j" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__latin_capital_letter_j" />
</KeyEntity>
</Flick>
</KeyState>
@@ -304,7 +339,7 @@
<KeyEntity mozc:sourceId="18"
mozc:keyCode="@integer/uchar_latin_small_letter_k"
mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_k">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_k" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__latin_capital_letter_k" />
</KeyEntity>
</Flick>
</KeyState>
@@ -315,7 +350,7 @@
<KeyEntity mozc:sourceId="19"
mozc:keyCode="@integer/uchar_latin_small_letter_l"
mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_l">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_l" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__latin_capital_letter_l" />
</KeyEntity>
</Flick>
</KeyState>
@@ -326,7 +361,7 @@
<KeyEntity mozc:sourceId="20"
mozc:keyCode="@integer/uchar_hyphen_minus"
mozc:keyIcon="@raw/qwerty__keyicon__minus_sign">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__minus_sign" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__minus_sign" />
</KeyEntity>
</Flick>
</KeyState>
@@ -339,20 +374,28 @@
<Flick>
<KeyEntity mozc:sourceId="21"
mozc:keyCode="@integer/key_symbol"
- mozc:keyIcon="@raw/qwerty__function__symbol__icon">
- <PopUp mozc:popUpIcon="@raw/qwerty__function__symbol__popup" />
- </KeyEntity>
+ mozc:keyIcon="@raw/qwerty__function__symbol__icon"
+ mozc:iconWidth="@dimen/unlimited"
+ mozc:iconHeight="@dimen/default_function_icon_height" />
+ </Flick>
+ </KeyState>
+ <KeyState mozc:contentDescription="@string/cd_key_symbol" mozc:metaState="handling_touch_event">
+ <Flick>
+ <KeyEntity mozc:sourceId="60"
+ mozc:keyIcon="@raw/twelvekeys__function__symbol__icon"
+ mozc:iconWidth="@dimen/unlimited"
+ mozc:iconHeight="@dimen/default_function_icon_height" />
</Flick>
</KeyState>
</Key>
- <Spacer mozc:horizontalGap="2%" mozc:stick="right" />
+ <Spacer mozc:keyWidth="2%" mozc:stick="right" mozc:keyBackground="transparent" />
<Key>
<KeyState mozc:contentDescription="@string/cd_key_uchar_latin_small_letter_z">
<Flick>
<KeyEntity mozc:sourceId="22"
mozc:keyCode="@integer/uchar_latin_small_letter_z"
mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_z">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_z" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__latin_capital_letter_z" />
</KeyEntity>
</Flick>
</KeyState>
@@ -363,7 +406,7 @@
<KeyEntity mozc:sourceId="23"
mozc:keyCode="@integer/uchar_latin_small_letter_x"
mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_x">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_x" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__latin_capital_letter_x" />
</KeyEntity>
</Flick>
</KeyState>
@@ -374,7 +417,7 @@
<KeyEntity mozc:sourceId="24"
mozc:keyCode="@integer/uchar_latin_small_letter_c"
mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_c">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_c" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__latin_capital_letter_c" />
</KeyEntity>
</Flick>
</KeyState>
@@ -385,7 +428,7 @@
<KeyEntity mozc:sourceId="25"
mozc:keyCode="@integer/uchar_latin_small_letter_v"
mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_v">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_v" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__latin_capital_letter_v" />
</KeyEntity>
</Flick>
</KeyState>
@@ -396,7 +439,7 @@
<KeyEntity mozc:sourceId="26"
mozc:keyCode="@integer/uchar_latin_small_letter_b"
mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_b">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_b" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__latin_capital_letter_b" />
</KeyEntity>
</Flick>
</KeyState>
@@ -407,7 +450,7 @@
<KeyEntity mozc:sourceId="27"
mozc:keyCode="@integer/uchar_latin_small_letter_n"
mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_n">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_n" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__latin_capital_letter_n" />
</KeyEntity>
</Flick>
</KeyState>
@@ -418,21 +461,21 @@
<KeyEntity mozc:sourceId="28"
mozc:keyCode="@integer/uchar_latin_small_letter_m"
mozc:keyIcon="@raw/qwerty__keyicon__latin_capital_letter_m">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__latin_capital_letter_m" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__latin_capital_letter_m" />
</KeyEntity>
</Flick>
</KeyState>
</Key>
- <Spacer mozc:horizontalGap="2%" mozc:stick="left" />
+ <Spacer mozc:keyWidth="2%" mozc:stick="left" mozc:keyBackground="transparent" />
<Key mozc:keyBackground="qwertyFunction"
mozc:keyWidth="13%p" mozc:keyEdgeFlags="right" mozc:isRepeatable="true">
<KeyState mozc:contentDescription="@string/cd_key_uchar_backspace">
<Flick>
<KeyEntity mozc:sourceId="29"
mozc:keyCode="@integer/key_backspace"
- mozc:keyIcon="@raw/qwerty__function__delete__icon">
- <PopUp mozc:popUpIcon="@raw/qwerty__function__delete__popup" />
- </KeyEntity>
+ mozc:keyIcon="@raw/qwerty__function__delete__icon"
+ mozc:iconWidth="@dimen/unlimited"
+ mozc:iconHeight="@dimen/default_function_icon_height" />
</Flick>
</KeyState>
</Key>
@@ -445,46 +488,76 @@
<KeyEntity mozc:sourceId="30"
mozc:keyCode="@integer/key_chartype_to_abc"
mozc:longPressKeyCode="@integer/key_menu_dialog"
- mozc:keyIcon="@raw/qwerty__function__kana__icon">
- <PopUp mozc:popUpIcon="@raw/qwerty__function__alphabet__popup" />
+ mozc:keyIcon="@raw/qwerty__function__kana__icon"
+ mozc:iconWidth="@dimen/unlimited"
+ mozc:iconHeight="@dimen/default_function_icon_height" />
+ </Flick>
+ </KeyState>
+ </Key>
+ <Key mozc:keyBackground="qwertyFunction"
+ mozc:keyHorizontalLayoutWeight="1">
+ <KeyState mozc:contentDescription="@string/cd_key_uchar_ideographic_comma">
+ <Flick>
+ <KeyEntity mozc:sourceId="32"
+ mozc:keyCode="@integer/uchar_comma"
+ mozc:keyIcon="@raw/qwerty__function__ideographic_comma">
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__ideographic_comma" />
</KeyEntity>
</Flick>
</KeyState>
</Key>
<Key mozc:keyBackground="qwertyFunction"
mozc:keyWidth="13%p">
- <KeyState mozc:contentDescription="@string/cd_key_chartype_to_kana_123">
+ <KeyState mozc:contentDescription="@string/cd_key_symbol" mozc:metaState="fallback|composing">
<Flick>
<KeyEntity mozc:sourceId="31"
- mozc:keyCode="@integer/key_chartype_to_kana_123"
- mozc:keyIcon="@raw/qwerty__function__number_kana__icon">
- <PopUp mozc:popUpIcon="@raw/qwerty__function__number_kana__popup" />
+ mozc:keyCode="@integer/uchar_question_mark"
+ mozc:longPressKeyCode="@integer/uchar_exclamation_mark"
+ mozc:longPressTimeoutTrigger="false"
+ mozc:keyIcon="@raw/qwerty__function__question_mark">
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__question_mark"
+ mozc:popUpLongPressIcon="@raw/qwerty__keyicon__exclamation_mark" />
+ </KeyEntity>
+ </Flick>
+ <Flick mozc:direction="up">
+ <KeyEntity mozc:sourceId="59"
+ mozc:keyCode="@integer/uchar_exclamation_mark"
+ mozc:keyIcon="@raw/qwerty__function__exclamation_mark">
+ <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__exclamation_mark" />
</KeyEntity>
</Flick>
</KeyState>
- </Key>
- <Key mozc:keyBackground="qwertyFunction"
- mozc:keyWidth="10%p">
- <KeyState mozc:contentDescription="@string/cd_key_uchar_ideographic_comma">
+ <KeyState mozc:contentDescription="@string/cd_key_globe" mozc:metaState="globe" >
<Flick>
- <KeyEntity mozc:sourceId="32"
- mozc:keyCode="@integer/uchar_comma"
- mozc:keyIcon="@raw/qwerty__function__ideographic_comma">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__ideographic_comma" />
- </KeyEntity>
+ <KeyEntity mozc:sourceId="58"
+ mozc:keyCode="@integer/key_globe"
+ mozc:keyIcon="@raw/globe_qwerty_function"
+ mozc:iconWidth="@dimen/unlimited"
+ mozc:iconHeight="@dimen/default_function_icon_height"
+ mozc:longPressKeyCode="@integer/key_ime_picker_dialog" />
</Flick>
</KeyState>
</Key>
- <Key mozc:keyBackground="qwertyFunctionWithThreeDots"
+ <Key mozc:keyBackground="qwertyFunctionSpaceWithThreeDots"
mozc:keyWidth="21%p">
<KeyState mozc:contentDescription="@string/cd_key_uchar_space">
<Flick>
<KeyEntity mozc:sourceId="33"
mozc:keyCode="@integer/uchar_space"
mozc:longPressKeyCode="@integer/key_ime_picker_dialog"
- mozc:keyIcon="@raw/qwerty__function__space__icon">
- <PopUp mozc:popUpIcon="@raw/qwerty__function__space__popup" />
- </KeyEntity>
+ mozc:keyIcon="@raw/qwerty__function__space__icon"
+ mozc:iconWidth="@dimen/unlimited"
+ mozc:iconHeight="@dimen/keyboard_qwerty_space_height" />
+ </Flick>
+ </KeyState>
+ <KeyState mozc:contentDescription="@string/cd_key_uchar_space" mozc:metaState="no_globe">
+ <Flick>
+ <KeyEntity mozc:sourceId="61"
+ mozc:keyCode="@integer/uchar_space"
+ mozc:longPressKeyCode="@integer/key_ime_picker_dialog"
+ mozc:keyIcon="@null"
+ mozc:iconWidth="@dimen/unlimited"
+ mozc:iconHeight="@dimen/keyboard_qwerty_space_height" />
</Flick>
</KeyState>
</Key>
@@ -495,7 +568,7 @@
<KeyEntity mozc:sourceId="34"
mozc:keyCode="@integer/uchar_full_stop"
mozc:keyIcon="@raw/qwerty__function__ideographic_full_stop">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__ideographic_full_stop" />
+ <PopUp mozc:popUpIcon="@raw/optional__qwerty__keyicon__ideographic_full_stop" />
</KeyEntity>
</Flick>
</KeyState>
@@ -507,9 +580,9 @@
<Flick>
<KeyEntity mozc:sourceId="39"
mozc:keyCode="@integer/key_left"
- mozc:keyIcon="@raw/twelvekeys__function__left_arrow__icon">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__function__left_arrow__popup" />
- </KeyEntity>
+ mozc:keyIcon="@raw/qwerty__function__left_arrow__icon"
+ mozc:iconWidth="@dimen/unlimited"
+ mozc:iconHeight="@dimen/default_function_icon_height" />
</Flick>
</KeyState>
</Key>
@@ -520,24 +593,120 @@
<Flick>
<KeyEntity mozc:sourceId="40"
mozc:keyCode="@integer/key_right"
- mozc:keyIcon="@raw/twelvekeys__function__right_arrow__icon">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__function__right_arrow__popup" />
- </KeyEntity>
+ mozc:keyIcon="@raw/qwerty__function__right_arrow__icon"
+ mozc:iconWidth="@dimen/unlimited"
+ mozc:iconHeight="@dimen/default_function_icon_height" />
</Flick>
</KeyState>
</Key>
- <Key mozc:keyBackground="qwertyFunction"
- mozc:keyWidth="13%p" mozc:keyEdgeFlags="right" mozc:isRepeatable="true">
+ <Key mozc:keyBackground="qwertyFunctionWithThreeDots"
+ mozc:keyWidth="13%p" mozc:keyEdgeFlags="right"
+ mozc:defaultIconWidth="@dimen/keyboard_enter_width"
+ mozc:defaultIconHeight="@dimen/unlimited">
<KeyState mozc:contentDescription="@string/cd_key_uchar_linefeed">
<Flick>
<KeyEntity mozc:sourceId="36"
mozc:keyCode="@integer/uchar_linefeed"
- mozc:keyIcon="@raw/qwerty__function__enter__icon">
- <PopUp mozc:popUpIcon="@raw/qwerty__function__enter__popup" />
+ mozc:longPressKeyCode="@integer/key_symbol_emoji"
+ mozc:longPressTimeoutTrigger="false"
+ mozc:keyIcon="@raw/function__enter__icon">
+ <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+ mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
+ </KeyEntity>
+ </Flick>
+ </KeyState>
+ <KeyState mozc:contentDescription="@string/cd_key_composing_done"
+ mozc:metaState="composing">
+ <Flick>
+ <KeyEntity mozc:sourceId="51"
+ mozc:keyCode="@integer/uchar_linefeed"
+ mozc:longPressKeyCode="@integer/key_symbol_emoji"
+ mozc:longPressTimeoutTrigger="false"
+ mozc:keyIcon="@raw/function__enter__icon">
+ <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+ mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
+ </KeyEntity>
+ </Flick>
+ </KeyState>
+ <KeyState mozc:contentDescription="@string/cd_key_action_done"
+ mozc:metaState="action_done">
+ <Flick>
+ <KeyEntity mozc:sourceId="52"
+ mozc:keyCode="@integer/uchar_linefeed"
+ mozc:longPressKeyCode="@integer/key_symbol_emoji"
+ mozc:longPressTimeoutTrigger="false"
+ mozc:keyIcon="@raw/function__action_done__icon">
+ <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+ mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
+ </KeyEntity>
+ </Flick>
+ </KeyState>
+ <KeyState mozc:contentDescription="@string/cd_key_action_go"
+ mozc:metaState="action_go">
+ <Flick>
+ <KeyEntity mozc:sourceId="53"
+ mozc:keyCode="@integer/uchar_linefeed"
+ mozc:longPressKeyCode="@integer/key_symbol_emoji"
+ mozc:longPressTimeoutTrigger="false"
+ mozc:keyIcon="@raw/function__action_go__icon">
+ <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+ mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
+ </KeyEntity>
+ </Flick>
+ </KeyState>
+ <KeyState mozc:contentDescription="@string/cd_key_action_next"
+ mozc:metaState="action_next">
+ <Flick>
+ <KeyEntity mozc:sourceId="54"
+ mozc:keyCode="@integer/uchar_linefeed"
+ mozc:longPressKeyCode="@integer/key_symbol_emoji"
+ mozc:longPressTimeoutTrigger="false"
+ mozc:keyIcon="@raw/function__action_next__icon">
+ <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+ mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
+ </KeyEntity>
+ </Flick>
+ </KeyState>
+ <KeyState mozc:contentDescription="@string/cd_key_action_previous"
+ mozc:metaState="action_previous">
+ <Flick>
+ <KeyEntity mozc:sourceId="55"
+ mozc:keyCode="@integer/uchar_linefeed"
+ mozc:longPressKeyCode="@integer/key_symbol_emoji"
+ mozc:longPressTimeoutTrigger="false"
+ mozc:keyIcon="@raw/function__action_previous__icon">
+ <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+ mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
+ </KeyEntity>
+ </Flick>
+ </KeyState>
+ <KeyState mozc:contentDescription="@string/cd_key_action_search"
+ mozc:metaState="action_search">
+ <Flick>
+ <KeyEntity mozc:sourceId="56"
+ mozc:keyCode="@integer/uchar_linefeed"
+ mozc:longPressKeyCode="@integer/key_symbol_emoji"
+ mozc:longPressTimeoutTrigger="false"
+ mozc:keyIcon="@raw/function__action_search__icon">
+ <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+ mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
+ </KeyEntity>
+ </Flick>
+ </KeyState>
+ <KeyState mozc:contentDescription="@string/cd_key_action_send"
+ mozc:metaState="action_send">
+ <Flick>
+ <KeyEntity mozc:sourceId="57"
+ mozc:keyCode="@integer/uchar_linefeed"
+ mozc:longPressKeyCode="@integer/key_symbol_emoji"
+ mozc:longPressTimeoutTrigger="false"
+ mozc:keyIcon="@raw/function__action_send__icon">
+ <PopUp mozc:popUpLongPressIcon="@raw/function__symbol__popup"
+ mozc:popUpIconHeight="@dimen/key_preview_emoji_icon_height" />
</KeyEntity>
</Flick>
</KeyState>
</Key>
</Row>
- <!-- Next sourceId: 41 -->
+ <!-- Next sourceId: 62 -->
</Keyboard>
diff --git a/src/android/static_resources/resources_oss/res/xml/kbd_qwerty_kana_123.xml b/src/android/static_resources/resources_oss/res/xml/kbd_qwerty_kana_123.xml
deleted file mode 100644
index 3f37e92..0000000
--- a/src/android/static_resources/resources_oss/res/xml/kbd_qwerty_kana_123.xml
+++ /dev/null
@@ -1,720 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<Keyboard
- xmlns:mozc="http://schemas.android.com/apk/res-auto"
- mozc:keyboardContentDescription="@string/cd_keyboard_number"
- mozc:keyBackground="qwertyRegular"
- mozc:keyWidth="10%p" mozc:keyHeight="20.5%p"
- mozc:horizontalGap="0.3%p" mozc:verticalGap="4%p"
- mozc:popUpWidth="@dimen/key_preview_height" mozc:popUpHeight="@dimen/key_preview_height"
- mozc:popUpXOffset="0dip" mozc:popUpYOffset="@dimen/mini_keyboard_vertical_correction">
- <Row mozc:rowEdgeFlags="top" mozc:keyHeight="0dip" mozc:verticalGap="4%p" />
- <Row>
- <Key mozc:keyEdgeFlags="left">
- <KeyState mozc:contentDescription="@string/cd_key_uchar_digit_one">
- <Flick>
- <KeyEntity mozc:sourceId="1"
- mozc:keyCode="@integer/uchar_digit_one"
- mozc:keyIcon="@raw/qwerty__keyicon__digit_one">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__digit_one" />
- </KeyEntity>
- </Flick>
- </KeyState>
- <KeyState mozc:contentDescription="@string/cd_key_uchar_black_star"
- mozc:metaState="alt">
- <Flick>
- <KeyEntity mozc:sourceId="2"
- mozc:keyCode="@integer/uchar_latin_capital_letter_q"
- mozc:keyIcon="@raw/qwerty__keyicon__black_star">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__black_star" />
- </KeyEntity>
- </Flick>
- </KeyState>
- </Key>
- <Key>
- <KeyState mozc:contentDescription="@string/cd_key_uchar_digit_two">
- <Flick>
- <KeyEntity mozc:sourceId="3"
- mozc:keyCode="@integer/uchar_digit_two"
- mozc:keyIcon="@raw/qwerty__keyicon__digit_two">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__digit_two" />
- </KeyEntity>
- </Flick>
- </KeyState>
- <KeyState mozc:contentDescription="@string/cd_key_uchar_black_heart_suit"
- mozc:metaState="alt">
- <Flick>
- <KeyEntity mozc:sourceId="4"
- mozc:keyCode="@integer/uchar_latin_capital_letter_w"
- mozc:keyIcon="@raw/qwerty__keyicon__black_heart_suit">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__black_heart_suit" />
- </KeyEntity>
- </Flick>
- </KeyState>
- </Key>
- <Key>
- <KeyState mozc:contentDescription="@string/cd_key_uchar_digit_three">
- <Flick>
- <KeyEntity mozc:sourceId="5"
- mozc:keyCode="@integer/uchar_digit_three"
- mozc:keyIcon="@raw/qwerty__keyicon__digit_three">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__digit_three" />
- </KeyEntity>
- </Flick>
- </KeyState>
- <KeyState mozc:contentDescription="@string/cd_key_uchar_eighth_note"
- mozc:metaState="alt">
- <Flick>
- <KeyEntity mozc:sourceId="6"
- mozc:keyCode="@integer/uchar_latin_capital_letter_e"
- mozc:keyIcon="@raw/qwerty__keyicon__eighth_note">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__eighth_note" />
- </KeyEntity>
- </Flick>
- </KeyState>
- </Key>
- <Key>
- <KeyState mozc:contentDescription="@string/cd_key_uchar_digit_four">
- <Flick>
- <KeyEntity mozc:sourceId="7"
- mozc:keyCode="@integer/uchar_digit_four"
- mozc:keyIcon="@raw/qwerty__keyicon__digit_four">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__digit_four" />
- </KeyEntity>
- </Flick>
- </KeyState>
- <KeyState mozc:contentDescription="@string/cd_key_uchar_reference_mark"
- mozc:metaState="alt">
- <Flick>
- <KeyEntity mozc:sourceId="8"
- mozc:keyCode="@integer/uchar_percent_sign"
- mozc:keyIcon="@raw/qwerty__keyicon__reference_mark">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__reference_mark" />
- </KeyEntity>
- </Flick>
- </KeyState>
- </Key>
- <Key>
- <KeyState mozc:contentDescription="@string/cd_key_uchar_digit_five">
- <Flick>
- <KeyEntity mozc:sourceId="9"
- mozc:keyCode="@integer/uchar_digit_five"
- mozc:keyIcon="@raw/qwerty__keyicon__digit_five">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__digit_five" />
- </KeyEntity>
- </Flick>
- </KeyState>
- <KeyState mozc:contentDescription="@string/cd_key_uchar_postal_mark"
- mozc:metaState="alt">
- <Flick>
- <KeyEntity mozc:sourceId="10"
- mozc:keyCode="@integer/uchar_latin_capital_letter_t"
- mozc:keyIcon="@raw/qwerty__keyicon__postal_mark">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__postal_mark" />
- </KeyEntity>
- </Flick>
- </KeyState>
- </Key>
- <Key>
- <KeyState mozc:contentDescription="@string/cd_key_uchar_digit_six">
- <Flick>
- <KeyEntity mozc:sourceId="11"
- mozc:keyCode="@integer/uchar_digit_six"
- mozc:keyIcon="@raw/qwerty__keyicon__digit_six">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__digit_six" />
- </KeyEntity>
- </Flick>
- </KeyState>
- <KeyState mozc:contentDescription="@string/cd_key_uchar_plus_sign"
- mozc:metaState="alt">
- <Flick>
- <KeyEntity mozc:sourceId="12"
- mozc:keyCode="@integer/uchar_plus_sign"
- mozc:keyIcon="@raw/qwerty__keyicon__fullwidth_plus_sign">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__fullwidth_plus_sign" />
- </KeyEntity>
- </Flick>
- </KeyState>
- </Key>
- <Key>
- <KeyState mozc:contentDescription="@string/cd_key_uchar_digit_seven">
- <Flick>
- <KeyEntity mozc:sourceId="13"
- mozc:keyCode="@integer/uchar_digit_seven"
- mozc:keyIcon="@raw/qwerty__keyicon__digit_seven">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__digit_seven" />
- </KeyEntity>
- </Flick>
- </KeyState>
- <KeyState mozc:contentDescription="@string/cd_key_uchar_hyphen_minus"
- mozc:metaState="alt">
- <Flick>
- <KeyEntity mozc:sourceId="14"
- mozc:keyCode="@integer/uchar_hyphen_minus"
- mozc:keyIcon="@raw/qwerty__keyicon__minus_sign">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__minus_sign" />
- </KeyEntity>
- </Flick>
- </KeyState>
- </Key>
- <Key>
- <KeyState mozc:contentDescription="@string/cd_key_uchar_digit_eight">
- <Flick>
- <KeyEntity mozc:sourceId="15"
- mozc:keyCode="@integer/uchar_digit_eight"
- mozc:keyIcon="@raw/qwerty__keyicon__digit_eight">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__digit_eight" />
- </KeyEntity>
- </Flick>
- </KeyState>
- <KeyState mozc:contentDescription="@string/cd_key_uchar_multiplication_sign"
- mozc:metaState="alt">
- <Flick>
- <KeyEntity mozc:sourceId="16"
- mozc:keyCode="@integer/uchar_asterisk"
- mozc:keyIcon="@raw/qwerty__keyicon__multiplication_sign">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__multiplication_sign" />
- </KeyEntity>
- </Flick>
- </KeyState>
- </Key>
- <Key>
- <KeyState mozc:contentDescription="@string/cd_key_uchar_digit_nine">
- <Flick>
- <KeyEntity mozc:sourceId="17"
- mozc:keyCode="@integer/uchar_digit_nine"
- mozc:keyIcon="@raw/qwerty__keyicon__digit_nine">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__digit_nine" />
- </KeyEntity>
- </Flick>
- </KeyState>
- <KeyState mozc:contentDescription="@string/cd_key_uchar_division_sign"
- mozc:metaState="alt">
- <Flick>
- <KeyEntity mozc:sourceId="18"
- mozc:keyCode="@integer/uchar_latin_capital_letter_i"
- mozc:keyIcon="@raw/qwerty__keyicon__division_sign">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__division_sign" />
- </KeyEntity>
- </Flick>
- </KeyState>
- </Key>
- <Key mozc:keyEdgeFlags="right">
- <KeyState mozc:contentDescription="@string/cd_key_uchar_digit_zero">
- <Flick>
- <KeyEntity mozc:sourceId="19"
- mozc:keyCode="@integer/uchar_digit_zero"
- mozc:keyIcon="@raw/qwerty__keyicon__digit_zero">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__digit_zero" />
- </KeyEntity>
- </Flick>
- </KeyState>
- <KeyState mozc:contentDescription="@string/cd_key_uchar_equals_sign"
- mozc:metaState="alt">
- <Flick>
- <KeyEntity mozc:sourceId="20"
- mozc:keyCode="@integer/uchar_equals_sign"
- mozc:keyIcon="@raw/qwerty__keyicon__fullwidth_equals_sign">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__fullwidth_equals_sign" />
- </KeyEntity>
- </Flick>
- </KeyState>
- </Key>
- </Row>
- <Row>
- <Spacer mozc:horizontalGap="5%p" />
- <Key mozc:keyEdgeFlags="left" >
- <KeyState mozc:contentDescription="@string/cd_key_uchar_commercial_at">
- <Flick>
- <KeyEntity mozc:sourceId="21"
- mozc:keyCode="@integer/uchar_commercial_at"
- mozc:keyIcon="@raw/qwerty__keyicon__commercial_at">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__commercial_at" />
- </KeyEntity>
- </Flick>
- </KeyState>
- <KeyState mozc:contentDescription="@string/cd_key_uchar_katakana_middle_dot"
- mozc:metaState="alt">
- <Flick>
- <KeyEntity mozc:sourceId="22"
- mozc:keyCode="@integer/uchar_latin_capital_letter_a"
- mozc:keyIcon="@raw/qwerty__keyicon__katakana_middle_dot">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__katakana_middle_dot" />
- </KeyEntity>
- </Flick>
- </KeyState>
- </Key>
- <Key>
- <KeyState mozc:contentDescription="@string/cd_key_uchar_number_sign">
- <Flick>
- <KeyEntity mozc:sourceId="23"
- mozc:keyCode="@integer/uchar_number_sign"
- mozc:keyIcon="@raw/qwerty__keyicon__number_sign">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__number_sign" />
- </KeyEntity>
- </Flick>
- </KeyState>
- <KeyState mozc:contentDescription="@string/cd_key_uchar_two_dot_leader"
- mozc:metaState="alt">
- <Flick>
- <KeyEntity mozc:sourceId="24"
- mozc:keyCode="@integer/uchar_latin_capital_letter_s"
- mozc:keyIcon="@raw/qwerty__keyicon__two_dot_leader">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__two_dot_leader" />
- </KeyEntity>
- </Flick>
- </KeyState>
- </Key>
- <Key>
- <KeyState mozc:contentDescription="@string/cd_key_uchar_ampersand">
- <Flick>
- <KeyEntity mozc:sourceId="25"
- mozc:keyCode="@integer/uchar_ampersand"
- mozc:keyIcon="@raw/qwerty__keyicon__ampersand">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__ampersand" />
- </KeyEntity>
- </Flick>
- </KeyState>
- <KeyState mozc:contentDescription="@string/cd_key_uchar_three_dot_leader"
- mozc:metaState="alt">
- <Flick>
- <KeyEntity mozc:sourceId="26"
- mozc:keyCode="@integer/uchar_latin_capital_letter_d"
- mozc:keyIcon="@raw/qwerty__keyicon__horizontal_ellipsis">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__horizontal_ellipsis" />
- </KeyEntity>
- </Flick>
- </KeyState>
- </Key>
- <Key>
- <KeyState mozc:contentDescription="@string/cd_key_uchar_hyphen_minus">
- <Flick>
- <KeyEntity mozc:sourceId="27"
- mozc:keyCode="@integer/uchar_hyphen_minus"
- mozc:keyIcon="@raw/qwerty__keyicon__hyphen_minus">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__hyphen_minus" />
- </KeyEntity>
- </Flick>
- </KeyState>
- <KeyState mozc:contentDescription="@string/cd_key_uchar_colon"
- mozc:metaState="alt">
- <Flick>
- <KeyEntity mozc:sourceId="28"
- mozc:keyCode="@integer/uchar_colon"
- mozc:keyIcon="@raw/qwerty__keyicon__fullwidth_colon">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__fullwidth_colon" />
- </KeyEntity>
- </Flick>
- </KeyState>
- </Key>
- <Key>
- <KeyState mozc:contentDescription="@string/cd_key_uchar_solidus">
- <Flick>
- <KeyEntity mozc:sourceId="29"
- mozc:keyCode="@integer/uchar_solidus"
- mozc:keyIcon="@raw/qwerty__keyicon__fullwidth_solidus">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__fullwidth_solidus" />
- </KeyEntity>
- </Flick>
- </KeyState>
- <KeyState mozc:contentDescription="@string/cd_key_uchar_semicolon"
- mozc:metaState="alt">
- <Flick>
- <KeyEntity mozc:sourceId="30"
- mozc:keyCode="@integer/uchar_semicolon"
- mozc:keyIcon="@raw/qwerty__keyicon__fullwidth_semicolon">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__fullwidth_semicolon" />
- </KeyEntity>
- </Flick>
- </KeyState>
- </Key>
- <Key>
- <KeyState mozc:contentDescription="@string/cd_key_uchar_left_corner_bracket">
- <Flick>
- <KeyEntity mozc:sourceId="31"
- mozc:keyCode="@integer/uchar_left_square_bracket"
- mozc:keyIcon="@raw/qwerty__keyicon__left_corner_bracket">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__left_corner_bracket" />
- </KeyEntity>
- </Flick>
- </KeyState>
- <KeyState mozc:contentDescription="@string/cd_key_uchar_left_black_lenticular_bracket"
- mozc:metaState="alt">
- <Flick>
- <KeyEntity mozc:sourceId="32"
- mozc:keyCode="@integer/uchar_less_than_sign"
- mozc:keyIcon="@raw/qwerty__keyicon__left_black_lenticular_bracket">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__left_black_lenticular_bracket" />
- </KeyEntity>
- </Flick>
- </KeyState>
- </Key>
- <Key>
- <KeyState mozc:contentDescription="@string/cd_key_uchar_right_corner_bracket">
- <Flick>
- <KeyEntity mozc:sourceId="33"
- mozc:keyCode="@integer/uchar_right_square_bracket"
- mozc:keyIcon="@raw/qwerty__keyicon__right_corner_bracket">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__right_corner_bracket" />
- </KeyEntity>
- </Flick>
- </KeyState>
- <KeyState mozc:contentDescription="@string/cd_key_uchar_right_black_lenticular_bracket"
- mozc:metaState="alt">
- <Flick>
- <KeyEntity mozc:sourceId="34"
- mozc:keyCode="@integer/uchar_greater_than_sign"
- mozc:keyIcon="@raw/qwerty__keyicon__right_black_lenticular_bracket">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__right_black_lenticular_bracket" />
- </KeyEntity>
- </Flick>
- </KeyState>
- </Key>
- <Key>
- <KeyState>
- <Flick>
- <KeyEntity mozc:sourceId="35"
- mozc:keyCode="@integer/uchar_left_parenthesis"
- mozc:keyIcon="@raw/qwerty__keyicon__fullwidth_left_parenthesis">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__fullwidth_left_parenthesis" />
- </KeyEntity>
- </Flick>
- </KeyState>
- <KeyState mozc:metaState="alt">
- <Flick>
- <KeyEntity mozc:sourceId="36"
- mozc:keyCode="@integer/uchar_left_curly_bracket"
- mozc:keyIcon="@raw/qwerty__keyicon__fullwidth_left_curly_bracket">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__fullwidth_left_curly_bracket" />
- </KeyEntity>
- </Flick>
- </KeyState>
- </Key>
- <Key mozc:keyEdgeFlags="right" >
- <KeyState>
- <Flick>
- <KeyEntity mozc:sourceId="37"
- mozc:keyCode="@integer/uchar_right_parenthesis"
- mozc:keyIcon="@raw/qwerty__keyicon__fullwidth_right_parenthesis">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__fullwidth_right_parenthesis" />
- </KeyEntity>
- </Flick>
- </KeyState>
- <KeyState mozc:metaState="alt">
- <Flick>
- <KeyEntity mozc:sourceId="38"
- mozc:keyCode="@integer/uchar_right_curly_bracket"
- mozc:keyIcon="@raw/qwerty__keyicon__fullwidth_right_curly_bracket">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__fullwidth_right_curly_bracket" />
- </KeyEntity>
- </Flick>
- </KeyState>
- </Key>
- <Spacer mozc:horizontalGap="5%p" />
- </Row>
- <Row>
- <Key
- mozc:keyWidth="13%p" mozc:keyEdgeFlags="left"
- mozc:isModifier="true" mozc:isSticky="true">
- <KeyState mozc:contentDescription="@string/cd_key_alt"
- mozc:nextMetaState="alt"
- mozc:keyBackground="qwertyFunctionLightOff" >
- <Flick>
- <KeyEntity mozc:sourceId="39"
- mozc:keyCode="@integer/key_alt"
- mozc:keyIcon="@raw/qwerty__function__alt__icon" />
- </Flick>
- </KeyState>
- <KeyState mozc:contentDescription="@string/cd_key_alt_unmodified"
- mozc:metaState="alt" mozc:nextRemovedMetaStates="alt"
- mozc:keyBackground="qwertyFunctionLightOn" >
- <Flick>
- <KeyEntity mozc:sourceId="40"
- mozc:keyCode="@integer/key_alt"
- mozc:keyIcon="@raw/qwerty__function__alt__icon" />
- </Flick>
- </KeyState>
- </Key>
- <Spacer mozc:horizontalGap="2%p" mozc:stick="right" />
- <Key>
- <KeyState mozc:contentDescription="@string/cd_key_uchar_exclamation_mark">
- <Flick>
- <KeyEntity mozc:sourceId="41"
- mozc:keyCode="@integer/uchar_exclamation_mark"
- mozc:keyIcon="@raw/qwerty__keyicon__fullwidth_exclamation_mark">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__fullwidth_exclamation_mark" />
- </KeyEntity>
- </Flick>
- </KeyState>
- <KeyState mozc:contentDescription="@string/cd_key_compound_monday"
- mozc:metaState="alt">
- <Flick>
- <KeyEntity mozc:sourceId="42"
- mozc:keyCode="@integer/uchar_latin_capital_letter_z"
- mozc:keyIcon="@raw/qwerty__keyicon__parenthesized_monday">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__parenthesized_monday" />
- </KeyEntity>
- </Flick>
- </KeyState>
- </Key>
- <Key>
- <KeyState mozc:contentDescription="@string/cd_key_uchar_question_mark">
- <Flick>
- <KeyEntity mozc:sourceId="43"
- mozc:keyCode="@integer/uchar_question_mark"
- mozc:keyIcon="@raw/qwerty__keyicon__fullwidth_question_mark">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__fullwidth_question_mark" />
- </KeyEntity>
- </Flick>
- </KeyState>
- <KeyState mozc:contentDescription="@string/cd_key_compound_tuesday"
- mozc:metaState="alt">
- <Flick>
- <KeyEntity mozc:sourceId="44"
- mozc:keyCode="@integer/uchar_latin_capital_letter_x"
- mozc:keyIcon="@raw/qwerty__keyicon__parenthesized_tuesday">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__parenthesized_tuesday" />
- </KeyEntity>
- </Flick>
- </KeyState>
- </Key>
- <Key>
- <KeyState mozc:contentDescription="@string/cd_key_uchar_u6642">
- <Flick>
- <KeyEntity mozc:sourceId="45"
- mozc:keyCode="@integer/uchar_apostrophe"
- mozc:keyIcon="@raw/qwerty__keyicon__cjk_hour">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__cjk_hour" />
- </KeyEntity>
- </Flick>
- </KeyState>
- <KeyState mozc:contentDescription="@string/cd_key_compound_wednesday"
- mozc:metaState="alt">
- <Flick>
- <KeyEntity mozc:sourceId="46"
- mozc:keyCode="@integer/uchar_latin_capital_letter_c"
- mozc:keyIcon="@raw/qwerty__keyicon__parenthesized_wednesday">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__parenthesized_wednesday" />
- </KeyEntity>
- </Flick>
- </KeyState>
- </Key>
- <Key>
- <KeyState mozc:contentDescription="@string/cd_key_uchar_u5206">
- <Flick>
- <KeyEntity mozc:sourceId="47"
- mozc:keyCode="@integer/uchar_quotation_mark"
- mozc:keyIcon="@raw/qwerty__keyicon__cjk_minute">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__cjk_minute" />
- </KeyEntity>
- </Flick>
- </KeyState>
- <KeyState mozc:contentDescription="@string/cd_key_compound_thursday"
- mozc:metaState="alt">
- <Flick>
- <KeyEntity mozc:sourceId="48"
- mozc:keyCode="@integer/uchar_latin_capital_letter_v"
- mozc:keyIcon="@raw/qwerty__keyicon__parenthesized_thursday">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__parenthesized_thursday" />
- </KeyEntity>
- </Flick>
- </KeyState>
- </Key>
- <Key>
- <KeyState mozc:contentDescription="@string/cd_key_uchar_u6708">
- <Flick>
- <KeyEntity mozc:sourceId="49"
- mozc:keyCode="@integer/uchar_dollar_sign"
- mozc:keyIcon="@raw/qwerty__keyicon__cjk_month">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__cjk_month" />
- </KeyEntity>
- </Flick>
- </KeyState>
- <KeyState mozc:contentDescription="@string/cd_key_compound_friday"
- mozc:metaState="alt">
- <Flick>
- <KeyEntity mozc:sourceId="50"
- mozc:keyCode="@integer/uchar_latin_capital_letter_b"
- mozc:keyIcon="@raw/qwerty__keyicon__parenthesized_friday">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__parenthesized_friday" />
- </KeyEntity>
- </Flick>
- </KeyState>
- </Key>
- <Key>
- <KeyState mozc:contentDescription="@string/cd_key_uchar_u65e5">
- <Flick>
- <KeyEntity mozc:sourceId="51"
- mozc:keyCode="@integer/uchar_vertical_line"
- mozc:keyIcon="@raw/qwerty__keyicon__cjk_day">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__cjk_day" />
- </KeyEntity>
- </Flick>
- </KeyState>
- <KeyState mozc:contentDescription="@string/cd_key_compound_saturday"
- mozc:metaState="alt">
- <Flick>
- <KeyEntity mozc:sourceId="52"
- mozc:keyCode="@integer/uchar_latin_capital_letter_n"
- mozc:keyIcon="@raw/qwerty__keyicon__parenthesized_saturday">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__parenthesized_saturday" />
- </KeyEntity>
- </Flick>
- </KeyState>
- </Key>
- <Key>
- <KeyState mozc:contentDescription="@string/cd_key_uchar_wave_dash">
- <Flick>
- <KeyEntity mozc:sourceId="53"
- mozc:keyCode="@integer/uchar_tilde"
- mozc:keyIcon="@raw/qwerty__keyicon__wave_dash">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__wave_dash" />
- </KeyEntity>
- </Flick>
- </KeyState>
- <KeyState mozc:contentDescription="@string/cd_key_compound_sunday"
- mozc:metaState="alt">
- <Flick>
- <KeyEntity mozc:sourceId="54"
- mozc:keyCode="@integer/uchar_latin_capital_letter_m"
- mozc:keyIcon="@raw/qwerty__keyicon__parenthesized_sunday">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__parenthesized_sunday" />
- </KeyEntity>
- </Flick>
- </KeyState>
- </Key>
- <Spacer mozc:horizontalGap="2%p" mozc:stick="left" />
- <Key mozc:keyBackground="qwertyFunction"
- mozc:keyWidth="13%p" mozc:keyEdgeFlags="right" mozc:isRepeatable="true">
- <KeyState mozc:contentDescription="@string/cd_key_uchar_backspace">
- <Flick>
- <KeyEntity mozc:sourceId="55"
- mozc:keyCode="@integer/key_backspace"
- mozc:keyIcon="@raw/qwerty__function__delete__icon">
- <PopUp mozc:popUpIcon="@raw/qwerty__function__delete__popup" />
- </KeyEntity>
- </Flick>
- </KeyState>
- </Key>
- </Row>
- <Row>
- <Key mozc:keyBackground="qwertyFunctionWithThreeDots"
- mozc:keyWidth="26%p" mozc:keyEdgeFlags="left">
- <KeyState mozc:contentDescription="@string/cd_key_chartype_to_kana">
- <Flick>
- <KeyEntity mozc:sourceId="56"
- mozc:keyCode="@integer/key_chartype_to_kana"
- mozc:longPressKeyCode="@integer/key_menu_dialog"
- mozc:keyIcon="@raw/qwerty__function__text_kana__icon">
- <PopUp mozc:popUpIcon="@raw/qwerty__function__text_kana__popup" />
- </KeyEntity>
- </Flick>
- </KeyState>
- </Key>
- <Key mozc:keyBackground="qwertyFunction"
- mozc:keyWidth="10%p">
- <KeyState mozc:contentDescription="@string/cd_key_uchar_ideographic_comma">
- <Flick>
- <KeyEntity mozc:sourceId="57"
- mozc:keyCode="@integer/uchar_comma"
- mozc:keyIcon="@raw/qwerty__function__comma">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__comma" />
- </KeyEntity>
- </Flick>
- </KeyState>
- </Key>
- <Key mozc:keyBackground="qwertyFunctionWithThreeDots"
- mozc:keyWidth="21%p">
- <KeyState mozc:contentDescription="@string/cd_key_uchar_space">
- <Flick>
- <KeyEntity mozc:sourceId="58"
- mozc:keyCode="@integer/uchar_space"
- mozc:longPressKeyCode="@integer/key_ime_picker_dialog"
- mozc:keyIcon="@raw/qwerty__function__space__icon">
- <PopUp mozc:popUpIcon="@raw/qwerty__function__space__popup" />
- </KeyEntity>
- </Flick>
- </KeyState>
- </Key>
- <Key mozc:keyBackground="qwertyFunction"
- mozc:keyWidth="10%p">
- <KeyState mozc:contentDescription="@string/cd_key_uchar_ideographic_full_stop">
- <Flick>
- <KeyEntity mozc:sourceId="59"
- mozc:keyCode="@integer/uchar_full_stop"
- mozc:keyIcon="@raw/qwerty__function__full_stop">
- <PopUp mozc:popUpIcon="@raw/qwerty__keyicon__full_stop" />
- </KeyEntity>
- </Flick>
- </KeyState>
- </Key>
- <Key mozc:keyBackground="qwertyFunction"
- mozc:keyWidth="10%p"
- mozc:isRepeatable="true">
- <KeyState mozc:contentDescription="@string/cd_key_left">
- <Flick>
- <KeyEntity mozc:sourceId="64"
- mozc:keyCode="@integer/key_left"
- mozc:keyIcon="@raw/twelvekeys__function__left_arrow__icon">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__function__left_arrow__popup" />
- </KeyEntity>
- </Flick>
- </KeyState>
- </Key>
- <Key mozc:keyBackground="qwertyFunction"
- mozc:keyWidth="10%p"
- mozc:isRepeatable="true">
- <KeyState mozc:contentDescription="@string/cd_key_right">
- <Flick>
- <KeyEntity mozc:sourceId="65"
- mozc:keyCode="@integer/key_right"
- mozc:keyIcon="@raw/twelvekeys__function__right_arrow__icon">
- <PopUp mozc:popUpIcon="@raw/twelvekeys__function__right_arrow__popup" />
- </KeyEntity>
- </Flick>
- </KeyState>
- </Key>
- <Key mozc:keyBackground="qwertyFunction"
- mozc:keyWidth="13%p" mozc:keyEdgeFlags="right" mozc:isRepeatable="true">
- <KeyState mozc:contentDescription="@string/cd_key_uchar_linefeed">
- <Flick>
- <KeyEntity mozc:sourceId="61"
- mozc:keyCode="@integer/uchar_linefeed"
- mozc:keyIcon="@raw/qwerty__function__enter__icon">
- <PopUp mozc:popUpIcon="@raw/qwerty__function__enter__popup" />
- </KeyEntity>
- </Flick>
- </KeyState>
- </Key>
- </Row>
- <!-- Next sourceId: 66 -->
-</Keyboard>
diff --git a/src/android/static_resources/resources_oss/res/xml/kbd_symbol_123.xml b/src/android/static_resources/resources_oss/res/xml/kbd_symbol_123.xml
new file mode 100644
index 0000000..c382b6b
--- /dev/null
+++ b/src/android/static_resources/resources_oss/res/xml/kbd_symbol_123.xml
@@ -0,0 +1,315 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+ <!--
+ The current keycode mapping to flick direction and tapping action is as follows;
+ +=======+===========+===========+===========+=======+
+ | | | | | |
+ | '+' | '1' | '2' | '3' | 'BS' |
+ | | | | | |
+ +=======+===========+===========+===========+=======+
+ | | | | | |
+ | '-' | '4' | '5' | '6' | '/' |
+ | | | | | |
+ +=======+===========+===========+===========+=======|
+ | | | | | |
+ | ',' | '7' | '8' | '9' | '=' |
+ | | | | | |
+ +=======+===========+===========+===========+=======+
+ | | | | | |
+ | '.' | '*' | '0' | '#' | 'SPC' |
+ | | | | | |
+ +=======+===========+===========+===========+=======+
+ -->
+<Keyboard
+ xmlns:mozc="http://schemas.android.com/apk/res-auto"
+ mozc:keyboardContentDescription="@string/cd_keyboard_number"
+ mozc:keyBackground="twelvekeysRegular"
+ mozc:keyWidth="17.3%p" mozc:keyHeight="25%p" mozc:keyHorizontalLayoutWeight="1"
+ mozc:horizontalGap="0dip" mozc:verticalGap="0dip"
+ mozc:popUpHeight="@dimen/key_preview_height"
+ mozc:popUpIconHeight="@dimen/key_preview_icon_height"
+ mozc:popUpXOffset="0dip" mozc:popUpYOffset="@dimen/mini_keyboard_vertical_correction">
+ <Row>
+ <Key mozc:keyBackground="twelvekeysFunction"
+ mozc:keyHorizontalLayoutWeight="0" mozc:keyEdgeFlags="left">
+ <KeyState mozc:contentDescription="@string/cd_key_uchar_plus_sign">
+ <Flick>
+ <KeyEntity mozc:sourceId="1"
+ mozc:keyCode="@integer/uchar_plus_sign"
+ mozc:keyIcon="@raw/twelvekeys__number__function__plus_sign">
+ <PopUp mozc:popUpIcon="@raw/optional__twelvekeys__popup__plus_sign" />
+ </KeyEntity>
+ </Flick>
+ </KeyState>
+ </Key>
+ <Spacer mozc:keyWidth="@dimen/keyboard_separator_width" mozc:keyHorizontalLayoutWeight="0"
+ mozc:keyBackground="keyboardSeparatorTop"/>
+ <Key>
+ <KeyState mozc:contentDescription="@string/cd_key_uchar_digit_one">
+ <Flick>
+ <KeyEntity mozc:sourceId="2"
+ mozc:keyCode="@integer/uchar_digit_one"
+ mozc:keyIcon="@raw/twelvekeys__number__one">
+ <PopUp mozc:popUpIcon="@raw/optional__twelvekeys__popup__one" />
+ </KeyEntity>
+ </Flick>
+ </KeyState>
+ </Key>
+ <Key>
+ <KeyState mozc:contentDescription="@string/cd_key_uchar_digit_two">
+ <Flick>
+ <KeyEntity mozc:sourceId="3"
+ mozc:keyCode="@integer/uchar_digit_two"
+ mozc:keyIcon="@raw/twelvekeys__number__two">
+ <PopUp mozc:popUpIcon="@raw/optional__twelvekeys__popup__two" />
+ </KeyEntity>
+ </Flick>
+ </KeyState>
+ </Key>
+ <Key>
+ <KeyState mozc:contentDescription="@string/cd_key_uchar_digit_three">
+ <Flick>
+ <KeyEntity mozc:sourceId="4"
+ mozc:keyCode="@integer/uchar_digit_three"
+ mozc:keyIcon="@raw/twelvekeys__number__three">
+ <PopUp mozc:popUpIcon="@raw/optional__twelvekeys__popup__three" />
+ </KeyEntity>
+ </Flick>
+ </KeyState>
+ </Key>
+ <Spacer mozc:keyWidth="@dimen/keyboard_separator_width" mozc:keyHorizontalLayoutWeight="0"
+ mozc:keyBackground="keyboardSeparatorTop"/>
+ <Key mozc:keyBackground="twelvekeysFunction"
+ mozc:keyHorizontalLayoutWeight="0"
+ mozc:keyEdgeFlags="right" mozc:isRepeatable="true">
+ <KeyState mozc:contentDescription="@string/cd_key_uchar_backspace">
+ <Flick>
+ <KeyEntity mozc:sourceId="5"
+ mozc:keyCode="@integer/key_backspace"
+ mozc:keyIcon="@raw/twelvekeys__function__delete__icon"
+ mozc:iconWidth="@dimen/unlimited"
+ mozc:iconHeight="@dimen/default_function_icon_height" />
+ </Flick>
+ </KeyState>
+ </Key>
+ </Row>
+ <Row>
+ <Key mozc:keyBackground="twelvekeysFunction"
+ mozc:keyHorizontalLayoutWeight="0" mozc:keyEdgeFlags="left">
+ <KeyState mozc:contentDescription="@string/cd_key_uchar_hyphen_minus">
+ <Flick>
+ <KeyEntity mozc:sourceId="6"
+ mozc:keyCode="@integer/uchar_hyphen_minus"
+ mozc:keyIcon="@raw/twelvekeys__number__function__hyphen_minus">
+ <PopUp mozc:popUpIcon="@raw/optional__twelvekeys__popup__hyphen_minus" />
+ </KeyEntity>
+ </Flick>
+ </KeyState>
+ </Key>
+ <Spacer mozc:keyWidth="@dimen/keyboard_separator_width" mozc:keyHorizontalLayoutWeight="0"
+ mozc:keyBackground="keyboardSeparatorCenter"/>
+ <Key>
+ <KeyState mozc:contentDescription="@string/cd_key_uchar_digit_four">
+ <Flick>
+ <KeyEntity mozc:sourceId="7"
+ mozc:keyCode="@integer/uchar_digit_four"
+ mozc:keyIcon="@raw/twelvekeys__number__four">
+ <PopUp mozc:popUpIcon="@raw/optional__twelvekeys__popup__four" />
+ </KeyEntity>
+ </Flick>
+ </KeyState>
+ </Key>
+ <Key>
+ <KeyState mozc:contentDescription="@string/cd_key_uchar_digit_five">
+ <Flick>
+ <KeyEntity mozc:sourceId="8"
+ mozc:keyCode="@integer/uchar_digit_five"
+ mozc:keyIcon="@raw/twelvekeys__number__five">
+ <PopUp mozc:popUpIcon="@raw/optional__twelvekeys__popup__five" />
+ </KeyEntity>
+ </Flick>
+ </KeyState>
+ </Key>
+ <Key>
+ <KeyState mozc:contentDescription="@string/cd_key_uchar_digit_six">
+ <Flick>
+ <KeyEntity mozc:sourceId="9"
+ mozc:keyCode="@integer/uchar_digit_six"
+ mozc:keyIcon="@raw/twelvekeys__number__six">
+ <PopUp mozc:popUpIcon="@raw/optional__twelvekeys__popup__six" />
+ </KeyEntity>
+ </Flick>
+ </KeyState>
+ </Key>
+ <Spacer mozc:keyWidth="@dimen/keyboard_separator_width" mozc:keyHorizontalLayoutWeight="0"
+ mozc:keyBackground="keyboardSeparatorCenter"/>
+ <Key mozc:keyBackground="twelvekeysFunction"
+ mozc:keyHorizontalLayoutWeight="0" mozc:keyEdgeFlags="right">
+ <KeyState mozc:contentDescription="@string/cd_key_uchar_solidus">
+ <Flick>
+ <KeyEntity mozc:sourceId="10"
+ mozc:keyCode="@integer/uchar_solidus"
+ mozc:keyIcon="@raw/twelvekeys__number__function__solidus">
+ <PopUp mozc:popUpIcon="@raw/optional__twelvekeys__popup__solidus" />
+ </KeyEntity>
+ </Flick>
+ </KeyState>
+ </Key>
+ </Row>
+ <Row>
+ <Key mozc:keyBackground="twelvekeysFunction"
+ mozc:keyHorizontalLayoutWeight="0" mozc:keyEdgeFlags="left">
+ <KeyState mozc:contentDescription="@string/cd_key_uchar_comma">
+ <Flick>
+ <KeyEntity mozc:sourceId="11"
+ mozc:keyCode="@integer/uchar_comma"
+ mozc:keyIcon="@raw/twelvekeys__number__function__comma">
+ <PopUp mozc:popUpIcon="@raw/optional__twelvekeys__popup__comma" />
+ </KeyEntity>
+ </Flick>
+ </KeyState>
+ </Key>
+ <Spacer mozc:keyWidth="@dimen/keyboard_separator_width" mozc:keyHorizontalLayoutWeight="0"
+ mozc:keyBackground="keyboardSeparatorCenter"/>
+ <Key>
+ <KeyState mozc:contentDescription="@string/cd_key_uchar_digit_seven">
+ <Flick>
+ <KeyEntity mozc:sourceId="12"
+ mozc:keyCode="@integer/uchar_digit_seven"
+ mozc:keyIcon="@raw/twelvekeys__number__seven">
+ <PopUp mozc:popUpIcon="@raw/optional__twelvekeys__popup__seven" />
+ </KeyEntity>
+ </Flick>
+ </KeyState>
+ </Key>
+ <Key>
+ <KeyState mozc:contentDescription="@string/cd_key_uchar_digit_eight">
+ <Flick>
+ <KeyEntity mozc:sourceId="13"
+ mozc:keyCode="@integer/uchar_digit_eight"
+ mozc:keyIcon="@raw/twelvekeys__number__eight">
+ <PopUp mozc:popUpIcon="@raw/optional__twelvekeys__popup__eight" />
+ </KeyEntity>
+ </Flick>
+ </KeyState>
+ </Key>
+ <Key>
+ <KeyState mozc:contentDescription="@string/cd_key_uchar_digit_nine">
+ <Flick>
+ <KeyEntity mozc:sourceId="14"
+ mozc:keyCode="@integer/uchar_digit_nine"
+ mozc:keyIcon="@raw/twelvekeys__number__nine">
+ <PopUp mozc:popUpIcon="@raw/optional__twelvekeys__popup__nine" />
+ </KeyEntity>
+ </Flick>
+ </KeyState>
+ </Key>
+ <Spacer mozc:keyWidth="@dimen/keyboard_separator_width" mozc:keyHorizontalLayoutWeight="0"
+ mozc:keyBackground="keyboardSeparatorCenter"/>
+ <Key mozc:keyBackground="twelvekeysFunction"
+ mozc:keyHorizontalLayoutWeight="0" mozc:keyEdgeFlags="right">
+ <KeyState mozc:contentDescription="@string/cd_key_uchar_equals_sign">
+ <Flick>
+ <KeyEntity mozc:sourceId="15"
+ mozc:keyCode="@integer/uchar_equals_sign"
+ mozc:keyIcon="@raw/twelvekeys__number__function__equals_sign">
+ <PopUp mozc:popUpIcon="@raw/optional__twelvekeys__popup__equals_sign" />
+ </KeyEntity>
+ </Flick>
+ </KeyState>
+ </Key>
+ </Row>
+ <Row>
+ <Key mozc:keyBackground="twelvekeysFunction"
+ mozc:keyHorizontalLayoutWeight="0" mozc:keyEdgeFlags="left">
+ <KeyState mozc:contentDescription="@string/cd_key_uchar_full_stop">
+ <Flick>
+ <KeyEntity mozc:sourceId="16"
+ mozc:keyCode="@integer/uchar_full_stop"
+ mozc:keyIcon="@raw/twelvekeys__number__function__full_stop">
+ <PopUp mozc:popUpIcon="@raw/optional__twelvekeys__popup__full_stop" />
+ </KeyEntity>
+ </Flick>
+ </KeyState>
+ </Key>
+ <Spacer mozc:keyWidth="@dimen/keyboard_separator_width" mozc:keyHorizontalLayoutWeight="0"
+ mozc:keyBackground="keyboardSeparatorBottom"/>
+ <Key>
+ <KeyState mozc:contentDescription="@string/cd_key_uchar_asterisk">
+ <Flick>
+ <KeyEntity mozc:sourceId="17"
+ mozc:keyCode="@integer/uchar_asterisk"
+ mozc:keyIcon="@raw/twelvekeys__number__asterisk">
+ <PopUp mozc:popUpIcon="@raw/optional__twelvekeys__popup__asterisk" />
+ </KeyEntity>
+ </Flick>
+ </KeyState>
+ </Key>
+ <Key>
+ <KeyState mozc:contentDescription="@string/cd_key_uchar_digit_zero">
+ <Flick>
+ <KeyEntity mozc:sourceId="18"
+ mozc:keyCode="@integer/uchar_digit_zero"
+ mozc:keyIcon="@raw/twelvekeys__number__zero">
+ <PopUp mozc:popUpIcon="@raw/optional__twelvekeys__popup__zero" />
+ </KeyEntity>
+ </Flick>
+ </KeyState>
+ </Key>
+ <Key>
+ <KeyState mozc:contentDescription="@string/cd_key_uchar_number_sign">
+ <Flick>
+ <KeyEntity mozc:sourceId="19"
+ mozc:keyCode="@integer/uchar_number_sign"
+ mozc:keyIcon="@raw/twelvekeys__number__number_sign">
+ <PopUp mozc:popUpIcon="@raw/optional__twelvekeys__popup__number_sign" />
+ </KeyEntity>
+ </Flick>
+ </KeyState>
+ </Key>
+ <Spacer mozc:keyWidth="@dimen/keyboard_separator_width" mozc:keyHorizontalLayoutWeight="0"
+ mozc:keyBackground="keyboardSeparatorBottom"/>
+ <Key mozc:keyBackground="twelvekeysFunction"
+ mozc:keyHorizontalLayoutWeight="0" mozc:keyEdgeFlags="right">
+ <KeyState mozc:contentDescription="@string/cd_key_uchar_space">
+ <Flick>
+ <KeyEntity mozc:sourceId="20"
+ mozc:keyCode="@integer/uchar_space"
+ mozc:keyIcon="@raw/twelvekeys__function__space__icon"
+ mozc:iconWidth="@dimen/unlimited"
+ mozc:iconHeight="@dimen/default_function_icon_height" />
+ </Flick>
+ </KeyState>
+ </Key>
+ </Row>
+ <!-- Next sourceId: 21 -->
+</Keyboard>
diff --git a/src/android/static_resources/resources_oss/res/xml/keyboard_layouts.xml b/src/android/static_resources/resources_oss/res/xml/keyboard_layouts.xml
new file mode 100644
index 0000000..887e6a0
--- /dev/null
+++ b/src/android/static_resources/resources_oss/res/xml/keyboard_layouts.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<keyboard-layouts xmlns:android="http://schemas.android.com/apk/res/android">
+ <keyboard-layout android:name="keyboard_layout_japanese109"
+ android:label="@string/pref_hardware_keymap_japanese109A"
+ android:keyboardLayout="@raw/keyboard_layout_japanese109a" />
+</keyboard-layouts>
\ No newline at end of file
diff --git a/src/android/static_resources/resources_oss/res/xml/method.xml b/src/android/static_resources/resources_oss/res/xml/method.xml
index 2a0cfa4..5d191b3 100644
--- a/src/android/static_resources/resources_oss/res/xml/method.xml
+++ b/src/android/static_resources/resources_oss/res/xml/method.xml
@@ -32,7 +32,8 @@
<input-method xmlns:android="http://schemas.android.com/apk/res/android"
android:isDefault="@bool/im_is_default"
- android:settingsActivity="org.mozc.android.inputmethod.japanese.preference.MozcProxyPreferenceActivity" >
+ android:settingsActivity="org.mozc.android.inputmethod.japanese.preference.MozcProxyPreferenceActivity"
+ android:supportsSwitchingToNextInputMethod="true" >
<subtype
android:icon="@drawable/application_icon"
diff --git a/src/android/static_resources/resources_oss/res/xml/pref_about.xml b/src/android/static_resources/resources_oss/res/xml/pref_about.xml
index 6184fe8..a009ce0 100644
--- a/src/android/static_resources/resources_oss/res/xml/pref_about.xml
+++ b/src/android/static_resources/resources_oss/res/xml/pref_about.xml
@@ -72,6 +72,12 @@
android:targetClass="org.mozc.android.inputmethod.japanese.preference.MiniBrowserActivity"
android:data="@string/pref_oss_credits_url" />
</Preference>
+
+ <CheckBoxPreference
+ android:defaultValue="@bool/show_launcher_icon"
+ android:key="pref_launcher_icon_visibility"
+ android:summary="@string/pref_launcher_icon_visibility_description"
+ android:title="@string/pref_launcher_icon_visibility_title" />
</PreferenceCategory>
</PreferenceScreen>
diff --git a/src/android/static_resources/resources_oss/res/xml/pref_input_support.xml b/src/android/static_resources/resources_oss/res/xml/pref_input_support.xml
index 5e94fd2..458872f 100644
--- a/src/android/static_resources/resources_oss/res/xml/pref_input_support.xml
+++ b/src/android/static_resources/resources_oss/res/xml/pref_input_support.xml
@@ -39,7 +39,7 @@
android:title="@string/pref_haptic_feedback_title" />
<org.mozc.android.inputmethod.japanese.preference.SeekbarPreference
- android:defaultValue="30"
+ android:defaultValue="5"
android:key="pref_haptic_feedback_duration_key"
android:title="@string/pref_haptic_feedback_duration_title"
android:max="250"
@@ -82,19 +82,25 @@
android:title="@string/pref_fullscreen_title" />
<ListPreference
- android:defaultValue="BLUE_LIGHTGRAY"
+ android:defaultValue="@string/pref_skin_type_default"
android:entries="@array/pref_skin_type_entries"
android:entryValues="@array/pref_skin_type_values"
- android:key="pref_skin_type_key"
+ android:key="@string/pref_skin_type_key"
android:summary="@string/pref_skin_type_description"
android:title="@string/pref_skin_type_title" />
<ListPreference
- android:defaultValue="JAPANESE109A"
+ android:defaultValue="DEFAULT"
android:entries="@array/pref_hardware_keymap_entries"
android:entryValues="@array/pref_hardware_keymap_values"
android:key="pref_hardware_keymap"
android:summary="@string/pref_hardware_keymap_description"
android:title="@string/pref_hardware_title" />
+
+ <CheckBoxPreference
+ android:defaultValue="true"
+ android:key="pref_voice_input_key"
+ android:summary="@string/pref_voice_input_description"
+ android:title="@string/pref_voice_input_title" />
</PreferenceCategory>
</PreferenceScreen>
diff --git a/src/android/static_resources/resources_oss/res/xml/skin_blue_darkgray.xml b/src/android/static_resources/resources_oss/res/xml/skin_blue_darkgray.xml
new file mode 100644
index 0000000..64ed64d
--- /dev/null
+++ b/src/android/static_resources/resources_oss/res/xml/skin_blue_darkgray.xml
@@ -0,0 +1,455 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<Skin xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:mozc="http://schemas.android.com/apk/res-auto" >
+
+ <Color
+ android:name="keyboardSeparatorColor"
+ android:color="#00000000" />
+ <Color
+ android:name="twelvekeysLayoutReleasedKeyTopColor"
+ android:color="#FF656565" />
+ <Color
+ android:name="twelvekeysLayoutReleasedKeyBottomColor"
+ android:color="#FF656565" />
+ <Color
+ android:name="twelvekeysLayoutReleasedKeyHighlightColor"
+ android:color="#FF8E8E8E" />
+ <Color
+ android:name="twelvekeysLayoutReleasedKeyLightShadeColor"
+ android:color="#FF535353" />
+ <Color
+ android:name="twelvekeysLayoutReleasedKeyDarkShadeColor"
+ android:color="#FF535353" />
+ <Color
+ android:name="twelvekeysLayoutReleasedKeyShadowColor"
+ android:color="#FF1E1E1E" />
+ <Color
+ android:name="twelvekeysLayoutPressedKeyTopColor"
+ android:color="#FFAAAAAA" />
+ <Color
+ android:name="twelvekeysLayoutPressedKeyBottomColor"
+ android:color="#FF828282" />
+ <Color
+ android:name="twelvekeysLayoutPressedKeyHighlightColor"
+ android:color="#00000000" />
+ <Color
+ android:name="twelvekeysLayoutPressedKeyLightShadeColor"
+ android:color="#00000000" />
+ <Color
+ android:name="twelvekeysLayoutPressedKeyDarkShadeColor"
+ android:color="#00000000" />
+ <Color
+ android:name="twelvekeysLayoutPressedKeyShadowColor"
+ android:color="#00000000" />
+ <Color
+ android:name="twelvekeysLayoutReleasedFunctionKeyTopColor"
+ android:color="#FF222222" />
+ <Color
+ android:name="twelvekeysLayoutReleasedFunctionKeyBottomColor"
+ android:color="#FF222222" />
+ <Color
+ android:name="twelvekeysLayoutReleasedFunctionKeyHighlightColor"
+ android:color="#FF535353" />
+ <Color
+ android:name="twelvekeysLayoutReleasedFunctionKeyLightShadeColor"
+ android:color="#FF000000" />
+ <Color
+ android:name="twelvekeysLayoutReleasedFunctionKeyDarkShadeColor"
+ android:color="#FF000000" />
+ <Color
+ android:name="twelvekeysLayoutReleasedFunctionKeyShadowColor"
+ android:color="#FF1E1E1E" />
+ <Color
+ android:name="twelvekeysLayoutPressedFunctionKeyTopColor"
+ android:color="#FF066696" />
+ <Color
+ android:name="twelvekeysLayoutPressedFunctionKeyBottomColor"
+ android:color="#DD066696" />
+ <Color
+ android:name="twelvekeysLayoutPressedFunctionKeyHighlightColor"
+ android:color="#00000000" />
+ <Color
+ android:name="twelvekeysLayoutPressedFunctionKeyLightShadeColor"
+ android:color="#00000000" />
+ <Color
+ android:name="twelvekeysLayoutPressedFunctionKeyDarkShadeColor"
+ android:color="#00000000" />
+ <Color
+ android:name="twelvekeysLayoutPressedFunctionKeyShadowColor"
+ android:color="#00000000" />
+ <Color
+ android:name="qwertyLayoutReleasedKeyTopColor"
+ android:color="#FF656565" />
+ <Color
+ android:name="qwertyLayoutReleasedKeyBottomColor"
+ android:color="#FF656565" />
+ <Color
+ android:name="qwertyLayoutReleasedKeyHighlightColor"
+ android:color="#FF8E8E8E" />
+ <Color
+ android:name="qwertyLayoutReleasedKeyShadowColor"
+ android:color="#FF1E1E1E" />
+ <Color
+ android:name="qwertyLayoutPressedKeyTopColor"
+ android:color="#FF066696" />
+ <Color
+ android:name="qwertyLayoutPressedKeyBottomColor"
+ android:color="#DD066696" />
+ <Color
+ android:name="qwertyLayoutPressedKeyHighlightColor"
+ android:color="#00000000" />
+ <Color
+ android:name="qwertyLayoutPressedKeyShadowColor"
+ android:color="#FF1E1E1E" />
+ <Color
+ android:name="qwertyLayoutReleasedFunctionKeyTopColor"
+ android:color="#FF222222" />
+ <Color
+ android:name="qwertyLayoutReleasedFunctionKeyBottomColor"
+ android:color="#FF222222" />
+ <Color
+ android:name="qwertyLayoutReleasedFunctionKeyHighlightColor"
+ android:color="#FF535353" />
+ <Color
+ android:name="qwertyLayoutReleasedFunctionKeyShadowColor"
+ android:color="#FF1E1E1E" />
+ <Color
+ android:name="qwertyLayoutPressedFunctionKeyTopColor"
+ android:color="#FF066696" />
+ <Color
+ android:name="qwertyLayoutPressedFunctionKeyBottomColor"
+ android:color="#DD066696" />
+ <Color
+ android:name="qwertyLayoutPressedFunctionKeyHighlightColor"
+ android:color="#00000000" />
+ <Color
+ android:name="qwertyLayoutPressedFunctionKeyShadowColor"
+ android:color="#FF1E1E1E" />
+ <Color
+ android:name="qwertyLayoutReleasedSpaceKeyTopColor"
+ android:color="#FF222222" />
+ <Color
+ android:name="qwertyLayoutReleasedSpaceKeyBottomColor"
+ android:color="#FF222222" />
+ <Color
+ android:name="qwertyLayoutReleasedSpaceKeyHighlightColor"
+ android:color="#FF535353" />
+ <Color
+ android:name="qwertyLayoutReleasedSpaceKeyShadowColor"
+ android:color="#FF1E1E1E" />
+ <Color
+ android:name="qwertyLayoutPressedSpaceKeyTopColor"
+ android:color="#FF066696" />
+ <Color
+ android:name="qwertyLayoutPressedSpaceKeyBottomColor"
+ android:color="#DD066696" />
+ <Color
+ android:name="qwertyLayoutPressedSpaceKeyHighlightColor"
+ android:color="#00000000" />
+ <Color
+ android:name="qwertyLayoutPressedSpaceKeyShadowColor"
+ android:color="#FF1E1E1E" />
+ <Color
+ android:name="flickBaseColor"
+ android:color="#FF1B78A3" />
+ <Color
+ android:name="flickShadeColor"
+ android:color="#FF145A7A" />
+ <Color
+ android:name="popupFrameWindowTopColor"
+ android:color="#FF066696" />
+ <Color
+ android:name="popupFrameWindowBottomColor"
+ android:color="#DD066696" />
+ <Color
+ android:name="popupFrameWindowShadowColor"
+ android:color="#FF1E1E1E" />
+ <Color
+ android:name="candidateScrollBarTopColor"
+ android:color="#FF73DAF7" />
+ <Color
+ android:name="candidateScrollBarBottomColor"
+ android:color="#FF3393E5" />
+ <Color
+ android:name="candidateBackgroundTopColor"
+ android:color="#FFE8E8E8" />
+ <Color
+ android:name="candidateBackgroundBottomColor"
+ android:color="#FFDCDCDC" />
+ <Color
+ android:name="candidateBackgroundHighlightColor"
+ android:color="#FFFFFFFF" />
+ <Color
+ android:name="candidateBackgroundBorderColor"
+ android:color="#FF8C8C8C" />
+ <Color
+ android:name="candidateBackgroundSeparatorColor"
+ android:color="#00000000" />
+ <Color
+ android:name="candidateBackgroundFocusedTopColor"
+ android:color="#FFA5DDF6" />
+ <Color
+ android:name="candidateBackgroundFocusedBottomColor"
+ android:color="#FFC1E9F5" />
+ <Color
+ android:name="candidateBackgroundFocusedShadowColor"
+ android:color="#40000000" />
+ <Color
+ android:name="symbolReleasedFunctionKeyTopColor"
+ android:color="#FF656565" />
+ <Color
+ android:name="symbolReleasedFunctionKeyBottomColor"
+ android:color="#FF656565" />
+ <Color
+ android:name="symbolReleasedFunctionKeyHighlightColor"
+ android:color="#FF8E8E8E" />
+ <Color
+ android:name="symbolReleasedFunctionKeyShadowColor"
+ android:color="#FF1E1E1E" />
+ <Color
+ android:name="symbolPressedFunctionKeyTopColor"
+ android:color="#FF066696" />
+ <Color
+ android:name="symbolPressedFunctionKeyBottomColor"
+ android:color="#DD066696" />
+ <Color
+ android:name="symbolPressedFunctionKeyHighlightColor"
+ android:color="#00000000" />
+ <Color
+ android:name="symbolPressedFunctionKeyShadowColor"
+ android:color="#FF1E1E1E" />
+ <Color
+ android:name="symbolScrollBarTopColor"
+ android:color="#FF73DAF7" />
+ <Color
+ android:name="symbolScrollBarBottomColor"
+ android:color="#FF53B6EE" />
+ <Color
+ android:name="symbolMinorCategoryTabSelectedColor"
+ android:color="#FF33B5E5" />
+ <Color
+ android:name="symbolMinorCategoryTabPressedColor"
+ android:color="#8033B5E5" />
+ <Color
+ android:name="symbolCandidateBackgroundTopColor"
+ android:color="#FFFEFEFE" />
+ <Color
+ android:name="symbolCandidateBackgroundBottomColor"
+ android:color="#FFECECEC" />
+ <Color
+ android:name="symbolCandidateBackgroundHighlightColor"
+ android:color="#FFFFFFFF" />
+ <Color
+ android:name="symbolCandidateBackgroundBorderColor"
+ android:color="#7C666666" />
+ <Color
+ android:name="symbolCandidateBackgroundSeparatorColor"
+ android:color="#00000000" />
+ <Color
+ android:name="symbolSeparatorColor"
+ android:color="#00000000" />
+ <Color
+ android:name="threeDotsColor"
+ android:color="#FFF7F7F7" />
+ <Color
+ android:name="keyIconMainColor"
+ android:color="#FFFFFFFF" />
+ <Color
+ android:name="keyIconGuideColor"
+ android:color="#FFBEBEBE" />
+ <Color
+ android:name="keyIconGuideLightColor"
+ android:color="#FF999999" />
+ <Color
+ android:name="keyIconMainHighlightColor"
+ android:color="#FFFFFFFF" />
+ <Color
+ android:name="keyIconGuideHighlightColor"
+ android:color="#FFFFFFFF" />
+ <Color
+ android:name="keyIconBoundColor"
+ android:color="#FF999999" />
+ <Color
+ android:name="keyIconTwelvekeysFunctionColor"
+ android:color="#FFF7F7F7" />
+ <Color
+ android:name="keyIconTwelvekeysGlobeColor"
+ android:color="#99FFFFFF" />
+ <Color
+ android:name="keyIconQwertyFunctionColor"
+ android:color="#FFF7F7F7" />
+ <Color
+ android:name="keyIconFunctionDarkColor"
+ android:color="#FF868686" />
+ <Color
+ android:name="keyIconEnterColor"
+ android:color="#FFF7F7F7" />
+ <Color
+ android:name="keyIconEnterCircleColor"
+ android:color="#00000000" />
+ <Color
+ android:name="keyIconQwertyShiftOnArrowColor"
+ android:color="#FF55C6EE" />
+ <Color
+ android:name="keyPopupHighlightColor"
+ android:color="#FF4DA7CF" />
+ <Color
+ android:name="symbolMajorColor"
+ android:color="#FF333333" />
+ <Color
+ android:name="symbolMajorSelectedColor"
+ android:color="#FFFFFFFF" />
+ <Color
+ android:name="symbolMinorColor"
+ android:color="#FFFFFFFF" />
+ <Color
+ android:name="symbolMinorSelectedColor"
+ android:color="#FFFFFFFF" />
+ <Color
+ android:name="symbolMajorButtonTopColor"
+ android:color="#FFF5F5F5" />
+ <Color
+ android:name="symbolMajorButtonBottomColor"
+ android:color="#FFD2D2D2" />
+ <Color
+ android:name="symbolMajorButtonPressedTopColor"
+ android:color="#FF959595" />
+ <Color
+ android:name="symbolMajorButtonPressedBottomColor"
+ android:color="#FF727272" />
+ <Color
+ android:name="symbolMajorButtonSelectedTopColor"
+ android:color="#FFAAAAAA" />
+ <Color
+ android:name="symbolMajorButtonSelectedBottomColor"
+ android:color="#FF828282" />
+ <Color
+ android:name="symbolMajorButtonShadowColor"
+ android:color="#57000000" />
+ <Color
+ android:name="keyboardFoldingButtonBackgroundDefaultColor"
+ android:color="#8C676767" />
+ <Color
+ android:name="keyboardFoldingButtonBackgroundScrolledColor"
+ android:color="#8C676767" />
+ <Color
+ android:name="candidateValueTextColor"
+ android:color="#FF000000" />
+ <Color
+ android:name="candidateValueFocusedTextColor"
+ android:color="#FF000000" />
+ <Color
+ android:name="candidateDescriptionTextColor"
+ android:color="#FF888888" />
+ <Color
+ android:name="buttonFrameButtonPressedColor"
+ android:color="#8033B5E5" />
+
+ <Dimension
+ android:name="twelvekeysLeftOffsetDimension"
+ mozc:dimension="0.5dip" />
+ <Dimension
+ android:name="twelvekeysTopOffsetDimension"
+ mozc:dimension="1dip" />
+ <Dimension
+ android:name="twelvekeysRightOffsetDimension"
+ mozc:dimension="1dip" />
+ <Dimension
+ android:name="twelvekeysBottomOffsetDimension"
+ mozc:dimension="0dip" />
+ <Dimension
+ android:name="qwertyLeftOffsetDimension"
+ mozc:dimension="2dip" />
+ <Dimension
+ android:name="qwertyTopOffsetDimension"
+ mozc:dimension="1dip" />
+ <Dimension
+ android:name="qwertyRightOffsetDimension"
+ mozc:dimension="2dip" />
+ <Dimension
+ android:name="qwertyBottomOffsetDimension"
+ mozc:dimension="3dip" />
+ <Dimension
+ android:name="qwertyRoundRadiusDimension"
+ mozc:dimension="2dip" />
+ <Dimension
+ android:name="qwertySpaceKeyHeightDimension"
+ mozc:dimension="0dip" />
+ <Dimension
+ android:name="qwertySpaceKeyHorizontalOffsetDimension"
+ mozc:dimension="2dip" />
+ <Dimension
+ android:name="qwertySpaceKeyRoundRadiusDimension"
+ mozc:dimension="2dip" />
+ <Dimension
+ android:name="symbolMajorButtonRoundDimension"
+ mozc:dimension="3.5dip" />
+ <Dimension
+ android:name="symbolMajorButtonPaddingDimension"
+ mozc:dimension="2dip" />
+ <Dimension
+ android:name="symbolMinorIndicatorHeightDimension"
+ mozc:dimension="5dip" />
+
+ <Drawable android:name="buttonFrameBackgroundDrawable" >
+ <inset android:drawable="@drawable/window_background_black" />
+ </Drawable>
+ <Drawable android:name="narrowFrameBackgroundDrawable" >
+ <color android:color="#524C51" />
+ </Drawable>
+ <Drawable
+ android:name="keyboardFrameSeparatorBackgroundDrawable" >
+ <inset android:drawable="@drawable/window_background_black" />
+ </Drawable>
+ <Drawable
+ android:name="symbolSeparatorAboveMajorCategoryBackgroundDrawable" >
+ <inset android:drawable="@drawable/window_background_black" />
+ </Drawable>
+ <Drawable android:name="windowBackgroundDrawable" >
+ <inset android:drawable="@drawable/window_background_black" />
+ </Drawable>
+ <Drawable android:name="conversionCandidateViewBackgroundDrawable" >
+ <color android:color="#FFE5E5E5" />
+ </Drawable>
+ <Drawable android:name="symbolCandidateViewBackgroundDrawable" >
+ <color android:color="#FFE5E5E5" />
+ </Drawable>
+ <Drawable android:name="symbolMajorCategoryBackgroundDrawable" >
+ <inset android:drawable="@drawable/window_background_black" />
+ </Drawable>
+ <Drawable android:name="scrollBarBackgroundDrawable" >
+ <bitmap
+ android:src="@drawable/candidate__slidebar_background"
+ android:tileMode="repeat" />
+ </Drawable>
+</Skin>
diff --git a/src/android/static_resources/resources_oss/res/xml/skin_blue_lightgray.xml b/src/android/static_resources/resources_oss/res/xml/skin_blue_lightgray.xml
new file mode 100644
index 0000000..635cd78
--- /dev/null
+++ b/src/android/static_resources/resources_oss/res/xml/skin_blue_lightgray.xml
@@ -0,0 +1,461 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<Skin xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:mozc="http://schemas.android.com/apk/res-auto" >
+
+ <Color
+ android:name="keyboardSeparatorColor"
+ android:color="#00000000" />
+ <Color
+ android:name="twelvekeysLayoutReleasedKeyTopColor"
+ android:color="#FFF5F5F5" />
+ <Color
+ android:name="twelvekeysLayoutReleasedKeyBottomColor"
+ android:color="#FFD2D2D2" />
+ <Color
+ android:name="twelvekeysLayoutReleasedKeyHighlightColor"
+ android:color="#FFFAFAFA" />
+ <Color
+ android:name="twelvekeysLayoutReleasedKeyLightShadeColor"
+ android:color="#FFAFAFAF" />
+ <Color
+ android:name="twelvekeysLayoutReleasedKeyDarkShadeColor"
+ android:color="#FF909090" />
+ <Color
+ android:name="twelvekeysLayoutReleasedKeyShadowColor"
+ android:color="#FF1E1E1E" />
+ <Color
+ android:name="twelvekeysLayoutPressedKeyTopColor"
+ android:color="#FFAAAAAA" />
+ <Color
+ android:name="twelvekeysLayoutPressedKeyBottomColor"
+ android:color="#FF828282" />
+ <Color
+ android:name="twelvekeysLayoutPressedKeyHighlightColor"
+ android:color="#00000000" />
+ <Color
+ android:name="twelvekeysLayoutPressedKeyLightShadeColor"
+ android:color="#00000000" />
+ <Color
+ android:name="twelvekeysLayoutPressedKeyDarkShadeColor"
+ android:color="#00000000" />
+ <Color
+ android:name="twelvekeysLayoutPressedKeyShadowColor"
+ android:color="#00000000" />
+ <Color
+ android:name="twelvekeysLayoutReleasedFunctionKeyTopColor"
+ android:color="#FF858087" />
+ <Color
+ android:name="twelvekeysLayoutReleasedFunctionKeyBottomColor"
+ android:color="#FF67645F" />
+ <Color
+ android:name="twelvekeysLayoutReleasedFunctionKeyHighlightColor"
+ android:color="#FF898588" />
+ <Color
+ android:name="twelvekeysLayoutReleasedFunctionKeyLightShadeColor"
+ android:color="#FF5C5759" />
+ <Color
+ android:name="twelvekeysLayoutReleasedFunctionKeyDarkShadeColor"
+ android:color="#FF555555" />
+ <Color
+ android:name="twelvekeysLayoutReleasedFunctionKeyShadowColor"
+ android:color="#FF1E1E1E" />
+ <Color
+ android:name="twelvekeysLayoutPressedFunctionKeyTopColor"
+ android:color="#FFBFBFBD" />
+ <Color
+ android:name="twelvekeysLayoutPressedFunctionKeyBottomColor"
+ android:color="#FFF7F5EC" />
+ <Color
+ android:name="twelvekeysLayoutPressedFunctionKeyHighlightColor"
+ android:color="#00000000" />
+ <Color
+ android:name="twelvekeysLayoutPressedFunctionKeyLightShadeColor"
+ android:color="#00000000" />
+ <Color
+ android:name="twelvekeysLayoutPressedFunctionKeyDarkShadeColor"
+ android:color="#00000000" />
+ <Color
+ android:name="twelvekeysLayoutPressedFunctionKeyShadowColor"
+ android:color="#00000000" />
+ <Color
+ android:name="qwertyLayoutReleasedKeyTopColor"
+ android:color="#FFF5F5F5" />
+ <Color
+ android:name="qwertyLayoutReleasedKeyBottomColor"
+ android:color="#FFD2D2D2" />
+ <Color
+ android:name="qwertyLayoutReleasedKeyHighlightColor"
+ android:color="#00000000" />
+ <Color
+ android:name="qwertyLayoutReleasedKeyShadowColor"
+ android:color="#FF1E1E1E" />
+ <Color
+ android:name="qwertyLayoutPressedKeyTopColor"
+ android:color="#FFCCCCCC" />
+ <Color
+ android:name="qwertyLayoutPressedKeyBottomColor"
+ android:color="#FF797979" />
+ <Color
+ android:name="qwertyLayoutPressedKeyHighlightColor"
+ android:color="#00000000" />
+ <Color
+ android:name="qwertyLayoutPressedKeyShadowColor"
+ android:color="#FF1E1E1E" />
+ <Color
+ android:name="qwertyLayoutReleasedFunctionKeyTopColor"
+ android:color="#FF858087" />
+ <Color
+ android:name="qwertyLayoutReleasedFunctionKeyBottomColor"
+ android:color="#FF67645F" />
+ <Color
+ android:name="qwertyLayoutReleasedFunctionKeyHighlightColor"
+ android:color="#00000000" />
+ <Color
+ android:name="qwertyLayoutReleasedFunctionKeyShadowColor"
+ android:color="#FF1E1E1E" />
+ <Color
+ android:name="qwertyLayoutPressedFunctionKeyTopColor"
+ android:color="#FFE9E4E4" />
+ <Color
+ android:name="qwertyLayoutPressedFunctionKeyBottomColor"
+ android:color="#FFB2ADAD" />
+ <Color
+ android:name="qwertyLayoutPressedFunctionKeyHighlightColor"
+ android:color="#00000000" />
+ <Color
+ android:name="qwertyLayoutPressedFunctionKeyShadowColor"
+ android:color="#FF1E1E1E" />
+ <Color
+ android:name="qwertyLayoutReleasedSpaceKeyTopColor"
+ android:color="#FF858087" />
+ <Color
+ android:name="qwertyLayoutReleasedSpaceKeyBottomColor"
+ android:color="#FF67645F" />
+ <Color
+ android:name="qwertyLayoutReleasedSpaceKeyHighlightColor"
+ android:color="#00000000" />
+ <Color
+ android:name="qwertyLayoutReleasedSpaceKeyShadowColor"
+ android:color="#FF1E1E1E" />
+ <Color
+ android:name="qwertyLayoutPressedSpaceKeyTopColor"
+ android:color="#FFE9E4E4" />
+ <Color
+ android:name="qwertyLayoutPressedSpaceKeyBottomColor"
+ android:color="#FFB2ADAD" />
+ <Color
+ android:name="qwertyLayoutPressedSpaceKeyHighlightColor"
+ android:color="#00000000" />
+ <Color
+ android:name="qwertyLayoutPressedSpaceKeyShadowColor"
+ android:color="#FF1E1E1E" />
+ <Color
+ android:name="flickBaseColor"
+ android:color="#FF55C6EE" />
+ <Color
+ android:name="flickShadeColor"
+ android:color="#FF3F94B2" />
+ <Color
+ android:name="popupFrameWindowTopColor"
+ android:color="#FFFBFBFB" />
+ <Color
+ android:name="popupFrameWindowBottomColor"
+ android:color="#FFEAEAEA" />
+ <Color
+ android:name="popupFrameWindowShadowColor"
+ android:color="#FF1E1E1E" />
+ <Color
+ android:name="candidateScrollBarTopColor"
+ android:color="#FF73DAF7" />
+ <Color
+ android:name="candidateScrollBarBottomColor"
+ android:color="#FF3393E5" />
+ <Color
+ android:name="candidateBackgroundTopColor"
+ android:color="#FFE8E8E8" />
+ <Color
+ android:name="candidateBackgroundBottomColor"
+ android:color="#FFDCDCDC" />
+ <Color
+ android:name="candidateBackgroundHighlightColor"
+ android:color="#FFFFFFFF" />
+ <Color
+ android:name="candidateBackgroundBorderColor"
+ android:color="#FF8C8C8C" />
+ <Color
+ android:name="candidateBackgroundSeparatorColor"
+ android:color="#00000000" />
+ <Color
+ android:name="candidateBackgroundFocusedTopColor"
+ android:color="#FFA5DDF6" />
+ <Color
+ android:name="candidateBackgroundFocusedBottomColor"
+ android:color="#FFC1E9F5" />
+ <Color
+ android:name="candidateBackgroundFocusedShadowColor"
+ android:color="#40000000" />
+ <Color
+ android:name="symbolReleasedFunctionKeyTopColor"
+ android:color="#FF858087" />
+ <Color
+ android:name="symbolReleasedFunctionKeyBottomColor"
+ android:color="#FF67645F" />
+ <Color
+ android:name="symbolReleasedFunctionKeyHighlightColor"
+ android:color="#00000000" />
+ <Color
+ android:name="symbolReleasedFunctionKeyShadowColor"
+ android:color="#FF1E1E1E" />
+ <Color
+ android:name="symbolPressedFunctionKeyTopColor"
+ android:color="#FFE9E4E4" />
+ <Color
+ android:name="symbolPressedFunctionKeyBottomColor"
+ android:color="#FFB2ADAD" />
+ <Color
+ android:name="symbolPressedFunctionKeyHighlightColor"
+ android:color="#00000000" />
+ <Color
+ android:name="symbolPressedFunctionKeyShadowColor"
+ android:color="#FF1E1E1E" />
+ <Color
+ android:name="symbolScrollBarTopColor"
+ android:color="#FF73DAF7" />
+ <Color
+ android:name="symbolScrollBarBottomColor"
+ android:color="#FF53B6EE" />
+ <Color
+ android:name="symbolMinorCategoryTabSelectedColor"
+ android:color="#FF33B5E5" />
+ <Color
+ android:name="symbolMinorCategoryTabPressedColor"
+ android:color="#8033B5E5" />
+ <Color
+ android:name="symbolCandidateBackgroundTopColor"
+ android:color="#FFFEFEFE" />
+ <Color
+ android:name="symbolCandidateBackgroundBottomColor"
+ android:color="#FFECECEC" />
+ <Color
+ android:name="symbolCandidateBackgroundHighlightColor"
+ android:color="#FFFFFFFF" />
+ <Color
+ android:name="symbolCandidateBackgroundBorderColor"
+ android:color="#7C666666" />
+ <Color
+ android:name="symbolCandidateBackgroundSeparatorColor"
+ android:color="#00000000" />
+ <Color
+ android:name="symbolSeparatorColor"
+ android:color="#00000000" />
+ <Color
+ android:name="threeDotsColor"
+ android:color="#FFDDDDDD" />
+ <Color
+ android:name="keyIconMainColor"
+ android:color="#FF272727" />
+ <Color
+ android:name="keyIconGuideColor"
+ android:color="#FF333333" />
+ <Color
+ android:name="keyIconGuideLightColor"
+ android:color="#FF999999" />
+ <Color
+ android:name="keyIconMainHighlightColor"
+ android:color="#FFFFFFFF" />
+ <Color
+ android:name="keyIconGuideHighlightColor"
+ android:color="#FFFFFFFF" />
+ <Color
+ android:name="keyIconBoundColor"
+ android:color="#FF999999" />
+ <Color
+ android:name="keyIconTwelvekeysFunctionColor"
+ android:color="#FFDDDDDD" />
+ <Color
+ android:name="keyIconTwelvekeysGlobeColor"
+ android:color="#99272727" />
+ <Color
+ android:name="keyIconQwertyFunctionColor"
+ android:color="#FFDDDDDD" />
+ <Color
+ android:name="keyIconFunctionDarkColor"
+ android:color="#FF272727" />
+ <Color
+ android:name="keyIconEnterColor"
+ android:color="#FFDDDDDD" />
+ <Color
+ android:name="keyIconEnterCircleColor"
+ android:color="#00000000" />
+ <Color
+ android:name="keyIconQwertyShiftOnArrowColor"
+ android:color="#FF55C6EE" />
+ <Color
+ android:name="keyPopupHighlightColor"
+ android:color="#FF57B8E5" />
+ <Color
+ android:name="symbolMajorColor"
+ android:color="#FF333333" />
+ <Color
+ android:name="symbolMajorSelectedColor"
+ android:color="#FFFFFFFF" />
+ <Color
+ android:name="symbolMinorColor"
+ android:color="#FFFFFFFF" />
+ <Color
+ android:name="symbolMinorSelectedColor"
+ android:color="#FFFFFFFF" />
+ <Color
+ android:name="symbolMajorButtonTopColor"
+ android:color="#FFF5F5F5" />
+ <Color
+ android:name="symbolMajorButtonBottomColor"
+ android:color="#FFD2D2D2" />
+ <Color
+ android:name="symbolMajorButtonPressedTopColor"
+ android:color="#FF959595" />
+ <Color
+ android:name="symbolMajorButtonPressedBottomColor"
+ android:color="#FF727272" />
+ <Color
+ android:name="symbolMajorButtonSelectedTopColor"
+ android:color="#FFAAAAAA" />
+ <Color
+ android:name="symbolMajorButtonSelectedBottomColor"
+ android:color="#FF828282" />
+ <Color
+ android:name="symbolMajorButtonShadowColor"
+ android:color="#57000000" />
+ <Color
+ android:name="keyboardFoldingButtonBackgroundDefaultColor"
+ android:color="#8C676767" />
+ <Color
+ android:name="keyboardFoldingButtonBackgroundScrolledColor"
+ android:color="#8C676767" />
+ <Color
+ android:name="candidateValueTextColor"
+ android:color="#FF000000" />
+ <Color
+ android:name="candidateValueFocusedTextColor"
+ android:color="#FF000000" />
+ <Color
+ android:name="candidateDescriptionTextColor"
+ android:color="#FF888888" />
+ <Color
+ android:name="buttonFrameButtonPressedColor"
+ android:color="#8033B5E5" />
+
+ <Dimension
+ android:name="twelvekeysLeftOffsetDimension"
+ mozc:dimension="0.5dip" />
+ <Dimension
+ android:name="twelvekeysTopOffsetDimension"
+ mozc:dimension="1dip" />
+ <Dimension
+ android:name="twelvekeysRightOffsetDimension"
+ mozc:dimension="1dip" />
+ <Dimension
+ android:name="twelvekeysBottomOffsetDimension"
+ mozc:dimension="0dip" />
+ <Dimension
+ android:name="qwertyLeftOffsetDimension"
+ mozc:dimension="2dip" />
+ <Dimension
+ android:name="qwertyTopOffsetDimension"
+ mozc:dimension="1dip" />
+ <Dimension
+ android:name="qwertyRightOffsetDimension"
+ mozc:dimension="2dip" />
+ <Dimension
+ android:name="qwertyBottomOffsetDimension"
+ mozc:dimension="3dip" />
+ <Dimension
+ android:name="qwertyRoundRadiusDimension"
+ mozc:dimension="2dip" />
+ <Dimension
+ android:name="qwertySpaceKeyHeightDimension"
+ mozc:dimension="0dip" />
+ <Dimension
+ android:name="qwertySpaceKeyHorizontalOffsetDimension"
+ mozc:dimension="2dip" />
+ <Dimension
+ android:name="qwertySpaceKeyRoundRadiusDimension"
+ mozc:dimension="2dip" />
+ <Dimension
+ android:name="symbolMajorButtonRoundDimension"
+ mozc:dimension="3.5dip" />
+ <Dimension
+ android:name="symbolMajorButtonPaddingDimension"
+ mozc:dimension="2dip" />
+ <Dimension
+ android:name="symbolMinorIndicatorHeightDimension"
+ mozc:dimension="5dip" />
+
+ <Drawable android:name="buttonFrameBackgroundDrawable" >
+ <bitmap
+ android:src="@drawable/window__background_dark"
+ android:tileMode="repeat" />
+ </Drawable>
+ <Drawable android:name="narrowFrameBackgroundDrawable" >
+ <color android:color="#524C51" />
+ </Drawable>
+ <Drawable android:name="keyboardFrameSeparatorBackgroundDrawable" >
+ <color android:color="#19FFFFFF" />
+ </Drawable>
+ <Drawable android:name="symbolSeparatorAboveMajorCategoryBackgroundDrawable" >
+ <bitmap
+ android:src="@drawable/window__background"
+ android:tileMode="repeat" />
+ </Drawable>
+ <Drawable android:name="windowBackgroundDrawable" >
+ <bitmap
+ android:src="@drawable/window__background"
+ android:tileMode="repeat" />
+ </Drawable>
+ <Drawable android:name="conversionCandidateViewBackgroundDrawable" >
+ <color android:color="#FFE5E5E5" />
+ </Drawable>
+ <Drawable android:name="symbolCandidateViewBackgroundDrawable" >
+ <color android:color="#FFE5E5E5" />
+ </Drawable>
+ <Drawable android:name="symbolMajorCategoryBackgroundDrawable" >
+ <bitmap
+ android:src="@drawable/window__background"
+ android:tileMode="repeat" />
+ </Drawable>
+ <Drawable android:name="scrollBarBackgroundDrawable" >
+ <bitmap
+ android:src="@drawable/candidate__slidebar_background"
+ android:tileMode="repeat" />
+ </Drawable>
+</Skin>
diff --git a/src/android/static_resources/resources_oss/res/xml/skin_material_design_dark.xml b/src/android/static_resources/resources_oss/res/xml/skin_material_design_dark.xml
new file mode 100644
index 0000000..68c32b1
--- /dev/null
+++ b/src/android/static_resources/resources_oss/res/xml/skin_material_design_dark.xml
@@ -0,0 +1,451 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<Skin xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:mozc="http://schemas.android.com/apk/res-auto" >
+
+ <Color
+ android:name="keyboardSeparatorColor"
+ android:color="#1AFFFFFF" />
+ <Color
+ android:name="twelvekeysLayoutReleasedKeyTopColor"
+ android:color="#FF263238" />
+ <Color
+ android:name="twelvekeysLayoutReleasedKeyBottomColor"
+ android:color="#FF263238" />
+ <Color
+ android:name="twelvekeysLayoutReleasedKeyHighlightColor"
+ android:color="#00000000" />
+ <Color
+ android:name="twelvekeysLayoutReleasedKeyLightShadeColor"
+ android:color="#00000000" />
+ <Color
+ android:name="twelvekeysLayoutReleasedKeyDarkShadeColor"
+ android:color="#00000000" />
+ <Color
+ android:name="twelvekeysLayoutReleasedKeyShadowColor"
+ android:color="#FF263238" />
+ <Color
+ android:name="twelvekeysLayoutPressedKeyTopColor"
+ android:color="#1AFFFFFF" />
+ <Color
+ android:name="twelvekeysLayoutPressedKeyBottomColor"
+ android:color="#1AFFFFFF" />
+ <Color
+ android:name="twelvekeysLayoutPressedKeyHighlightColor"
+ android:color="#00000000" />
+ <Color
+ android:name="twelvekeysLayoutPressedKeyLightShadeColor"
+ android:color="#00000000" />
+ <Color
+ android:name="twelvekeysLayoutPressedKeyDarkShadeColor"
+ android:color="#00000000" />
+ <Color
+ android:name="twelvekeysLayoutPressedKeyShadowColor"
+ android:color="#00000000" />
+ <Color
+ android:name="twelvekeysLayoutReleasedFunctionKeyTopColor"
+ android:color="#FF263238" />
+ <Color
+ android:name="twelvekeysLayoutReleasedFunctionKeyBottomColor"
+ android:color="#FF263238" />
+ <Color
+ android:name="twelvekeysLayoutReleasedFunctionKeyHighlightColor"
+ android:color="#00000000" />
+ <Color
+ android:name="twelvekeysLayoutReleasedFunctionKeyLightShadeColor"
+ android:color="#00000000" />
+ <Color
+ android:name="twelvekeysLayoutReleasedFunctionKeyDarkShadeColor"
+ android:color="#00000000" />
+ <Color
+ android:name="twelvekeysLayoutReleasedFunctionKeyShadowColor"
+ android:color="#00000000" />
+ <Color
+ android:name="twelvekeysLayoutPressedFunctionKeyTopColor"
+ android:color="#1AFFFFFF" />
+ <Color
+ android:name="twelvekeysLayoutPressedFunctionKeyBottomColor"
+ android:color="#1AFFFFFF" />
+ <Color
+ android:name="twelvekeysLayoutPressedFunctionKeyHighlightColor"
+ android:color="#00000000" />
+ <Color
+ android:name="twelvekeysLayoutPressedFunctionKeyLightShadeColor"
+ android:color="#00000000" />
+ <Color
+ android:name="twelvekeysLayoutPressedFunctionKeyDarkShadeColor"
+ android:color="#00000000" />
+ <Color
+ android:name="twelvekeysLayoutPressedFunctionKeyShadowColor"
+ android:color="#00000000" />
+ <Color
+ android:name="qwertyLayoutReleasedKeyTopColor"
+ android:color="#FF263238" />
+ <Color
+ android:name="qwertyLayoutReleasedKeyBottomColor"
+ android:color="#FF263238" />
+ <Color
+ android:name="qwertyLayoutReleasedKeyHighlightColor"
+ android:color="#00000000" />
+ <Color
+ android:name="qwertyLayoutReleasedKeyShadowColor"
+ android:color="#00000000" />
+ <Color
+ android:name="qwertyLayoutPressedKeyTopColor"
+ android:color="#1AFFFFFF" />
+ <Color
+ android:name="qwertyLayoutPressedKeyBottomColor"
+ android:color="#1AFFFFFF" />
+ <Color
+ android:name="qwertyLayoutPressedKeyHighlightColor"
+ android:color="#00000000" />
+ <Color
+ android:name="qwertyLayoutPressedKeyShadowColor"
+ android:color="#00000000" />
+ <Color
+ android:name="qwertyLayoutReleasedFunctionKeyTopColor"
+ android:color="#FF263238" />
+ <Color
+ android:name="qwertyLayoutReleasedFunctionKeyBottomColor"
+ android:color="#FF263238" />
+ <Color
+ android:name="qwertyLayoutReleasedFunctionKeyHighlightColor"
+ android:color="#00000000" />
+ <Color
+ android:name="qwertyLayoutReleasedFunctionKeyShadowColor"
+ android:color="#00000000" />
+ <Color
+ android:name="qwertyLayoutPressedFunctionKeyTopColor"
+ android:color="#1AFFFFFF" />
+ <Color
+ android:name="qwertyLayoutPressedFunctionKeyBottomColor"
+ android:color="#1AFFFFFF" />
+ <Color
+ android:name="qwertyLayoutPressedFunctionKeyHighlightColor"
+ android:color="#00000000" />
+ <Color
+ android:name="qwertyLayoutPressedFunctionKeyShadowColor"
+ android:color="#00000000" />
+ <Color
+ android:name="qwertyLayoutReleasedSpaceKeyTopColor"
+ android:color="#1ACFD8DC" />
+ <Color
+ android:name="qwertyLayoutReleasedSpaceKeyBottomColor"
+ android:color="#1ACFD8DC" />
+ <Color
+ android:name="qwertyLayoutReleasedSpaceKeyHighlightColor"
+ android:color="#00000000" />
+ <Color
+ android:name="qwertyLayoutReleasedSpaceKeyShadowColor"
+ android:color="#00000000" />
+ <Color
+ android:name="qwertyLayoutPressedSpaceKeyTopColor"
+ android:color="#33CFD8DC" />
+ <Color
+ android:name="qwertyLayoutPressedSpaceKeyBottomColor"
+ android:color="#33CFD8DC" />
+ <Color
+ android:name="qwertyLayoutPressedSpaceKeyHighlightColor"
+ android:color="#00000000" />
+ <Color
+ android:name="qwertyLayoutPressedSpaceKeyShadowColor"
+ android:color="#00000000" />
+ <Color
+ android:name="flickBaseColor"
+ android:color="#FF80CBC4" />
+ <Color
+ android:name="flickShadeColor"
+ android:color="#FF80CBC4" />
+ <Color
+ android:name="popupFrameWindowTopColor"
+ android:color="#FF404C52" />
+ <Color
+ android:name="popupFrameWindowBottomColor"
+ android:color="#FF404C52" />
+ <Color
+ android:name="popupFrameWindowShadowColor"
+ android:color="#CC000000" />
+ <Color
+ android:name="candidateScrollBarTopColor"
+ android:color="#FF80CBC4" />
+ <Color
+ android:name="candidateScrollBarBottomColor"
+ android:color="#FF80CBC4" />
+ <Color
+ android:name="candidateBackgroundTopColor"
+ android:color="#FF21272B" />
+ <Color
+ android:name="candidateBackgroundBottomColor"
+ android:color="#FF21272B" />
+ <Color
+ android:name="candidateBackgroundHighlightColor"
+ android:color="#00000000" />
+ <Color
+ android:name="candidateBackgroundBorderColor"
+ android:color="#FF21272B" />
+ <Color
+ android:name="candidateBackgroundSeparatorColor"
+ android:color="#1AFFFFFF" />
+ <Color
+ android:name="candidateBackgroundFocusedTopColor"
+ android:color="#FF383D41" />
+ <Color
+ android:name="candidateBackgroundFocusedBottomColor"
+ android:color="#FF383D41" />
+ <Color
+ android:name="candidateBackgroundFocusedShadowColor"
+ android:color="#00000000" />
+ <Color
+ android:name="symbolReleasedFunctionKeyTopColor"
+ android:color="#00000000" />
+ <Color
+ android:name="symbolReleasedFunctionKeyBottomColor"
+ android:color="#00000000" />
+ <Color
+ android:name="symbolReleasedFunctionKeyHighlightColor"
+ android:color="#00000000" />
+ <Color
+ android:name="symbolReleasedFunctionKeyShadowColor"
+ android:color="#00000000" />
+ <Color
+ android:name="symbolPressedFunctionKeyTopColor"
+ android:color="#26FFFFFF" />
+ <Color
+ android:name="symbolPressedFunctionKeyBottomColor"
+ android:color="#26FFFFFF" />
+ <Color
+ android:name="symbolPressedFunctionKeyHighlightColor"
+ android:color="#00000000" />
+ <Color
+ android:name="symbolPressedFunctionKeyShadowColor"
+ android:color="#00000000" />
+ <Color
+ android:name="symbolScrollBarTopColor"
+ android:color="#FF80CBC4" />
+ <Color
+ android:name="symbolScrollBarBottomColor"
+ android:color="#FF80CBC4" />
+ <Color
+ android:name="symbolMinorCategoryTabSelectedColor"
+ android:color="#FF80CBC4" />
+ <Color
+ android:name="symbolMinorCategoryTabPressedColor"
+ android:color="#1AFFFFFF" />
+ <Color
+ android:name="symbolCandidateBackgroundTopColor"
+ android:color="#00000000" />
+ <Color
+ android:name="symbolCandidateBackgroundBottomColor"
+ android:color="#00000000" />
+ <Color
+ android:name="symbolCandidateBackgroundHighlightColor"
+ android:color="#00000000" />
+ <Color
+ android:name="symbolCandidateBackgroundBorderColor"
+ android:color="#00000000" />
+ <Color
+ android:name="symbolCandidateBackgroundSeparatorColor"
+ android:color="#00000000" />
+ <Color
+ android:name="symbolSeparatorColor"
+ android:color="#1AFFFFFF" />
+ <Color
+ android:name="threeDotsColor"
+ android:color="#00000000" />
+ <Color
+ android:name="keyIconMainColor"
+ android:color="#CCFFFFFF" />
+ <Color
+ android:name="keyIconGuideColor"
+ android:color="#99FFFFFF" />
+ <Color
+ android:name="keyIconGuideLightColor"
+ android:color="#66FFFFFF" />
+ <Color
+ android:name="keyIconMainHighlightColor"
+ android:color="#FFFFFFFF" />
+ <Color
+ android:name="keyIconGuideHighlightColor"
+ android:color="#FFFFFFFF" />
+ <Color
+ android:name="keyIconBoundColor"
+ android:color="#66FFFFFF" />
+ <Color
+ android:name="keyIconTwelvekeysFunctionColor"
+ android:color="#99FFFFFF" />
+ <Color
+ android:name="keyIconTwelvekeysGlobeColor"
+ android:color="#99FFFFFF" />
+ <Color
+ android:name="keyIconQwertyFunctionColor"
+ android:color="#99FFFFFF" />
+ <Color
+ android:name="keyIconFunctionDarkColor"
+ android:color="#33FFFFFF" />
+ <Color
+ android:name="keyIconEnterColor"
+ android:color="#FFFFFFFF" />
+ <Color
+ android:name="keyIconEnterCircleColor"
+ android:color="#FF80CBC4" />
+ <Color
+ android:name="keyIconQwertyShiftOnArrowColor"
+ android:color="#FF80CBC4" />
+ <Color
+ android:name="keyPopupHighlightColor"
+ android:color="#FF80CBC4" />
+ <Color
+ android:name="symbolMajorColor"
+ android:color="#4CFFFFFF" />
+ <Color
+ android:name="symbolMajorSelectedColor"
+ android:color="#CCFFFFFF" />
+ <Color
+ android:name="symbolMinorColor"
+ android:color="#4CFFFFFF" />
+ <Color
+ android:name="symbolMinorSelectedColor"
+ android:color="#CCFFFFFF" />
+ <Color
+ android:name="symbolMajorButtonTopColor"
+ android:color="#00000000" />
+ <Color
+ android:name="symbolMajorButtonBottomColor"
+ android:color="#00000000" />
+ <Color
+ android:name="symbolMajorButtonPressedTopColor"
+ android:color="#4CFFFFFF" />
+ <Color
+ android:name="symbolMajorButtonPressedBottomColor"
+ android:color="#4CFFFFFF" />
+ <Color
+ android:name="symbolMajorButtonSelectedTopColor"
+ android:color="#26FFFFFF" />
+ <Color
+ android:name="symbolMajorButtonSelectedBottomColor"
+ android:color="#26FFFFFF" />
+ <Color
+ android:name="symbolMajorButtonShadowColor"
+ android:color="#00000000" />
+ <Color
+ android:name="keyboardFoldingButtonBackgroundDefaultColor"
+ android:color="#00000000" />
+ <Color
+ android:name="keyboardFoldingButtonBackgroundScrolledColor"
+ android:color="#CC384248" />
+ <Color
+ android:name="candidateValueTextColor"
+ android:color="#B3FFFFFF" />
+ <Color
+ android:name="candidateValueFocusedTextColor"
+ android:color="#FFFFFFFF" />
+ <Color
+ android:name="candidateDescriptionTextColor"
+ android:color="#66FFFFFF" />
+ <Color
+ android:name="buttonFrameButtonPressedColor"
+ android:color="#1AFFFFFF" />
+
+ <Dimension
+ android:name="twelvekeysLeftOffsetDimension"
+ mozc:dimension="0dip" />
+ <Dimension
+ android:name="twelvekeysTopOffsetDimension"
+ mozc:dimension="0dip" />
+ <Dimension
+ android:name="twelvekeysRightOffsetDimension"
+ mozc:dimension="0dip" />
+ <Dimension
+ android:name="twelvekeysBottomOffsetDimension"
+ mozc:dimension="0dip" />
+ <Dimension
+ android:name="qwertyLeftOffsetDimension"
+ mozc:dimension="0dip" />
+ <Dimension
+ android:name="qwertyTopOffsetDimension"
+ mozc:dimension="0dip" />
+ <Dimension
+ android:name="qwertyRightOffsetDimension"
+ mozc:dimension="0dip" />
+ <Dimension
+ android:name="qwertyBottomOffsetDimension"
+ mozc:dimension="0dip" />
+ <Dimension
+ android:name="qwertyRoundRadiusDimension"
+ mozc:dimension="2dip" />
+ <Dimension
+ android:name="qwertySpaceKeyHeightDimension"
+ mozc:dimension="24dip" />
+ <Dimension
+ android:name="qwertySpaceKeyHorizontalOffsetDimension"
+ mozc:dimension="5dip" />
+ <Dimension
+ android:name="qwertySpaceKeyRoundRadiusDimension"
+ mozc:dimension="4dip" />
+ <Dimension
+ android:name="symbolMajorButtonRoundDimension"
+ mozc:dimension="0dip" />
+ <Dimension
+ android:name="symbolMajorButtonPaddingDimension"
+ mozc:dimension="0dip" />
+ <Dimension
+ android:name="symbolMinorIndicatorHeightDimension"
+ mozc:dimension="2dip" />
+
+ <Drawable android:name="buttonFrameBackgroundDrawable" >
+ <color android:color="#FF21272B" />
+ </Drawable>
+ <Drawable android:name="narrowFrameBackgroundDrawable" >
+ <color android:color="#FF21272B" />
+ </Drawable>
+ <Drawable android:name="keyboardFrameSeparatorBackgroundDrawable" >
+ <color android:color="#0CFFFFFF" />
+ </Drawable>
+ <Drawable android:name="symbolSeparatorAboveMajorCategoryBackgroundDrawable" >
+ <color android:color="#CC21272B" />
+ </Drawable>
+ <Drawable android:name="windowBackgroundDrawable" >
+ <color android:color="#FF263238" />
+ </Drawable>
+ <Drawable android:name="conversionCandidateViewBackgroundDrawable" >
+ <color android:color="#FF21272B" />
+ </Drawable>
+ <Drawable android:name="symbolCandidateViewBackgroundDrawable" >
+ <color android:color="#FF263238" />
+ </Drawable>
+ <Drawable android:name="symbolMajorCategoryBackgroundDrawable" >
+ <color android:color="#FF263238" />
+ </Drawable>
+ <Drawable android:name="scrollBarBackgroundDrawable" >
+ <color android:color="#FF21272B" />
+ </Drawable>
+</Skin>
diff --git a/src/android/static_resources/resources_oss/res/xml/skin_material_design_light.xml b/src/android/static_resources/resources_oss/res/xml/skin_material_design_light.xml
new file mode 100644
index 0000000..2b5ffd6
--- /dev/null
+++ b/src/android/static_resources/resources_oss/res/xml/skin_material_design_light.xml
@@ -0,0 +1,451 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<Skin xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:mozc="http://schemas.android.com/apk/res-auto" >
+
+ <Color
+ android:name="keyboardSeparatorColor"
+ android:color="#FFD1D6D9" />
+ <Color
+ android:name="twelvekeysLayoutReleasedKeyTopColor"
+ android:color="#FFECEFF1" />
+ <Color
+ android:name="twelvekeysLayoutReleasedKeyBottomColor"
+ android:color="#FFECEFF1" />
+ <Color
+ android:name="twelvekeysLayoutReleasedKeyHighlightColor"
+ android:color="#00000000" />
+ <Color
+ android:name="twelvekeysLayoutReleasedKeyLightShadeColor"
+ android:color="#00000000" />
+ <Color
+ android:name="twelvekeysLayoutReleasedKeyDarkShadeColor"
+ android:color="#00000000" />
+ <Color
+ android:name="twelvekeysLayoutReleasedKeyShadowColor"
+ android:color="#FFECEFF1" />
+ <Color
+ android:name="twelvekeysLayoutPressedKeyTopColor"
+ android:color="#2637474F" />
+ <Color
+ android:name="twelvekeysLayoutPressedKeyBottomColor"
+ android:color="#2637474F" />
+ <Color
+ android:name="twelvekeysLayoutPressedKeyHighlightColor"
+ android:color="#00000000" />
+ <Color
+ android:name="twelvekeysLayoutPressedKeyLightShadeColor"
+ android:color="#00000000" />
+ <Color
+ android:name="twelvekeysLayoutPressedKeyDarkShadeColor"
+ android:color="#00000000" />
+ <Color
+ android:name="twelvekeysLayoutPressedKeyShadowColor"
+ android:color="#00000000" />
+ <Color
+ android:name="twelvekeysLayoutReleasedFunctionKeyTopColor"
+ android:color="#FFECEFF1" />
+ <Color
+ android:name="twelvekeysLayoutReleasedFunctionKeyBottomColor"
+ android:color="#FFECEFF1" />
+ <Color
+ android:name="twelvekeysLayoutReleasedFunctionKeyHighlightColor"
+ android:color="#00000000" />
+ <Color
+ android:name="twelvekeysLayoutReleasedFunctionKeyLightShadeColor"
+ android:color="#00000000" />
+ <Color
+ android:name="twelvekeysLayoutReleasedFunctionKeyDarkShadeColor"
+ android:color="#00000000" />
+ <Color
+ android:name="twelvekeysLayoutReleasedFunctionKeyShadowColor"
+ android:color="#00000000" />
+ <Color
+ android:name="twelvekeysLayoutPressedFunctionKeyTopColor"
+ android:color="#2637474F" />
+ <Color
+ android:name="twelvekeysLayoutPressedFunctionKeyBottomColor"
+ android:color="#2637474F" />
+ <Color
+ android:name="twelvekeysLayoutPressedFunctionKeyHighlightColor"
+ android:color="#00000000" />
+ <Color
+ android:name="twelvekeysLayoutPressedFunctionKeyLightShadeColor"
+ android:color="#00000000" />
+ <Color
+ android:name="twelvekeysLayoutPressedFunctionKeyDarkShadeColor"
+ android:color="#00000000" />
+ <Color
+ android:name="twelvekeysLayoutPressedFunctionKeyShadowColor"
+ android:color="#00000000" />
+ <Color
+ android:name="qwertyLayoutReleasedKeyTopColor"
+ android:color="#FFECEFF1" />
+ <Color
+ android:name="qwertyLayoutReleasedKeyBottomColor"
+ android:color="#FFECEFF1" />
+ <Color
+ android:name="qwertyLayoutReleasedKeyHighlightColor"
+ android:color="#00000000" />
+ <Color
+ android:name="qwertyLayoutReleasedKeyShadowColor"
+ android:color="#00000000" />
+ <Color
+ android:name="qwertyLayoutPressedKeyTopColor"
+ android:color="#2637474F" />
+ <Color
+ android:name="qwertyLayoutPressedKeyBottomColor"
+ android:color="#2637474F" />
+ <Color
+ android:name="qwertyLayoutPressedKeyHighlightColor"
+ android:color="#00000000" />
+ <Color
+ android:name="qwertyLayoutPressedKeyShadowColor"
+ android:color="#00000000" />
+ <Color
+ android:name="qwertyLayoutReleasedFunctionKeyTopColor"
+ android:color="#FFECEFF1" />
+ <Color
+ android:name="qwertyLayoutReleasedFunctionKeyBottomColor"
+ android:color="#FFECEFF1" />
+ <Color
+ android:name="qwertyLayoutReleasedFunctionKeyHighlightColor"
+ android:color="#00000000" />
+ <Color
+ android:name="qwertyLayoutReleasedFunctionKeyShadowColor"
+ android:color="#00000000" />
+ <Color
+ android:name="qwertyLayoutPressedFunctionKeyTopColor"
+ android:color="#2637474F" />
+ <Color
+ android:name="qwertyLayoutPressedFunctionKeyBottomColor"
+ android:color="#2637474F" />
+ <Color
+ android:name="qwertyLayoutPressedFunctionKeyHighlightColor"
+ android:color="#00000000" />
+ <Color
+ android:name="qwertyLayoutPressedFunctionKeyShadowColor"
+ android:color="#00000000" />
+ <Color
+ android:name="qwertyLayoutReleasedSpaceKeyTopColor"
+ android:color="#2637474F" />
+ <Color
+ android:name="qwertyLayoutReleasedSpaceKeyBottomColor"
+ android:color="#2637474F" />
+ <Color
+ android:name="qwertyLayoutReleasedSpaceKeyHighlightColor"
+ android:color="#00000000" />
+ <Color
+ android:name="qwertyLayoutReleasedSpaceKeyShadowColor"
+ android:color="#00000000" />
+ <Color
+ android:name="qwertyLayoutPressedSpaceKeyTopColor"
+ android:color="#4D37474F" />
+ <Color
+ android:name="qwertyLayoutPressedSpaceKeyBottomColor"
+ android:color="#4D37474F" />
+ <Color
+ android:name="qwertyLayoutPressedSpaceKeyHighlightColor"
+ android:color="#00000000" />
+ <Color
+ android:name="qwertyLayoutPressedSpaceKeyShadowColor"
+ android:color="#00000000" />
+ <Color
+ android:name="flickBaseColor"
+ android:color="#FF4DB6AC" />
+ <Color
+ android:name="flickShadeColor"
+ android:color="#FF4DB6AC" />
+ <Color
+ android:name="popupFrameWindowTopColor"
+ android:color="#FFD0D6D9" />
+ <Color
+ android:name="popupFrameWindowBottomColor"
+ android:color="#FFD0D6D9" />
+ <Color
+ android:name="popupFrameWindowShadowColor"
+ android:color="#66000000" />
+ <Color
+ android:name="candidateScrollBarTopColor"
+ android:color="#FF4DB6AC" />
+ <Color
+ android:name="candidateScrollBarBottomColor"
+ android:color="#FF4DB6AC" />
+ <Color
+ android:name="candidateBackgroundTopColor"
+ android:color="#FFE4E7E9" />
+ <Color
+ android:name="candidateBackgroundBottomColor"
+ android:color="#FFE4E7E9" />
+ <Color
+ android:name="candidateBackgroundHighlightColor"
+ android:color="#00000000" />
+ <Color
+ android:name="candidateBackgroundBorderColor"
+ android:color="#FFE4E7E9" />
+ <Color
+ android:name="candidateBackgroundSeparatorColor"
+ android:color="#FFD1D6D9" />
+ <Color
+ android:name="candidateBackgroundFocusedTopColor"
+ android:color="#FFD3D7DA" />
+ <Color
+ android:name="candidateBackgroundFocusedBottomColor"
+ android:color="#FFD3D7DA" />
+ <Color
+ android:name="candidateBackgroundFocusedShadowColor"
+ android:color="#00000000" />
+ <Color
+ android:name="symbolReleasedFunctionKeyTopColor"
+ android:color="#00000000" />
+ <Color
+ android:name="symbolReleasedFunctionKeyBottomColor"
+ android:color="#00000000" />
+ <Color
+ android:name="symbolReleasedFunctionKeyHighlightColor"
+ android:color="#00000000" />
+ <Color
+ android:name="symbolReleasedFunctionKeyShadowColor"
+ android:color="#00000000" />
+ <Color
+ android:name="symbolPressedFunctionKeyTopColor"
+ android:color="#2637474F" />
+ <Color
+ android:name="symbolPressedFunctionKeyBottomColor"
+ android:color="#2637474F" />
+ <Color
+ android:name="symbolPressedFunctionKeyHighlightColor"
+ android:color="#00000000" />
+ <Color
+ android:name="symbolPressedFunctionKeyShadowColor"
+ android:color="#00000000" />
+ <Color
+ android:name="symbolScrollBarTopColor"
+ android:color="#FF4DB6AC" />
+ <Color
+ android:name="symbolScrollBarBottomColor"
+ android:color="#FF4DB6AC" />
+ <Color
+ android:name="symbolMinorCategoryTabSelectedColor"
+ android:color="#FF4DB6AC" />
+ <Color
+ android:name="symbolMinorCategoryTabPressedColor"
+ android:color="#2637474F" />
+ <Color
+ android:name="symbolCandidateBackgroundTopColor"
+ android:color="#00000000" />
+ <Color
+ android:name="symbolCandidateBackgroundBottomColor"
+ android:color="#00000000" />
+ <Color
+ android:name="symbolCandidateBackgroundHighlightColor"
+ android:color="#00000000" />
+ <Color
+ android:name="symbolCandidateBackgroundBorderColor"
+ android:color="#00000000" />
+ <Color
+ android:name="symbolCandidateBackgroundSeparatorColor"
+ android:color="#00000000" />
+ <Color
+ android:name="symbolSeparatorColor"
+ android:color="#FFD1D6D9" />
+ <Color
+ android:name="threeDotsColor"
+ android:color="#00000000" />
+ <Color
+ android:name="keyIconMainColor"
+ android:color="#FF37474F" />
+ <Color
+ android:name="keyIconGuideColor"
+ android:color="#CC37474F" />
+ <Color
+ android:name="keyIconGuideLightColor"
+ android:color="#6637474F" />
+ <Color
+ android:name="keyIconMainHighlightColor"
+ android:color="#FF37474F" />
+ <Color
+ android:name="keyIconGuideHighlightColor"
+ android:color="#FF37474F" />
+ <Color
+ android:name="keyIconBoundColor"
+ android:color="#6637474F" />
+ <Color
+ android:name="keyIconTwelvekeysFunctionColor"
+ android:color="#9937474F" />
+ <Color
+ android:name="keyIconTwelvekeysGlobeColor"
+ android:color="#9937474F" />
+ <Color
+ android:name="keyIconQwertyFunctionColor"
+ android:color="#9937474F" />
+ <Color
+ android:name="keyIconFunctionDarkColor"
+ android:color="#3337474F" />
+ <Color
+ android:name="keyIconEnterColor"
+ android:color="#FFFFFFFF" />
+ <Color
+ android:name="keyIconEnterCircleColor"
+ android:color="#FF4DB6AC" />
+ <Color
+ android:name="keyIconQwertyShiftOnArrowColor"
+ android:color="#FF4DB6AC" />
+ <Color
+ android:name="keyPopupHighlightColor"
+ android:color="#FF4DB6AC" />
+ <Color
+ android:name="symbolMajorColor"
+ android:color="#8037474F" />
+ <Color
+ android:name="symbolMajorSelectedColor"
+ android:color="#FF37474F" />
+ <Color
+ android:name="symbolMinorColor"
+ android:color="#8037474F" />
+ <Color
+ android:name="symbolMinorSelectedColor"
+ android:color="#FF37474F" />
+ <Color
+ android:name="symbolMajorButtonTopColor"
+ android:color="#00000000" />
+ <Color
+ android:name="symbolMajorButtonBottomColor"
+ android:color="#00000000" />
+ <Color
+ android:name="symbolMajorButtonPressedTopColor"
+ android:color="#4C37474F" />
+ <Color
+ android:name="symbolMajorButtonPressedBottomColor"
+ android:color="#4C37474F" />
+ <Color
+ android:name="symbolMajorButtonSelectedTopColor"
+ android:color="#2637474F" />
+ <Color
+ android:name="symbolMajorButtonSelectedBottomColor"
+ android:color="#2637474F" />
+ <Color
+ android:name="symbolMajorButtonShadowColor"
+ android:color="#00000000" />
+ <Color
+ android:name="keyboardFoldingButtonBackgroundDefaultColor"
+ android:color="#00000000" />
+ <Color
+ android:name="keyboardFoldingButtonBackgroundScrolledColor"
+ android:color="#CCFFFFFF" />
+ <Color
+ android:name="candidateValueTextColor"
+ android:color="#CC37474F" />
+ <Color
+ android:name="candidateValueFocusedTextColor"
+ android:color="#FF000000" />
+ <Color
+ android:name="candidateDescriptionTextColor"
+ android:color="#6637474F" />
+ <Color
+ android:name="buttonFrameButtonPressedColor"
+ android:color="#2637474F" />
+
+ <Dimension
+ android:name="twelvekeysLeftOffsetDimension"
+ mozc:dimension="0dip" />
+ <Dimension
+ android:name="twelvekeysTopOffsetDimension"
+ mozc:dimension="0dip" />
+ <Dimension
+ android:name="twelvekeysRightOffsetDimension"
+ mozc:dimension="0dip" />
+ <Dimension
+ android:name="twelvekeysBottomOffsetDimension"
+ mozc:dimension="0dip" />
+ <Dimension
+ android:name="qwertyLeftOffsetDimension"
+ mozc:dimension="0dip" />
+ <Dimension
+ android:name="qwertyTopOffsetDimension"
+ mozc:dimension="0dip" />
+ <Dimension
+ android:name="qwertyRightOffsetDimension"
+ mozc:dimension="0dip" />
+ <Dimension
+ android:name="qwertyBottomOffsetDimension"
+ mozc:dimension="0dip" />
+ <Dimension
+ android:name="qwertyRoundRadiusDimension"
+ mozc:dimension="2dip" />
+ <Dimension
+ android:name="qwertySpaceKeyHeightDimension"
+ mozc:dimension="24dip" />
+ <Dimension
+ android:name="qwertySpaceKeyHorizontalOffsetDimension"
+ mozc:dimension="5dip" />
+ <Dimension
+ android:name="qwertySpaceKeyRoundRadiusDimension"
+ mozc:dimension="4dip" />
+ <Dimension
+ android:name="symbolMajorButtonRoundDimension"
+ mozc:dimension="0dip" />
+ <Dimension
+ android:name="symbolMajorButtonPaddingDimension"
+ mozc:dimension="0dip" />
+ <Dimension
+ android:name="symbolMinorIndicatorHeightDimension"
+ mozc:dimension="2dip" />
+
+ <Drawable android:name="buttonFrameBackgroundDrawable" >
+ <color android:color="#FFE4E7E9" />
+ </Drawable>
+ <Drawable android:name="narrowFrameBackgroundDrawable" >
+ <color android:color="#FFE4E7E9" />
+ </Drawable>
+ <Drawable android:name="keyboardFrameSeparatorBackgroundDrawable" >
+ <color android:color="#99FFFFFF" />
+ </Drawable>
+ <Drawable android:name="symbolSeparatorAboveMajorCategoryBackgroundDrawable" >
+ <color android:color="#1A37474F" />
+ </Drawable>
+ <Drawable android:name="windowBackgroundDrawable" >
+ <color android:color="#FFECEFF1" />
+ </Drawable>
+ <Drawable android:name="conversionCandidateViewBackgroundDrawable" >
+ <color android:color="#FFE4E7E9" />
+ </Drawable>
+ <Drawable android:name="symbolCandidateViewBackgroundDrawable" >
+ <color android:color="#FFECEFF1" />
+ </Drawable>
+ <Drawable android:name="symbolMajorCategoryBackgroundDrawable" >
+ <color android:color="#FFECEFF1" />
+ </Drawable>
+ <Drawable android:name="scrollBarBackgroundDrawable" >
+ <color android:color="#FFE4E7E9" />
+ </Drawable>
+</Skin>
diff --git a/src/android/static_resources/resources_oss/res/xml/skin_orange_lightgray.xml b/src/android/static_resources/resources_oss/res/xml/skin_orange_lightgray.xml
new file mode 100644
index 0000000..35a5523
--- /dev/null
+++ b/src/android/static_resources/resources_oss/res/xml/skin_orange_lightgray.xml
@@ -0,0 +1,461 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<Skin xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:mozc="http://schemas.android.com/apk/res-auto" >
+
+ <Color
+ android:name="keyboardSeparatorColor"
+ android:color="#00000000" />
+ <Color
+ android:name="twelvekeysLayoutReleasedKeyTopColor"
+ android:color="#FFF5F5F5" />
+ <Color
+ android:name="twelvekeysLayoutReleasedKeyBottomColor"
+ android:color="#FFD2D2D2" />
+ <Color
+ android:name="twelvekeysLayoutReleasedKeyHighlightColor"
+ android:color="#FFFAFAFA" />
+ <Color
+ android:name="twelvekeysLayoutReleasedKeyLightShadeColor"
+ android:color="#FFAFAFAF" />
+ <Color
+ android:name="twelvekeysLayoutReleasedKeyDarkShadeColor"
+ android:color="#FF909090" />
+ <Color
+ android:name="twelvekeysLayoutReleasedKeyShadowColor"
+ android:color="#FF1E1E1E" />
+ <Color
+ android:name="twelvekeysLayoutPressedKeyTopColor"
+ android:color="#FFAAAAAA" />
+ <Color
+ android:name="twelvekeysLayoutPressedKeyBottomColor"
+ android:color="#FF828282" />
+ <Color
+ android:name="twelvekeysLayoutPressedKeyHighlightColor"
+ android:color="#00000000" />
+ <Color
+ android:name="twelvekeysLayoutPressedKeyLightShadeColor"
+ android:color="#00000000" />
+ <Color
+ android:name="twelvekeysLayoutPressedKeyDarkShadeColor"
+ android:color="#00000000" />
+ <Color
+ android:name="twelvekeysLayoutPressedKeyShadowColor"
+ android:color="#00000000" />
+ <Color
+ android:name="twelvekeysLayoutReleasedFunctionKeyTopColor"
+ android:color="#FF858087" />
+ <Color
+ android:name="twelvekeysLayoutReleasedFunctionKeyBottomColor"
+ android:color="#FF67645F" />
+ <Color
+ android:name="twelvekeysLayoutReleasedFunctionKeyHighlightColor"
+ android:color="#FF898588" />
+ <Color
+ android:name="twelvekeysLayoutReleasedFunctionKeyLightShadeColor"
+ android:color="#FF5C5759" />
+ <Color
+ android:name="twelvekeysLayoutReleasedFunctionKeyDarkShadeColor"
+ android:color="#FF555555" />
+ <Color
+ android:name="twelvekeysLayoutReleasedFunctionKeyShadowColor"
+ android:color="#FF1E1E1E" />
+ <Color
+ android:name="twelvekeysLayoutPressedFunctionKeyTopColor"
+ android:color="#FFBFBFBD" />
+ <Color
+ android:name="twelvekeysLayoutPressedFunctionKeyBottomColor"
+ android:color="#FFF7F5EC" />
+ <Color
+ android:name="twelvekeysLayoutPressedFunctionKeyHighlightColor"
+ android:color="#00000000" />
+ <Color
+ android:name="twelvekeysLayoutPressedFunctionKeyLightShadeColor"
+ android:color="#00000000" />
+ <Color
+ android:name="twelvekeysLayoutPressedFunctionKeyDarkShadeColor"
+ android:color="#00000000" />
+ <Color
+ android:name="twelvekeysLayoutPressedFunctionKeyShadowColor"
+ android:color="#00000000" />
+ <Color
+ android:name="qwertyLayoutReleasedKeyTopColor"
+ android:color="#FFF5F5F5" />
+ <Color
+ android:name="qwertyLayoutReleasedKeyBottomColor"
+ android:color="#FFD2D2D2" />
+ <Color
+ android:name="qwertyLayoutReleasedKeyHighlightColor"
+ android:color="#00000000" />
+ <Color
+ android:name="qwertyLayoutReleasedKeyShadowColor"
+ android:color="#FF1E1E1E" />
+ <Color
+ android:name="qwertyLayoutPressedKeyTopColor"
+ android:color="#FFCCCCCC" />
+ <Color
+ android:name="qwertyLayoutPressedKeyBottomColor"
+ android:color="#FF797979" />
+ <Color
+ android:name="qwertyLayoutPressedKeyHighlightColor"
+ android:color="#00000000" />
+ <Color
+ android:name="qwertyLayoutPressedKeyShadowColor"
+ android:color="#FF1E1E1E" />
+ <Color
+ android:name="qwertyLayoutReleasedFunctionKeyTopColor"
+ android:color="#FF858087" />
+ <Color
+ android:name="qwertyLayoutReleasedFunctionKeyBottomColor"
+ android:color="#FF67645F" />
+ <Color
+ android:name="qwertyLayoutReleasedFunctionKeyHighlightColor"
+ android:color="#00000000" />
+ <Color
+ android:name="qwertyLayoutReleasedFunctionKeyShadowColor"
+ android:color="#FF1E1E1E" />
+ <Color
+ android:name="qwertyLayoutPressedFunctionKeyTopColor"
+ android:color="#FFE9E4E4" />
+ <Color
+ android:name="qwertyLayoutPressedFunctionKeyBottomColor"
+ android:color="#FFB2ADAD" />
+ <Color
+ android:name="qwertyLayoutPressedFunctionKeyHighlightColor"
+ android:color="#00000000" />
+ <Color
+ android:name="qwertyLayoutPressedFunctionKeyShadowColor"
+ android:color="#FF1E1E1E" />
+ <Color
+ android:name="qwertyLayoutReleasedSpaceKeyTopColor"
+ android:color="#FF858087" />
+ <Color
+ android:name="qwertyLayoutReleasedSpaceKeyBottomColor"
+ android:color="#FF67645F" />
+ <Color
+ android:name="qwertyLayoutReleasedSpaceKeyHighlightColor"
+ android:color="#00000000" />
+ <Color
+ android:name="qwertyLayoutReleasedSpaceKeyShadowColor"
+ android:color="#FF1E1E1E" />
+ <Color
+ android:name="qwertyLayoutPressedSpaceKeyTopColor"
+ android:color="#FFE9E4E4" />
+ <Color
+ android:name="qwertyLayoutPressedSpaceKeyBottomColor"
+ android:color="#FFB2ADAD" />
+ <Color
+ android:name="qwertyLayoutPressedSpaceKeyHighlightColor"
+ android:color="#00000000" />
+ <Color
+ android:name="qwertyLayoutPressedSpaceKeyShadowColor"
+ android:color="#FF1E1E1E" />
+ <Color
+ android:name="flickBaseColor"
+ android:color="#FFFF9A28" />
+ <Color
+ android:name="flickShadeColor"
+ android:color="#FFC0741e" />
+ <Color
+ android:name="popupFrameWindowTopColor"
+ android:color="#FFFBFBFB" />
+ <Color
+ android:name="popupFrameWindowBottomColor"
+ android:color="#FFEAEAEA" />
+ <Color
+ android:name="popupFrameWindowShadowColor"
+ android:color="#FF1E1E1E" />
+ <Color
+ android:name="candidateScrollBarTopColor"
+ android:color="#FFFFE39D" />
+ <Color
+ android:name="candidateScrollBarBottomColor"
+ android:color="#FFFFCC33" />
+ <Color
+ android:name="candidateBackgroundTopColor"
+ android:color="#FFE8E8E8" />
+ <Color
+ android:name="candidateBackgroundBottomColor"
+ android:color="#FFDCDCDC" />
+ <Color
+ android:name="candidateBackgroundHighlightColor"
+ android:color="#FFFFFFFF" />
+ <Color
+ android:name="candidateBackgroundBorderColor"
+ android:color="#FF8C8C8C" />
+ <Color
+ android:name="candidateBackgroundSeparatorColor"
+ android:color="#00000000" />
+ <Color
+ android:name="candidateBackgroundFocusedTopColor"
+ android:color="#FFFFC142" />
+ <Color
+ android:name="candidateBackgroundFocusedBottomColor"
+ android:color="#FFFFe096" />
+ <Color
+ android:name="candidateBackgroundFocusedShadowColor"
+ android:color="#40000000" />
+ <Color
+ android:name="symbolReleasedFunctionKeyTopColor"
+ android:color="#FF858087" />
+ <Color
+ android:name="symbolReleasedFunctionKeyBottomColor"
+ android:color="#FF67645F" />
+ <Color
+ android:name="symbolReleasedFunctionKeyHighlightColor"
+ android:color="#00000000" />
+ <Color
+ android:name="symbolReleasedFunctionKeyShadowColor"
+ android:color="#FF1E1E1E" />
+ <Color
+ android:name="symbolPressedFunctionKeyTopColor"
+ android:color="#FFE9E4E4" />
+ <Color
+ android:name="symbolPressedFunctionKeyBottomColor"
+ android:color="#FFB2ADAD" />
+ <Color
+ android:name="symbolPressedFunctionKeyHighlightColor"
+ android:color="#00000000" />
+ <Color
+ android:name="symbolPressedFunctionKeyShadowColor"
+ android:color="#FF1E1E1E" />
+ <Color
+ android:name="symbolScrollBarTopColor"
+ android:color="#FFFFCC00" />
+ <Color
+ android:name="symbolScrollBarBottomColor"
+ android:color="#FFFF9C00" />
+ <Color
+ android:name="symbolMinorCategoryTabSelectedColor"
+ android:color="#FFFF9200" />
+ <Color
+ android:name="symbolMinorCategoryTabPressedColor"
+ android:color="#80FF9200" />
+ <Color
+ android:name="symbolCandidateBackgroundTopColor"
+ android:color="#FFFEFEFE" />
+ <Color
+ android:name="symbolCandidateBackgroundBottomColor"
+ android:color="#FFECECEC" />
+ <Color
+ android:name="symbolCandidateBackgroundHighlightColor"
+ android:color="#FFFFFFFF" />
+ <Color
+ android:name="symbolCandidateBackgroundBorderColor"
+ android:color="#7C666666" />
+ <Color
+ android:name="symbolCandidateBackgroundSeparatorColor"
+ android:color="#00000000" />
+ <Color
+ android:name="symbolSeparatorColor"
+ android:color="#00000000" />
+ <Color
+ android:name="threeDotsColor"
+ android:color="#FFDDDDDD" />
+ <Color
+ android:name="keyIconMainColor"
+ android:color="#FF272727" />
+ <Color
+ android:name="keyIconGuideColor"
+ android:color="#FF333333" />
+ <Color
+ android:name="keyIconGuideLightColor"
+ android:color="#FF999999" />
+ <Color
+ android:name="keyIconMainHighlightColor"
+ android:color="#FFFFFFFF" />
+ <Color
+ android:name="keyIconGuideHighlightColor"
+ android:color="#FFFFFFFF" />
+ <Color
+ android:name="keyIconBoundColor"
+ android:color="#FF999999" />
+ <Color
+ android:name="keyIconTwelvekeysFunctionColor"
+ android:color="#FFDDDDDD" />
+ <Color
+ android:name="keyIconTwelvekeysGlobeColor"
+ android:color="#99272727" />
+ <Color
+ android:name="keyIconQwertyFunctionColor"
+ android:color="#FFDDDDDD" />
+ <Color
+ android:name="keyIconFunctionDarkColor"
+ android:color="#FF272727" />
+ <Color
+ android:name="keyIconEnterColor"
+ android:color="#FFDDDDDD" />
+ <Color
+ android:name="keyIconEnterCircleColor"
+ android:color="#00000000" />
+ <Color
+ android:name="keyIconQwertyShiftOnArrowColor"
+ android:color="#FFFFB005" />
+ <Color
+ android:name="keyPopupHighlightColor"
+ android:color="#FFF7982d" />
+ <Color
+ android:name="symbolMajorColor"
+ android:color="#FF333333" />
+ <Color
+ android:name="symbolMajorSelectedColor"
+ android:color="#FFFFFFFF" />
+ <Color
+ android:name="symbolMinorColor"
+ android:color="#FFFFFFFF" />
+ <Color
+ android:name="symbolMinorSelectedColor"
+ android:color="#FFFFFFFF" />
+ <Color
+ android:name="symbolMajorButtonTopColor"
+ android:color="#FFF5F5F5" />
+ <Color
+ android:name="symbolMajorButtonBottomColor"
+ android:color="#FFD2D2D2" />
+ <Color
+ android:name="symbolMajorButtonPressedTopColor"
+ android:color="#FF959595" />
+ <Color
+ android:name="symbolMajorButtonPressedBottomColor"
+ android:color="#FF727272" />
+ <Color
+ android:name="symbolMajorButtonSelectedTopColor"
+ android:color="#FFAAAAAA" />
+ <Color
+ android:name="symbolMajorButtonSelectedBottomColor"
+ android:color="#FF828282" />
+ <Color
+ android:name="symbolMajorButtonShadowColor"
+ android:color="#57000000" />
+ <Color
+ android:name="keyboardFoldingButtonBackgroundDefaultColor"
+ android:color="#8C676767" />
+ <Color
+ android:name="keyboardFoldingButtonBackgroundScrolledColor"
+ android:color="#8C676767" />
+ <Color
+ android:name="candidateValueTextColor"
+ android:color="#FF000000" />
+ <Color
+ android:name="candidateValueFocusedTextColor"
+ android:color="#FF000000" />
+ <Color
+ android:name="candidateDescriptionTextColor"
+ android:color="#FF888888" />
+ <Color
+ android:name="buttonFrameButtonPressedColor"
+ android:color="#80FF9200" />
+
+ <Dimension
+ android:name="twelvekeysLeftOffsetDimension"
+ mozc:dimension="0.5dip" />
+ <Dimension
+ android:name="twelvekeysTopOffsetDimension"
+ mozc:dimension="1dip" />
+ <Dimension
+ android:name="twelvekeysRightOffsetDimension"
+ mozc:dimension="1dip" />
+ <Dimension
+ android:name="twelvekeysBottomOffsetDimension"
+ mozc:dimension="0dip" />
+ <Dimension
+ android:name="qwertyLeftOffsetDimension"
+ mozc:dimension="2dip" />
+ <Dimension
+ android:name="qwertyTopOffsetDimension"
+ mozc:dimension="1dip" />
+ <Dimension
+ android:name="qwertyRightOffsetDimension"
+ mozc:dimension="2dip" />
+ <Dimension
+ android:name="qwertyBottomOffsetDimension"
+ mozc:dimension="3dip" />
+ <Dimension
+ android:name="qwertyRoundRadiusDimension"
+ mozc:dimension="2dip" />
+ <Dimension
+ android:name="qwertySpaceKeyHeightDimension"
+ mozc:dimension="0dip" />
+ <Dimension
+ android:name="qwertySpaceKeyHorizontalOffsetDimension"
+ mozc:dimension="2dip" />
+ <Dimension
+ android:name="qwertySpaceKeyRoundRadiusDimension"
+ mozc:dimension="2dip" />
+ <Dimension
+ android:name="symbolMajorButtonRoundDimension"
+ mozc:dimension="3.5dip" />
+ <Dimension
+ android:name="symbolMajorButtonPaddingDimension"
+ mozc:dimension="2dip" />
+ <Dimension
+ android:name="symbolMinorIndicatorHeightDimension"
+ mozc:dimension="5dip" />
+
+ <Drawable android:name="buttonFrameBackgroundDrawable" >
+ <bitmap
+ android:src="@drawable/window__background_dark"
+ android:tileMode="repeat" />
+ </Drawable>
+ <Drawable android:name="narrowFrameBackgroundDrawable" >
+ <color android:color="#524C51" />
+ </Drawable>
+ <Drawable android:name="keyboardFrameSeparatorBackgroundDrawable" >
+ <color android:color="#19FFFFFF" />
+ </Drawable>
+ <Drawable android:name="symbolSeparatorAboveMajorCategoryBackgroundDrawable" >
+ <bitmap
+ android:src="@drawable/window__background"
+ android:tileMode="repeat" />
+ </Drawable>
+ <Drawable android:name="windowBackgroundDrawable" >
+ <bitmap
+ android:src="@drawable/window__background"
+ android:tileMode="repeat" />
+ </Drawable>
+ <Drawable android:name="conversionCandidateViewBackgroundDrawable" >
+ <color android:color="#FFE5E5E5" />
+ </Drawable>
+ <Drawable android:name="symbolCandidateViewBackgroundDrawable" >
+ <color android:color="#FFE5E5E5" />
+ </Drawable>
+ <Drawable android:name="symbolMajorCategoryBackgroundDrawable" >
+ <bitmap
+ android:src="@drawable/window__background"
+ android:tileMode="repeat" />
+ </Drawable>
+ <Drawable android:name="scrollBarBackgroundDrawable" >
+ <bitmap
+ android:src="@drawable/candidate__slidebar_background"
+ android:tileMode="repeat" />
+ </Drawable>
+</Skin>
diff --git a/src/android/tests/AndroidManifest_template.xml b/src/android/tests/AndroidManifest_template.xml
index a5e92d1..7f3acc6 100644
--- a/src/android/tests/AndroidManifest_template.xml
+++ b/src/android/tests/AndroidManifest_template.xml
@@ -57,7 +57,7 @@
android:targetPackage="@ANDROID_APPLICATION_ID@"
android:label="Tests for org.mozc.android.inputmethod.japanese"/>
- <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="19" />
+ <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="21" />
<!-- Google Japanese Input (the main code) requires the following permissions. -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
diff --git a/src/android/tests/project.properties b/src/android/tests/project.properties
index 2d6f3af..5430b63 100644
--- a/src/android/tests/project.properties
+++ b/src/android/tests/project.properties
@@ -37,4 +37,4 @@
# project structure.
# Project target.
-target=android-19
+target=android-21
diff --git a/src/android/tests/res/values-land/dimens.xml b/src/android/tests/res/values-land/dimens.xml
new file mode 100644
index 0000000..ecb7a0f
--- /dev/null
+++ b/src/android/tests/res/values-land/dimens.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<resources>
+
+ <dimen name="value_for_testing_port_1dip_land_2dip">2dip</dimen>
+
+</resources>
diff --git a/src/android/tests/res/values/dimens.xml b/src/android/tests/res/values/dimens.xml
new file mode 100644
index 0000000..3f8fafd
--- /dev/null
+++ b/src/android/tests/res/values/dimens.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<resources>
+
+ <dimen name="value_for_testing_port_1dip_land_2dip">1dip</dimen>
+
+</resources>
diff --git a/src/android/tests/res/values/dummy.xml b/src/android/tests/res/values/dummy.xml
deleted file mode 100644
index f2315c0..0000000
--- a/src/android/tests/res/values/dummy.xml
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- By placing this dummy file, res directory is generated by ADT and
- build on Eclipse gets healthier. -->
-<resources/>
diff --git a/src/android/tests/res/xml/skinparser_correct_drawable_test_1.xml b/src/android/tests/res/xml/skinparser_correct_drawable_test_1.xml
new file mode 100644
index 0000000..8ff293a
--- /dev/null
+++ b/src/android/tests/res/xml/skinparser_correct_drawable_test_1.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<Skin xmlns:android="http://schemas.android.com/apk/res/android" >
+
+ <Drawable android:name="windowBackgroundDrawable" >
+ <color android:color="#FFFFFFFF" />
+ </Drawable>
+
+</Skin>
\ No newline at end of file
diff --git a/src/android/tests/res/xml/skinparser_incorrect_drawable_test_1.xml b/src/android/tests/res/xml/skinparser_incorrect_drawable_test_1.xml
new file mode 100644
index 0000000..4357794
--- /dev/null
+++ b/src/android/tests/res/xml/skinparser_incorrect_drawable_test_1.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<Skin xmlns:android="http://schemas.android.com/apk/res/android" >
+
+ <Drawable android:name="windowBackgroundDrawable" >
+ <color android:color="#FFFFFFFF" />
+ <color android:color="#FFFFFFFF" />
+ </Drawable>
+
+</Skin>
\ No newline at end of file
diff --git a/src/android/tests/res/xml/skinparser_test_1.xml b/src/android/tests/res/xml/skinparser_test_1.xml
new file mode 100644
index 0000000..f346595
--- /dev/null
+++ b/src/android/tests/res/xml/skinparser_test_1.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<InvalidRootTag>
+</InvalidRootTag>
diff --git a/src/android/tests/res/xml/skinparser_test_2.xml b/src/android/tests/res/xml/skinparser_test_2.xml
new file mode 100644
index 0000000..730b1a0
--- /dev/null
+++ b/src/android/tests/res/xml/skinparser_test_2.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<Skin xmlns:android="http://schemas.android.com/apk/res/android">
+ <Color android:name="no_such_field" android:color="#FFFFFFFF" />
+</Skin>
diff --git a/src/android/tests/res/xml/skinparser_test_3.xml b/src/android/tests/res/xml/skinparser_test_3.xml
new file mode 100644
index 0000000..931cacd
--- /dev/null
+++ b/src/android/tests/res/xml/skinparser_test_3.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<Skin xmlns:android="http://schemas.android.com/apk/res/android">
+ <Color />
+</Skin>
diff --git a/src/android/tests/res/xml/skinparser_test_4.xml b/src/android/tests/res/xml/skinparser_test_4.xml
new file mode 100644
index 0000000..9a37f0d
--- /dev/null
+++ b/src/android/tests/res/xml/skinparser_test_4.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<Skin xmlns:android="http://schemas.android.com/apk/res/android" >
+
+ <Color android:name="mycolor" >
+ <InvalidInnerTag />
+ </Color>
+
+</Skin>
\ No newline at end of file
diff --git a/src/android/tests/res/xml/skinparser_test_5.xml b/src/android/tests/res/xml/skinparser_test_5.xml
new file mode 100644
index 0000000..a207dbb
--- /dev/null
+++ b/src/android/tests/res/xml/skinparser_test_5.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<Skin xmlns:android="http://schemas.android.com/apk/res/android">
+ <Drawable />
+</Skin>
diff --git a/src/android/tests/res/xml/skinparser_test_6.xml b/src/android/tests/res/xml/skinparser_test_6.xml
new file mode 100644
index 0000000..eb939bf
--- /dev/null
+++ b/src/android/tests/res/xml/skinparser_test_6.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<Skin xmlns:android="http://schemas.android.com/apk/res/android" >
+
+ <Drawable android:name="mydrawable" >
+ <InvalidInnerTag />
+ </Drawable>
+
+</Skin>
\ No newline at end of file
diff --git a/src/android/tests/res/xml/skinparser_test_7.xml b/src/android/tests/res/xml/skinparser_test_7.xml
new file mode 100644
index 0000000..0ee8aab
--- /dev/null
+++ b/src/android/tests/res/xml/skinparser_test_7.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<Skin xmlns:android="http://schemas.android.com/apk/res/android" >
+
+ <UnknownTag />
+
+</Skin>
\ No newline at end of file
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/ApplicationInitializerFactoryTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/ApplicationInitializerFactoryTest.java
index c714306..2e3c1a4 100644
--- a/src/android/tests/src/com/google/android/inputmethod/japanese/ApplicationInitializerFactoryTest.java
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/ApplicationInitializerFactoryTest.java
@@ -33,11 +33,15 @@
import org.mozc.android.inputmethod.japanese.ApplicationInitializerFactory.ApplicationInitializer;
import org.mozc.android.inputmethod.japanese.MozcUtil.TelephonyManagerInterface;
import org.mozc.android.inputmethod.japanese.preference.PreferenceUtil;
-import org.mozc.android.inputmethod.japanese.resources.R;
+import org.mozc.android.inputmethod.japanese.preference.PreferenceUtil.PreferenceManagerStaticInterface;
import org.mozc.android.inputmethod.japanese.testing.InstrumentationTestCaseWithMock;
+import org.mozc.android.inputmethod.japanese.testing.MockContext;
+import org.mozc.android.inputmethod.japanese.testing.MockPackageManager;
import org.mozc.android.inputmethod.japanese.testing.MozcPreferenceUtil;
import org.mozc.android.inputmethod.japanese.testing.Parameter;
+import org.mozc.android.inputmethod.japanese.util.LauncherIconManagerFactory.LauncherIconManager;
import com.google.common.base.Optional;
+import com.google.common.base.Preconditions;
import android.content.Context;
import android.content.SharedPreferences;
@@ -53,125 +57,309 @@
*/
public class ApplicationInitializerFactoryTest extends InstrumentationTestCaseWithMock {
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ MozcUtil.setDebug(Optional.of(false));
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ MozcUtil.setDebug(Optional.<Boolean>absent());
+ super.tearDown();
+ }
+
+ @SmallTest
+ public void testInitialize() {
+ SharedPreferences sharedPreferences = MozcPreferenceUtil.getSharedPreferences(
+ getInstrumentation().getContext(), "1ST_TIME_LAUNCH");
+
+ class TestData extends Parameter {
+ final boolean isSystemApplication;
+ final boolean isLaunchedAtLeastOnce;
+ final boolean isWelcomeActivityShown;
+ final boolean isWelcomeActivityPreferred;
+ final Optional<Integer> lastLaunchVersionCode;
+ final int versionCode;
+ final boolean expectedStartActivity;
+ final boolean expectedPreferenceUpdate;
+ TestData(boolean isSystemApplication,
+ boolean isFirstLaunch,
+ boolean isWelcomeActivityShown,
+ boolean isWelcomeActivityPreferred,
+ Optional<Integer> lastLaunchVersionCode,
+ int versionCode,
+ boolean expectedStartActivity,
+ boolean expectedPreferenceUpdate) {
+ this.isSystemApplication = isSystemApplication;
+ this.isLaunchedAtLeastOnce = isFirstLaunch;
+ this.isWelcomeActivityShown = isWelcomeActivityShown;
+ this.isWelcomeActivityPreferred = isWelcomeActivityPreferred;
+ this.lastLaunchVersionCode = lastLaunchVersionCode;
+ this.versionCode = versionCode;
+ this.expectedStartActivity = expectedStartActivity;
+ this.expectedPreferenceUpdate = expectedPreferenceUpdate;
+ }
+ }
+
+ // Expect false if isSystemApplication is true or isFirstLaunch is false.
+ Optional<Integer> absentInt = Optional.<Integer>absent();
+ TestData[] testDataList = {
+ // Non-sys-app
+ new TestData(false, false, true, true, Optional.of(100), 100, false, false),
+ new TestData(false, false, true, true, absentInt, 100, false, true),
+
+ new TestData(false, false, false, true, Optional.of(100), 100, true, false),
+ new TestData(false, false, false, true, absentInt, 100, true, true),
+
+ new TestData(false, true, true, true, Optional.of(100), 100, false, false),
+ new TestData(false, true, true, true, absentInt, 100, false, false),
+
+ new TestData(false, true, false, true, Optional.of(100), 100, false, false),
+ new TestData(false, true, false, true, absentInt, 100, false, false),
+
+ // Sys-app
+ new TestData(true, false, true, true, Optional.of(100), 100, false, false),
+ new TestData(true, false, true, true, absentInt, 100, false, true),
+
+ new TestData(true, false, false, true, Optional.of(100), 100, false, false),
+ new TestData(true, false, false, true, absentInt, 100, false, true),
+
+ new TestData(true, true, true, true, Optional.of(100), 100, false, false),
+ new TestData(true, true, true, true, absentInt, 100, false, false),
+
+ new TestData(true, true, false, true, Optional.of(100), 100, false, false),
+ new TestData(true, true, false, true, absentInt, 100, false, false),
+
+ // Non-sys-app, Welcome acvitity shouldn't be shown
+ new TestData(false, false, true, false, Optional.of(100), 100, false, false),
+ new TestData(false, false, true, false, absentInt, 100, false, true),
+
+ new TestData(false, false, false, false, Optional.of(100), 100, false, false),
+ new TestData(false, false, false, false, absentInt, 100, false, true),
+
+ new TestData(false, true, true, false, Optional.of(100), 100, false, false),
+ new TestData(false, true, true, false, absentInt, 100, false, false),
+
+ new TestData(false, true, false, false, Optional.of(100), 100, false, false),
+ new TestData(false, true, false, false, absentInt, 100, false, false),
+
+ // Sys-app, Welcome acvitity shouldn't be shown
+ new TestData(true, false, true, false, Optional.of(100), 100, false, false),
+ new TestData(true, false, true, false, absentInt, 100, false, true),
+
+ new TestData(true, false, false, false, Optional.of(100), 100, false, false),
+ new TestData(true, false, false, false, absentInt, 100, false, true),
+
+ new TestData(true, true, true, false, Optional.of(100), 100, false, false),
+ new TestData(true, true, true, false, absentInt, 100, false, false),
+
+ new TestData(true, true, false, false, Optional.of(100), 100, false, false),
+ new TestData(true, true, false, false, absentInt, 100, false, false),
+
+ };
+
+ TelephonyManagerInterface telephonyManager = new TelephonyManagerInterface() {
+ @Override
+ public String getNetworkOperator() {
+ return "INVALID NETWORK OPERATOR";
+ }
+ };
+ LauncherIconManager launcherIconManager = new LauncherIconManager() {
+ @Override
+ public void updateLauncherIconVisibility(Context context) {}
+ };
+ PreferenceManagerStaticInterface preferenceManager = new PreferenceManagerStaticInterface() {
+ @Override
+ public void setDefaultValues(Context context, int id, boolean readAgain) {}
+ };
+
+ Context targetContext = getInstrumentation().getTargetContext();
+ Context context = createNiceMock(MockContext.class);
+ EasyMock.expect(context.getPackageName())
+ .andStubReturn(getInstrumentation().getTargetContext().getPackageName());
+ EasyMock.expect(context.getResources())
+ .andStubReturn(targetContext.getResources());
+ EasyMock.expect(context.getContentResolver())
+ .andStubReturn(targetContext.getContentResolver());
+ EasyMock.expect(context.getCacheDir())
+ .andStubReturn(targetContext.getCacheDir());
+ EasyMock.expect(context.getApplicationInfo())
+ .andStubReturn(targetContext.getApplicationInfo());
+ EasyMock.expect(context.getSystemService(Context.USER_SERVICE))
+ .andStubReturn(targetContext.getSystemService(Context.USER_SERVICE));
+ EasyMock.expect(context.getPackageManager()).andStubReturn(new MockPackageManager());
+
+ replayAll();
+ for (final TestData testData : testDataList) {
+ for (final boolean isDevChannel : new boolean[] {true, false}) {
+ sharedPreferences.edit().clear().commit();
+ ApplicationInitializationStatus initializationStatus =
+ new ApplicationInitializationStatus() {
+ @Deprecated
+ @Override
+ public boolean isLaunchedAtLeastOnce() {
+ return testData.isLaunchedAtLeastOnce;
+ }
+ @Override
+ public Optional<Integer> getLastLaunchAbiIndependentVersionCode() {
+ return testData.lastLaunchVersionCode;
+ }
+ @Override
+ public boolean isWelcomeActivityShownAtLeastOnce() {
+ return testData.isWelcomeActivityShown;
+ }
+ };
+ assertEquals(testData.toString(),
+ testData.expectedStartActivity,
+ ApplicationInitializerFactory.createInstance(
+ initializationStatus,
+ context,
+ sharedPreferences,
+ telephonyManager)
+ .initialize(testData.isSystemApplication,
+ isDevChannel,
+ testData.isWelcomeActivityPreferred,
+ testData.versionCode,
+ launcherIconManager,
+ preferenceManager).isPresent());
+ assertEquals(testData.toString(),
+ testData.versionCode,
+ sharedPreferences.getInt(
+ PreferenceUtil
+ .PREF_LAST_LAUNCH_ABI_INDEPENDENT_VERSION_CODE,
+ Integer.MIN_VALUE));
+ if (testData.expectedStartActivity) {
+ assertTrue(testData.toString(),
+ sharedPreferences.getBoolean(
+ ApplicationInitializerFactory.PREF_WELCOME_ACTIVITY_SHOWN, false));
+ }
+ assertEquals(testData.toString(),
+ testData.expectedPreferenceUpdate,
+ sharedPreferences.contains("pref_portrait_fullscreen_key"));
+ assertEquals(testData.toString(),
+ testData.expectedPreferenceUpdate,
+ sharedPreferences.contains(PreferenceUtil.PREF_EMOJI_PROVIDER_TYPE));
+ assertFalse(testData.toString(),
+ sharedPreferences.contains(
+ ApplicationInitializerFactory.PREF_LAUNCHED_AT_LEAST_ONCE));
+ // TODO(matsuzakit): Using android:defaultValue attribute is more preferable than using
+ // contains method. Do it on another CL.
+ if (isDevChannel) {
+ assertTrue(testData.toString(),
+ sharedPreferences.getBoolean(PreferenceUtil.PREF_OTHER_USAGE_STATS_KEY,
+ false));
+ } else {
+ assertTrue(testData.toString(),
+ !sharedPreferences.contains(PreferenceUtil.PREF_OTHER_USAGE_STATS_KEY) ||
+ !sharedPreferences.getBoolean(PreferenceUtil.PREF_OTHER_USAGE_STATS_KEY,
+ true));
+ }
+ }
+ }
+ }
+
+ @SmallTest
+ public void testGetDimensionForOrientation() {
+ float portraitValue = ApplicationInitializer.getDimensionForOrientation(
+ getInstrumentation().getContext().getResources(),
+ org.mozc.android.inputmethod.japanese.tests.R.dimen.value_for_testing_port_1dip_land_2dip,
+ Configuration.ORIENTATION_PORTRAIT);
+ float landscapeValue = ApplicationInitializer.getDimensionForOrientation(
+ getInstrumentation().getContext().getResources(),
+ org.mozc.android.inputmethod.japanese.tests.R.dimen.value_for_testing_port_1dip_land_2dip,
+ Configuration.ORIENTATION_LANDSCAPE);
+
+ assertTrue("portrait:" + portraitValue + ", landscape:" + landscapeValue,
+ portraitValue != landscapeValue);
+ }
@SmallTest
public void testStoreDefaultFullscreenMode() throws IllegalArgumentException {
- Resources resources = getInstrumentation().getTargetContext().getResources();
- float currentDisplayDensity = resources.getDisplayMetrics().density;
- Configuration defaultConfiguration = new Configuration();
- defaultConfiguration.setToDefaults();
- defaultConfiguration.orientation = Configuration.ORIENTATION_PORTRAIT;
- float portraitNormalImeHeightInDip =
- resources.getDimension(R.dimen.ime_window_height_portrait_normal) / currentDisplayDensity;
- float landscapeNormalImeHeightInDip =
- resources.getDimension(R.dimen.ime_window_height_landscape_normal) / currentDisplayDensity;
- float portraitXlargeImeHeightInDip =
- resources.getDimension(R.dimen.ime_window_height_portrait_xlarge) / currentDisplayDensity;
- float landscapeXlargeImeHeightInDip =
- resources.getDimension(R.dimen.ime_window_height_landscape_xlarge) / currentDisplayDensity;
- float productionFullscreenThresholdInDip =
- resources.getDimension(R.dimen.fullscreen_threshold) / currentDisplayDensity;
class TestParameter extends Parameter {
- final int displayWidthPixels;
- final int displayHeightPixels;
+ final int displayHeightInPixels;
+ final int displayWidthInPixels;
final float displayDensity;
- final float portraitImeHeight;
- final float landscapeImeHeight;
- final float fullscreenThreshold;
final boolean expectPortraitFullscreen;
final boolean expectLandscapeFullscreen;
- TestParameter(int displayWidthPixels,
- int displayHeightPixels,
+ TestParameter(int displayHeightInPixels,
+ int displayWidthInPixels,
float displayDensity,
- float portraitImeHeight,
- float landscapeImeHeight,
- float fullscreenThreshold,
boolean expectPortraitFullscreen,
boolean expectLandscapeFullscreen) {
- this.displayWidthPixels = displayWidthPixels;
- this.displayHeightPixels = displayHeightPixels;
+ Preconditions.checkArgument(displayHeightInPixels >= displayWidthInPixels);
+ this.displayHeightInPixels = displayHeightInPixels;
+ this.displayWidthInPixels = displayWidthInPixels;
this.displayDensity = displayDensity;
- this.portraitImeHeight = portraitImeHeight;
- this.landscapeImeHeight = landscapeImeHeight;
- this.fullscreenThreshold = fullscreenThreshold;
this.expectPortraitFullscreen = expectPortraitFullscreen;
this.expectLandscapeFullscreen = expectLandscapeFullscreen;
}
}
TestParameter[] parameters = {
- new TestParameter(100, 100, 1f, 50, 80, 40, false, true),
- new TestParameter(100, 100, 2f, 50, 80, 40, true, true),
+ new TestParameter(300, 300, 1.0f, true, true),
// Galaxy S
- new TestParameter(480, 800, 1.5f,
- portraitNormalImeHeightInDip,
- landscapeNormalImeHeightInDip,
- productionFullscreenThresholdInDip,
- false, true),
+ new TestParameter(800, 480, 1.5f, false, true),
// HTC ARIA
- new TestParameter(320, 480, 1.0f,
- portraitNormalImeHeightInDip,
- landscapeNormalImeHeightInDip,
- productionFullscreenThresholdInDip,
- true, true),
+ new TestParameter(480, 320, 1.0f, false, true),
// IS03
- new TestParameter(640, 960, 2.0f,
- portraitNormalImeHeightInDip,
- landscapeNormalImeHeightInDip,
- productionFullscreenThresholdInDip,
- true, true),
+ new TestParameter(960, 640, 2.0f, false, true),
// IS01
- new TestParameter(854, 480, 1.5f,
- portraitNormalImeHeightInDip,
- landscapeNormalImeHeightInDip,
- productionFullscreenThresholdInDip,
- true, false),
+ new TestParameter(854, 480, 1.5f, false, true),
// Optimus Pad
- new TestParameter(1280, 768, 1.0f,
- portraitNormalImeHeightInDip,
- landscapeNormalImeHeightInDip,
- productionFullscreenThresholdInDip,
- false, false),
+ new TestParameter(1280, 768, 1.0f, false, false),
// Galaxy Nexus
- new TestParameter(720, 1280, 2.0f,
- portraitNormalImeHeightInDip,
- landscapeNormalImeHeightInDip,
- productionFullscreenThresholdInDip,
- false, true),
+ new TestParameter(1280, 720, 2.0f, false, true),
// Nexus 7
- new TestParameter(1280, 800, 1.33f,
- portraitNormalImeHeightInDip,
- landscapeNormalImeHeightInDip,
- productionFullscreenThresholdInDip,
- false, false),
+ new TestParameter(1280, 800, 1.33f, false, false),
// Nexus 10
- new TestParameter(2464, 1600, 2.0f,
- portraitXlargeImeHeightInDip,
- landscapeXlargeImeHeightInDip,
- productionFullscreenThresholdInDip,
- false, false),
+ new TestParameter(2464, 1600, 2.0f, false, false),
};
+ Resources resources = getInstrumentation().getTargetContext().getResources();
+
for (TestParameter testParameter : parameters) {
SharedPreferences sharedPreferences =
MozcPreferenceUtil.getSharedPreferences(
getInstrumentation().getTargetContext(), "DEFAULT_FULLSCREEN");
sharedPreferences.edit().clear().commit();
+
+ DisplayMetrics originalMetrics = new DisplayMetrics();
+ originalMetrics.setTo(resources.getDisplayMetrics());
+ Configuration originalConfiguration = new Configuration(resources.getConfiguration());
+
DisplayMetrics metrics = new DisplayMetrics();
- metrics.widthPixels = testParameter.displayWidthPixels;
- metrics.heightPixels = testParameter.displayHeightPixels;
+ metrics.heightPixels = testParameter.displayHeightInPixels;
+ metrics.widthPixels = testParameter.displayWidthInPixels;
metrics.density = testParameter.displayDensity;
- ApplicationInitializer.storeDefaultFullscreenMode(
- sharedPreferences,
- metrics,
- testParameter.fullscreenThreshold * testParameter.displayDensity,
- testParameter.portraitImeHeight * testParameter.displayDensity,
- testParameter.landscapeImeHeight * testParameter.displayDensity);
- assertEquals(testParameter.toString(),
- testParameter.expectPortraitFullscreen,
- sharedPreferences.getBoolean("pref_portrait_fullscreen_key", false));
- assertEquals(testParameter.toString(),
- testParameter.expectLandscapeFullscreen,
- sharedPreferences.getBoolean("pref_landscape_fullscreen_key", false));
+
+ Configuration configuration = new Configuration(resources.getConfiguration());
+ configuration.orientation = Configuration.ORIENTATION_PORTRAIT;
+ configuration.densityDpi = Math.round(160f * testParameter.displayDensity);
+ configuration.screenHeightDp =
+ Math.round(testParameter.displayHeightInPixels / testParameter.displayDensity);
+ configuration.screenWidthDp =
+ Math.round(testParameter.displayWidthInPixels / testParameter.displayDensity);
+
+ try {
+ resources.updateConfiguration(configuration, metrics);
+
+ ApplicationInitializer.storeDefaultFullscreenMode(
+ sharedPreferences,
+ testParameter.displayHeightInPixels,
+ testParameter.displayWidthInPixels,
+ resources.getDimensionPixelOffset(R.dimen.input_frame_height),
+ (int) Math.ceil(ApplicationInitializer.getDimensionForOrientation(
+ resources, R.dimen.input_frame_height, Configuration.ORIENTATION_LANDSCAPE)),
+ resources.getDimensionPixelOffset(R.dimen.fullscreen_threshold));
+ assertEquals("portrait check failed: " + testParameter.toString(),
+ testParameter.expectPortraitFullscreen,
+ sharedPreferences.getBoolean("pref_portrait_fullscreen_key", false));
+ assertEquals("landscape check failed: " + testParameter.toString(),
+ testParameter.expectLandscapeFullscreen,
+ sharedPreferences.getBoolean("pref_landscape_fullscreen_key", false));
+ } finally {
+ resources.updateConfiguration(originalConfiguration, originalMetrics);
+ }
}
}
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/CandidateViewManagerTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/CandidateViewManagerTest.java
new file mode 100644
index 0000000..d23feb3
--- /dev/null
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/CandidateViewManagerTest.java
@@ -0,0 +1,386 @@
+// Copyright 2010-2014, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package org.mozc.android.inputmethod.japanese;
+
+import static org.easymock.EasyMock.isA;
+
+import org.mozc.android.inputmethod.japanese.CandidateViewManager.KeyboardCandidateViewHeightListener;
+import org.mozc.android.inputmethod.japanese.protobuf.ProtoCandidates.CandidateList;
+import org.mozc.android.inputmethod.japanese.protobuf.ProtoCandidates.CandidateWord;
+import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Command;
+import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Output;
+import org.mozc.android.inputmethod.japanese.testing.ApiLevel;
+import org.mozc.android.inputmethod.japanese.testing.InstrumentationTestCaseWithMock;
+import org.mozc.android.inputmethod.japanese.view.Skin;
+import com.google.common.base.Optional;
+
+import android.annotation.TargetApi;
+import android.test.suitebuilder.annotation.SmallTest;
+import android.view.View;
+import android.view.animation.Animation;
+import android.view.animation.Animation.AnimationListener;
+import android.view.inputmethod.CursorAnchorInfo;
+import android.view.inputmethod.EditorInfo;
+
+/**
+ * Test for CandidateViewManager.
+ */
+public class CandidateViewManagerTest extends InstrumentationTestCaseWithMock {
+
+ private Command createCommand(int candidateNum) {
+ CandidateList.Builder candidateListBuilder = CandidateList.newBuilder();
+ for (int i = 0; i < candidateNum; ++i) {
+ candidateListBuilder.addCandidates(CandidateWord.getDefaultInstance());
+ }
+
+ return Command.newBuilder()
+ .setOutput(Output.newBuilder()
+ .setAllCandidateWords(candidateListBuilder.buildPartial())
+ .buildPartial())
+ .buildPartial();
+ }
+
+ @SmallTest
+ public void testUpdateForKeyboardCandidateView() {
+ CandidateView keyboardCandidateView = createViewMock(CandidateView.class);
+ FloatingCandidateView floatingCandidateView = createViewMock(FloatingCandidateView.class);
+ CandidateViewManager candidateViewManager =
+ new CandidateViewManager(keyboardCandidateView, floatingCandidateView);
+
+ assertFalse(candidateViewManager.isFloatingMode());
+
+ {
+ Command emptyCommand = createCommand(0);
+ resetAll();
+ keyboardCandidateView.startOutAnimation();
+ replayAll();
+ candidateViewManager.update(emptyCommand);
+ verifyAll();
+ }
+
+ {
+ Command nonEmptyCommand = createCommand(1);
+ resetAll();
+ keyboardCandidateView.update(nonEmptyCommand);
+ keyboardCandidateView.startInAnimation();
+ replayAll();
+ candidateViewManager.update(nonEmptyCommand);
+ verifyAll();
+ }
+ }
+
+ @ApiLevel(21)
+ @TargetApi(21)
+ @SmallTest
+ public void testUpdateForFloatingCandidateView() {
+ CandidateView keyboardCandidateView = createViewMock(CandidateView.class);
+ FloatingCandidateView floatingCandidateView = createViewMock(FloatingCandidateView.class);
+ CandidateViewManager candidateViewManager =
+ new CandidateViewManager(keyboardCandidateView, floatingCandidateView);
+
+ resetAll();
+ keyboardCandidateView.enableFoldButton(false);
+ keyboardCandidateView.update(CandidateViewManager.EMPTY_COMMAND);
+ keyboardCandidateView.setVisibility(View.GONE);
+ floatingCandidateView.setEditorInfo(isA(EditorInfo.class));
+ floatingCandidateView.setCursorAnchorInfo(isA(CursorAnchorInfo.class));
+ floatingCandidateView.setCandidates(CandidateViewManager.EMPTY_COMMAND);
+ floatingCandidateView.setVisibility(View.VISIBLE);
+ replayAll();
+ candidateViewManager.setNarrowMode(true);
+ candidateViewManager.setAllowFloatingMode(true);
+ candidateViewManager.setExtractedMode(false);
+ verifyAll();
+ assertTrue(candidateViewManager.isFloatingMode());
+
+ {
+ Command emptyCommand = createCommand(0);
+ resetAll();
+ floatingCandidateView.setCandidates(emptyCommand);
+ replayAll();
+ candidateViewManager.update(emptyCommand);
+ verifyAll();
+ }
+
+ {
+ Command nonEmptyCommand = createCommand(1);
+ resetAll();
+ floatingCandidateView.setCandidates(nonEmptyCommand);
+ replayAll();
+ candidateViewManager.update(nonEmptyCommand);
+ verifyAll();
+ }
+ }
+
+ @SmallTest
+ public void testNarrowMode() {
+ CandidateView keyboardCandidateView = createViewMock(CandidateView.class);
+ FloatingCandidateView floatingCandidateView = createViewMock(FloatingCandidateView.class);
+ CandidateViewManager candidateViewManager =
+ new CandidateViewManager(keyboardCandidateView, floatingCandidateView);
+
+ assertFalse(candidateViewManager.isFloatingMode());
+ EditorInfo editorInfo = new EditorInfo();
+ candidateViewManager.setEditorInfo(editorInfo);
+ CursorAnchorInfo cursorAnchorInfo = new CursorAnchorInfo.Builder().build();
+ candidateViewManager.setCursorAnchorInfo(cursorAnchorInfo);
+
+
+ resetAll();
+ keyboardCandidateView.enableFoldButton(false);
+ replayAll();
+ candidateViewManager.setNarrowMode(true);
+ candidateViewManager.setAllowFloatingMode(false);
+ verifyAll();
+ assertFalse(candidateViewManager.isFloatingMode());
+
+ resetAll();
+ keyboardCandidateView.enableFoldButton(true);
+ replayAll();
+ candidateViewManager.setNarrowMode(false);
+ candidateViewManager.setAllowFloatingMode(false);
+ verifyAll();
+ assertFalse(candidateViewManager.isFloatingMode());
+
+ // Sets candidates
+ Command command = createCommand(1);
+ resetAll();
+ keyboardCandidateView.update(command);
+ keyboardCandidateView.startInAnimation();
+ replayAll();
+ candidateViewManager.update(command);
+ verifyAll();
+
+ if (FloatingCandidateView.isAvailable()) {
+ resetAll();
+ keyboardCandidateView.enableFoldButton(false);
+ keyboardCandidateView.update(CandidateViewManager.EMPTY_COMMAND);
+ keyboardCandidateView.setVisibility(View.GONE);
+ floatingCandidateView.setCandidates(CandidateViewManager.EMPTY_COMMAND);
+ floatingCandidateView.setCursorAnchorInfo(cursorAnchorInfo);
+ floatingCandidateView.setEditorInfo(editorInfo);
+ floatingCandidateView.setVisibility(View.VISIBLE);
+ replayAll();
+ candidateViewManager.setNarrowMode(true);
+ candidateViewManager.setAllowFloatingMode(true);
+ verifyAll();
+ assertTrue(candidateViewManager.isFloatingMode());
+
+ resetAll();
+ keyboardCandidateView.enableFoldButton(true);
+ keyboardCandidateView.update(CandidateViewManager.EMPTY_COMMAND);
+ keyboardCandidateView.setVisibility(View.GONE);
+ floatingCandidateView.setCandidates(CandidateViewManager.EMPTY_COMMAND);
+ floatingCandidateView.setVisibility(View.GONE);
+ replayAll();
+ candidateViewManager.setNarrowMode(false);
+ candidateViewManager.setAllowFloatingMode(true);
+ verifyAll();
+ assertFalse(candidateViewManager.isFloatingMode());
+ }
+ }
+
+ @SmallTest
+ public void testKeyboardCandidateViewAnimationListener() {
+ CandidateView keyboardCandidateView = createViewMockBuilder(CandidateView.class)
+ .createNiceMock();
+ FloatingCandidateView floatingCandidateView = createViewMockBuilder(FloatingCandidateView.class)
+ .createNiceMock();
+ CandidateViewManager candidateViewManager =
+ new CandidateViewManager(keyboardCandidateView, floatingCandidateView);
+
+ ViewEventListener viewEventListener = createNiceMock(ViewEventListener.class);
+ KeyboardCandidateViewHeightListener animationListener =
+ createMock(KeyboardCandidateViewHeightListener.class);
+
+ resetAll();
+ keyboardCandidateView.setViewEventListener(viewEventListener);
+ floatingCandidateView.setViewEventListener(viewEventListener);
+ replayAll();
+ candidateViewManager.setEventListener(viewEventListener, animationListener);
+ verifyAll();
+
+ Command nonEmptyCommand = createCommand(1);
+ assertFalse(candidateViewManager.isFloatingMode());
+ resetAll();
+ animationListener.onExpanded();
+ replayAll();
+ candidateViewManager.update(nonEmptyCommand);
+ verifyAll();
+
+ Command emptyCommand = createCommand(0);
+ resetAll();
+ animationListener.onCollapse();
+ replayAll();
+ candidateViewManager.update(emptyCommand);
+ verifyAll();
+
+ if (FloatingCandidateView.isAvailable()) {
+ candidateViewManager.setNarrowMode(true);
+ candidateViewManager.setAllowFloatingMode(true);
+ assertTrue(candidateViewManager.isFloatingMode());
+ resetAll();
+ replayAll();
+ candidateViewManager.update(nonEmptyCommand);
+ candidateViewManager.update(emptyCommand);
+ verifyAll();
+ }
+ }
+
+ @SmallTest
+ public void testShowNumberKeyboard() {
+ int candidateTextSize = 10;
+ int descriptionTextSize = 5;
+ ViewEventListener viewEventListener = createNiceMock(ViewEventListener.class);
+ KeyboardCandidateViewHeightListener heightListener =
+ createNiceMock(KeyboardCandidateViewHeightListener.class);
+ InOutAnimatedFrameLayout.VisibilityChangeListener visibilityChangeListener =
+ createNiceMock(InOutAnimatedFrameLayout.VisibilityChangeListener.class);
+
+ Skin skin = new Skin();
+
+ { // Set a view and update.
+ CandidateViewManager candidateViewManager = new CandidateViewManager(
+ createViewMockBuilder(CandidateView.class).createNiceMock(),
+ createViewMockBuilder(FloatingCandidateView.class).createNiceMock());
+ CandidateView view = createViewMock(CandidateView.class);
+
+ resetAll();
+ view.setCandidateTextDimension(candidateTextSize, descriptionTextSize);
+ view.setViewEventListener(viewEventListener);
+ view.setOnVisibilityChangeListener(visibilityChangeListener);
+ view.setSkin(skin);
+ view.enableFoldButton(true);
+ view.setInAnimation(isA(Animation.class));
+ view.setOutAnimation(isA(Animation.class));
+ view.setOutAnimationListener(isA(AnimationListener.class));
+ replayAll();
+
+ candidateViewManager.setCandidateTextDimension(candidateTextSize, descriptionTextSize);
+ candidateViewManager.setEventListener(viewEventListener, heightListener);
+ candidateViewManager.setOnVisibilityChangeListener(Optional.of(visibilityChangeListener));
+ candidateViewManager.setSkin(skin);
+ candidateViewManager.setNumberCandidateView(view);
+
+ verifyAll();
+ }
+
+ { // Update and set a view.
+ CandidateViewManager candidateViewManager = new CandidateViewManager(
+ createViewMockBuilder(CandidateView.class).createNiceMock(),
+ createViewMockBuilder(FloatingCandidateView.class).createNiceMock());
+ CandidateView view = createViewMock(CandidateView.class);
+
+ resetAll();
+ // Set default values when number keyboard is set.
+ view.setSkin(Skin.getFallbackInstance());
+ view.setOnVisibilityChangeListener(null);
+ // Set actual values.
+ view.setCandidateTextDimension(candidateTextSize, descriptionTextSize);
+ view.setViewEventListener(viewEventListener);
+ view.enableFoldButton(true);
+ view.setOnVisibilityChangeListener(visibilityChangeListener);
+ view.setSkin(skin);
+ view.setInAnimation(isA(Animation.class));
+ view.setOutAnimation(isA(Animation.class));
+ view.setOutAnimationListener(isA(AnimationListener.class));
+ replayAll();
+
+ candidateViewManager.setNumberCandidateView(view);
+ candidateViewManager.setCandidateTextDimension(candidateTextSize, descriptionTextSize);
+ candidateViewManager.setEventListener(viewEventListener, heightListener);
+ candidateViewManager.setOnVisibilityChangeListener(Optional.of(visibilityChangeListener));
+ candidateViewManager.setSkin(skin);
+
+ verifyAll();
+ }
+ }
+
+ @SmallTest
+ public void testSwitchNumberKeyboard() {
+ CandidateView keyboardCandidateView = createViewMock(CandidateView.class);
+ CandidateView numberCandidateView = createViewMock(CandidateView.class);
+ CandidateViewManager candidateViewManager = new CandidateViewManager(
+ keyboardCandidateView, createViewMockBuilder(FloatingCandidateView.class).createNiceMock());
+ candidateViewManager.setNumberCandidateView(numberCandidateView);
+
+ Command command = createCommand(1);
+
+ {
+ resetAll();
+ keyboardCandidateView.update(CandidateViewManager.EMPTY_COMMAND);
+ keyboardCandidateView.setVisibility(View.GONE);
+ numberCandidateView.update(CandidateViewManager.EMPTY_COMMAND);
+ numberCandidateView.setVisibility(View.GONE);
+ replayAll();
+ candidateViewManager.setNumberMode(true);
+ verifyAll();
+
+ resetAll();
+ keyboardCandidateView.update(CandidateViewManager.EMPTY_COMMAND);
+ keyboardCandidateView.setVisibility(View.GONE);
+ replayAll();
+ candidateViewManager.setNumberMode(false);
+ verifyAll();
+ }
+
+ {
+ resetAll();
+ keyboardCandidateView.update(command);
+ keyboardCandidateView.startInAnimation();
+ replayAll();
+ candidateViewManager.update(command);
+ verifyAll();
+
+ resetAll();
+ keyboardCandidateView.update(CandidateViewManager.EMPTY_COMMAND);
+ keyboardCandidateView.setVisibility(View.GONE);
+ numberCandidateView.update(CandidateViewManager.EMPTY_COMMAND);
+ numberCandidateView.setVisibility(View.GONE);
+ replayAll();
+ candidateViewManager.setNumberMode(true);
+ verifyAll();
+
+ resetAll();
+ numberCandidateView.update(command);
+ numberCandidateView.startInAnimation();
+ replayAll();
+ candidateViewManager.update(command);
+ verifyAll();
+
+ resetAll();
+ keyboardCandidateView.update(CandidateViewManager.EMPTY_COMMAND);
+ keyboardCandidateView.setVisibility(View.GONE);
+ replayAll();
+ candidateViewManager.setNumberMode(false);
+ verifyAll();
+ }
+ }
+}
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/CandidateViewTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/CandidateViewTest.java
index d446bb0..2850be6 100644
--- a/src/android/tests/src/com/google/android/inputmethod/japanese/CandidateViewTest.java
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/CandidateViewTest.java
@@ -29,6 +29,7 @@
package org.mozc.android.inputmethod.japanese;
+import static org.easymock.EasyMock.eq;
import static org.easymock.EasyMock.expect;
import static org.easymock.EasyMock.isA;
@@ -41,12 +42,16 @@
import org.mozc.android.inputmethod.japanese.ui.CandidateLayout;
import org.mozc.android.inputmethod.japanese.ui.CandidateLayout.Row;
import org.mozc.android.inputmethod.japanese.ui.CandidateLayouter;
+import org.mozc.android.inputmethod.japanese.ui.InputFrameFoldButtonView;
import org.mozc.android.inputmethod.japanese.ui.ScrollGuideView;
+import org.mozc.android.inputmethod.japanese.view.Skin;
import com.google.common.base.Optional;
-import android.graphics.drawable.Drawable;
import android.test.suitebuilder.annotation.SmallTest;
-import android.widget.ToggleButton;
+import android.view.View;
+import android.widget.LinearLayout;
+
+import org.easymock.EasyMock;
import java.util.Collections;
@@ -73,19 +78,20 @@
ConversionCandidateWordView mockCandidateWordView =
new ConversionCandidateWordView(getInstrumentation().getTargetContext(), null);
ScrollGuideView mockScrollGuideView = createViewMock(ScrollGuideView.class);
- ToggleButton mockInputFrameFoldButton = createViewMockBuilder(ToggleButton.class)
- .addMockedMethod("setBackgroundDrawable")
- .createMock();
+ InputFrameFoldButtonView mockInputFrameFoldButtonView =
+ createViewMock(InputFrameFoldButtonView.class);
CandidateView candidateView = createViewMockBuilder(CandidateView.class)
.addMockedMethods(
"getConversionCandidateWordView", "getScrollGuideView", "getInputFrameFoldButton")
.createMock();
+
expect(candidateView.getConversionCandidateWordView()).andStubReturn(mockCandidateWordView);
expect(candidateView.getScrollGuideView()).andStubReturn(mockScrollGuideView);
- expect(candidateView.getInputFrameFoldButton()).andStubReturn(mockInputFrameFoldButton);
+ expect(candidateView.getInputFrameFoldButton()).andStubReturn(mockInputFrameFoldButtonView);
mockScrollGuideView.setScroller(mockCandidateWordView.scroller);
- mockInputFrameFoldButton.setBackgroundDrawable(isA(Drawable.class));
+ mockInputFrameFoldButtonView.setChecked(false);
+ mockInputFrameFoldButtonView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
replayAll();
candidateView.onFinishInflate();
@@ -171,4 +177,102 @@
assertEquals(0, candidateWordView.getScrollY());
assertNull(candidateWordView.calculatedLayout);
}
+
+ @SmallTest
+ public void testConversionCandidateWordView_inputFrameFoldButtonVisibility() {
+ ConversionCandidateWordView conversionCandidateWordView =
+ new ConversionCandidateWordView(getInstrumentation().getTargetContext(), null);
+ InputFrameFoldButtonView mockInputFrameFoldButtonView =
+ createViewMock(InputFrameFoldButtonView.class);
+ conversionCandidateWordView.inputFrameFoldButtonView = mockInputFrameFoldButtonView;
+ conversionCandidateWordView.foldButtonBackgroundVisibilityThreshold = 50;
+ conversionCandidateWordView.layout(0, 0, 320, 240);
+ conversionCandidateWordView.update(CandidateList.getDefaultInstance());
+
+ conversionCandidateWordView.scrollTo(0, 0);
+
+ // Background should be invisible in [0, 50].
+ resetAll();
+ mockInputFrameFoldButtonView.showBackgroundForScrolled(eq(false));
+ replayAll();
+ conversionCandidateWordView.scrollTo(10, 10);
+ verifyAll();
+
+ resetAll();
+ mockInputFrameFoldButtonView.showBackgroundForScrolled(eq(false));
+ replayAll();
+ conversionCandidateWordView.scrollTo(50, 50);
+ verifyAll();
+
+ // Background becomes visible after 50 and stays invisible in (50, 100).
+ resetAll();
+ mockInputFrameFoldButtonView.showBackgroundForScrolled(eq(true));
+ replayAll();
+ conversionCandidateWordView.scrollTo(51, 51);
+ verifyAll();
+
+ resetAll();
+ mockInputFrameFoldButtonView.showBackgroundForScrolled(eq(true));
+ replayAll();
+ conversionCandidateWordView.scrollTo(90, 90);
+ verifyAll();
+
+ resetAll();
+ mockInputFrameFoldButtonView.showBackgroundForScrolled(eq(true));
+ replayAll();
+ conversionCandidateWordView.scrollTo(100, 100);
+ verifyAll();
+
+ // Test scrolling backward.
+ resetAll();
+ mockInputFrameFoldButtonView.showBackgroundForScrolled(eq(true));
+ replayAll();
+ conversionCandidateWordView.scrollTo(51, 51);
+ verifyAll();
+
+ resetAll();
+ mockInputFrameFoldButtonView.showBackgroundForScrolled(eq(false));
+ replayAll();
+ conversionCandidateWordView.scrollTo(50, 50);
+ verifyAll();
+
+ resetAll();
+ mockInputFrameFoldButtonView.showBackgroundForScrolled(eq(false));
+ replayAll();
+ conversionCandidateWordView.scrollTo(0, 0);
+ verifyAll();
+ }
+
+ @SmallTest
+ public void testSetSkin() {
+ ConversionCandidateWordView mockCandidateWordView =
+ new ConversionCandidateWordView(getInstrumentation().getTargetContext(), null);
+ ScrollGuideView mockScrollGuideView = createViewMock(ScrollGuideView.class);
+ InputFrameFoldButtonView mockInputFrameFoldButtonView =
+ createViewMockBuilder(InputFrameFoldButtonView.class)
+ .addMockedMethods("setSkin")
+ .createMock();
+ LinearLayout mockCandidateWordFrame = createViewMockBuilder(LinearLayout.class)
+ .addMockedMethods("setBackgroundColor")
+ .createMock();
+ CandidateView candidateView = createViewMockBuilder(CandidateView.class)
+ .addMockedMethods(
+ "getConversionCandidateWordView", "getScrollGuideView", "getInputFrameFoldButton",
+ "getCandidateWordFrame")
+ .createMock();
+ expect(candidateView.getConversionCandidateWordView()).andStubReturn(mockCandidateWordView);
+ expect(candidateView.getScrollGuideView()).andStubReturn(mockScrollGuideView);
+ expect(candidateView.getInputFrameFoldButton()).andStubReturn(mockInputFrameFoldButtonView);
+ expect(candidateView.getCandidateWordFrame()).andStubReturn(mockCandidateWordFrame);
+ Skin skin = new Skin();
+ mockCandidateWordView.setSkin(skin);
+ mockScrollGuideView.setSkin(skin);
+ mockInputFrameFoldButtonView.setSkin(skin);
+ mockCandidateWordFrame.setBackgroundColor(EasyMock.anyInt());
+ replayAll();
+
+ candidateView.setSkin(skin);
+
+ verifyAll();
+ }
}
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/CandidateWordViewTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/CandidateWordViewTest.java
index 2a2cc29..db96c05 100644
--- a/src/android/tests/src/com/google/android/inputmethod/japanese/CandidateWordViewTest.java
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/CandidateWordViewTest.java
@@ -48,10 +48,13 @@
import org.mozc.android.inputmethod.japanese.ui.CandidateLayout.Span;
import org.mozc.android.inputmethod.japanese.ui.CandidateLayouter;
import org.mozc.android.inputmethod.japanese.ui.SnapScroller;
+import org.mozc.android.inputmethod.japanese.view.DummyDrawable;
+import org.mozc.android.inputmethod.japanese.view.Skin;
import com.google.common.base.Optional;
import android.annotation.SuppressLint;
import android.content.Context;
+import android.graphics.drawable.Drawable;
import android.test.suitebuilder.annotation.SmallTest;
import android.view.MotionEvent;
import android.view.View;
@@ -74,6 +77,11 @@
// We are not willing to test rendering routine running background of event processing test.
// So just ignore this method's invocation.
}
+
+ @Override
+ protected Drawable getViewBackgroundDrawable(Skin skin) {
+ return DummyDrawable.getInstance();
+ }
}
public static Span createNullCandidateWordSpan(int left, int right) {
@@ -232,17 +240,31 @@
assertTrue(candidateWordView.onTouchEvent(events.get(events.size() - 1)));
verifyAll();
- // Slide within a candidate.
+ // Slide within a candidate (top-left corner).
resetAll();
expect(mockLayout.getRowList()).andStubReturn(ROW_DATA);
candidateSelectListener.onCandidateSelected(
ROW_DATA.get(0).getSpanList().get(0).getCandidateWord().get(), Optional.<Integer>of(0));
replayAll();
- events.add(MotionEvent.obtain(0, 0, MotionEvent.ACTION_DOWN, 20, 10, 0));
+ events.add(MotionEvent.obtain(0, 0, MotionEvent.ACTION_DOWN, 10, 10, 0));
assertTrue(candidateWordView.onTouchEvent(events.get(events.size() - 1)));
- events.add(MotionEvent.obtain(0, 1000, MotionEvent.ACTION_MOVE, 29, 10, 0));
+ events.add(MotionEvent.obtain(0, 1000, MotionEvent.ACTION_MOVE, 12, 10, 0));
assertTrue(candidateWordView.onTouchEvent(events.get(events.size() - 1)));
- events.add(MotionEvent.obtain(0, 2000, MotionEvent.ACTION_UP, 25, 10, 0));
+ events.add(MotionEvent.obtain(0, 2000, MotionEvent.ACTION_UP, 11, 10, 0));
+ assertTrue(candidateWordView.onTouchEvent(events.get(events.size() - 1)));
+ verifyAll();
+
+ // Slide within a candidate (bottom-right corner).
+ resetAll();
+ expect(mockLayout.getRowList()).andStubReturn(ROW_DATA);
+ candidateSelectListener.onCandidateSelected(
+ ROW_DATA.get(0).getSpanList().get(0).getCandidateWord().get(), Optional.<Integer>of(0));
+ replayAll();
+ events.add(MotionEvent.obtain(0, 0, MotionEvent.ACTION_DOWN, 29, 27, 0));
+ assertTrue(candidateWordView.onTouchEvent(events.get(events.size() - 1)));
+ events.add(MotionEvent.obtain(0, 1000, MotionEvent.ACTION_MOVE, 29, 29, 0));
+ assertTrue(candidateWordView.onTouchEvent(events.get(events.size() - 1)));
+ events.add(MotionEvent.obtain(0, 2000, MotionEvent.ACTION_UP, 29, 28, 0));
assertTrue(candidateWordView.onTouchEvent(events.get(events.size() - 1)));
verifyAll();
@@ -250,7 +272,7 @@
resetAll();
expect(mockLayout.getRowList()).andStubReturn(ROW_DATA);
replayAll();
- events.add(MotionEvent.obtain(0, 0, MotionEvent.ACTION_DOWN, 20, 10, 0));
+ events.add(MotionEvent.obtain(0, 0, MotionEvent.ACTION_DOWN, 29, 10, 0));
assertTrue(candidateWordView.onTouchEvent(events.get(events.size() - 1)));
events.add(MotionEvent.obtain(0, 1000, MotionEvent.ACTION_MOVE, 30, 10, 0));
assertTrue(candidateWordView.onTouchEvent(events.get(events.size() - 1)));
@@ -262,13 +284,13 @@
resetAll();
expect(mockLayout.getRowList()).andStubReturn(ROW_DATA);
replayAll();
- events.add(MotionEvent.obtain(0, 0, MotionEvent.ACTION_DOWN, 20, 10, 0));
+ events.add(MotionEvent.obtain(0, 0, MotionEvent.ACTION_DOWN, 29, 10, 0));
assertTrue(candidateWordView.onTouchEvent(events.get(events.size() - 1)));
- events.add(MotionEvent.obtain(0, 1000, MotionEvent.ACTION_MOVE, 31, 10, 0));
+ events.add(MotionEvent.obtain(0, 1000, MotionEvent.ACTION_MOVE, 30, 10, 0));
assertTrue(candidateWordView.onTouchEvent(events.get(events.size() - 1)));
- events.add(MotionEvent.obtain(0, 2000, MotionEvent.ACTION_MOVE, 15, 10, 0));
+ events.add(MotionEvent.obtain(0, 2000, MotionEvent.ACTION_MOVE, 29, 10, 0));
assertTrue(candidateWordView.onTouchEvent(events.get(events.size() - 1)));
- events.add(MotionEvent.obtain(0, 3000, MotionEvent.ACTION_UP, 15, 10, 0));
+ events.add(MotionEvent.obtain(0, 3000, MotionEvent.ACTION_UP, 29, 10, 0));
assertTrue(candidateWordView.onTouchEvent(events.get(events.size() - 1)));
verifyAll();
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/FloatingCandidateViewTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/FloatingCandidateViewTest.java
new file mode 100644
index 0000000..8993913
--- /dev/null
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/FloatingCandidateViewTest.java
@@ -0,0 +1,351 @@
+// Copyright 2010-2014, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package org.mozc.android.inputmethod.japanese;
+
+import org.mozc.android.inputmethod.japanese.protobuf.ProtoCandidates.Annotation;
+import org.mozc.android.inputmethod.japanese.protobuf.ProtoCandidates.Candidates;
+import org.mozc.android.inputmethod.japanese.protobuf.ProtoCandidates.Candidates.Candidate;
+import org.mozc.android.inputmethod.japanese.protobuf.ProtoCandidates.Category;
+import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Command;
+import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Output;
+import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Preedit;
+import org.mozc.android.inputmethod.japanese.testing.ApiLevel;
+import org.mozc.android.inputmethod.japanese.testing.InstrumentationTestCaseWithMock;
+import org.mozc.android.inputmethod.japanese.testing.Parameter;
+import org.mozc.android.inputmethod.japanese.ui.FloatingCandidateLayoutRenderer;
+import org.mozc.android.inputmethod.japanese.ui.FloatingModeIndicator;
+import com.google.common.base.Optional;
+import com.google.common.base.Preconditions;
+
+import android.annotation.TargetApi;
+import android.content.Context;
+import android.content.res.Resources;
+import android.graphics.Matrix;
+import android.graphics.Rect;
+import android.test.suitebuilder.annotation.SmallTest;
+import android.text.InputType;
+import android.view.View;
+import android.view.inputmethod.CursorAnchorInfo;
+import android.view.inputmethod.EditorInfo;
+import android.widget.PopupWindow;
+
+/**
+ * Test for FloatingCandidateView.
+ */
+@ApiLevel(21)
+@TargetApi(21)
+public class FloatingCandidateViewTest extends InstrumentationTestCaseWithMock {
+
+ private class FloatingCandidateLayoutRendererMock extends FloatingCandidateLayoutRenderer {
+
+ private Optional<Rect> windowRect = Optional.absent();
+
+ public FloatingCandidateLayoutRendererMock(Resources resources) {
+ super(resources);
+ }
+
+ public void setWindowRect(Optional<Rect> rect) {
+ this.windowRect = Preconditions.checkNotNull(rect);
+ }
+
+ @Override
+ public Optional<Rect> getWindowRect() {
+ if (windowRect.isPresent()) {
+ return Optional.of(new Rect(windowRect.get()));
+ }
+ return Optional.absent();
+ }
+ }
+
+ private Command generateCommandsProto(
+ int candidatesNum, int highlightedPosition, Category category) {
+ Preconditions.checkArgument(0 <= candidatesNum && candidatesNum < 10);
+ Preconditions.checkNotNull(category);
+
+ Candidates.Builder candidatesBuilder = Candidates.newBuilder();
+ for (int i = 0; i < candidatesNum; ++i) {
+ candidatesBuilder.addCandidate(Candidate.newBuilder()
+ .setIndex(i)
+ .setValue("cand_" + Integer.toString(i))
+ .setId(i)
+ .setAnnotation(Annotation.newBuilder().setShortcut(Integer.toString(i + 1))));
+ }
+ candidatesBuilder.setSize(candidatesNum);
+ candidatesBuilder.setPosition(0);
+ candidatesBuilder.setCategory(category);
+
+ return Command.newBuilder()
+ .setOutput(Output.newBuilder()
+ .setCandidates(candidatesBuilder)
+ .setPreedit(Preedit.newBuilder()
+ .setHighlightedPosition(highlightedPosition)
+ .setCursor(0)))
+ .buildPartial();
+ }
+
+ /**
+ * Pop-up window mock to avoid BadTokenException on {@link PopupWindow#showAtLocation} on test.
+ */
+ private class PopupWindowMock extends PopupWindow {
+ private boolean isShowing;
+
+ @Override
+ public void showAtLocation(View parent, int gravity, int x, int y) {
+ isShowing = true;
+ }
+
+ @Override
+ public void update(int left, int top, int right, int bottom) {
+ }
+
+ @Override
+ public void dismiss() {
+ isShowing = false;
+ }
+
+ @Override
+ public boolean isShowing() {
+ return isShowing;
+ }
+ }
+
+ @SmallTest
+ public void testCandidateWindowPositionWithMock() {
+ Context context = getInstrumentation().getTargetContext();
+ Resources resources = context.getResources();
+ FloatingCandidateLayoutRendererMock layoutRendererMock =
+ new FloatingCandidateLayoutRendererMock(resources);
+ int windowVerticalMargin =
+ resources.getDimensionPixelSize(R.dimen.floating_candidate_window_vertical_margin);
+ int windowHorizontalMargin =
+ resources.getDimensionPixelSize(R.dimen.floating_candidate_window_horizontal_margin);
+
+ FloatingModeIndicator modeIndicatorMock = createMockBuilder(FloatingModeIndicator.class)
+ .withConstructor(createViewMockBuilder(View.class).createNiceMock())
+ .createNiceMock();
+ FloatingCandidateView view = new FloatingCandidateView(
+ context, new PopupWindowMock(), layoutRendererMock, modeIndicatorMock);
+
+ // A candidate window is invisible.
+ layoutRendererMock.setWindowRect(Optional.<Rect>absent());
+ view.layout(0, 0, 1000, 2000);
+ assertFalse(view.getVisibleRect().isPresent());
+
+ // A candidate window is visible.
+ Rect windowRect = new Rect(-10, 0, 90, 50);
+ layoutRendererMock.setWindowRect(Optional.of(windowRect));
+
+ Command command = generateCommandsProto(1, 0, Category.CONVERSION);
+ view.setCandidates(command);
+
+ // No composition. (insertion marker location only)
+ CursorAnchorInfo.Builder builder = new CursorAnchorInfo.Builder();
+ builder.setInsertionMarkerLocation(200, 1000, 250, 1020,
+ CursorAnchorInfo.FLAG_HAS_VISIBLE_REGION);
+ builder.setMatrix(new Matrix());
+ view.setCursorAnchorInfo(builder.build());
+ Rect rect = view.getVisibleRect().get();
+ assertEquals(190, rect.left);
+ assertEquals(1020 + windowVerticalMargin, rect.top);
+ assertEquals(windowRect.width(), rect.width());
+ assertEquals(windowRect.height(), rect.height());
+
+ // One composition character.
+ // The left corner of a candidate window touches view.
+ builder.addCharacterBounds(0, 0, 1000, 100, 1020,
+ CursorAnchorInfo.FLAG_HAS_VISIBLE_REGION);
+ builder.setComposingText(0, "a");
+ view.setCursorAnchorInfo(builder.build());
+ rect = view.getVisibleRect().get();
+ assertEquals(windowHorizontalMargin, rect.left);
+ assertEquals(1020 + windowVerticalMargin, rect.top);
+ assertEquals(windowRect.width(), rect.width());
+ assertEquals(windowRect.height(), rect.height());
+
+ // Two composition characters. (1st character is highlighted)
+ // The left corner of a candidate window touches view.
+ builder.addCharacterBounds(1, 100, 1000, 150, 1020,
+ CursorAnchorInfo.FLAG_HAS_VISIBLE_REGION);
+ view.setCursorAnchorInfo(builder.build());
+ rect = view.getVisibleRect().get();
+ assertEquals(windowHorizontalMargin, rect.left);
+ assertEquals(1020 + windowVerticalMargin, rect.top);
+ assertEquals(windowRect.width(), rect.width());
+ assertEquals(windowRect.height(), rect.height());
+
+ // Two composition characters (2nd character is highlighted)
+ command = generateCommandsProto(1, 1, Category.CONVERSION);
+ view.setCandidates(command);
+ rect = view.getVisibleRect().get();
+ assertEquals(90, rect.left);
+ assertEquals(1020 + windowVerticalMargin, rect.top);
+ assertEquals(windowRect.width(), rect.width());
+ assertEquals(windowRect.height(), rect.height());
+
+ // Change view width.
+ // The right corner of a candidate window touches view.
+ view.layout(0, 0, 50 + windowRect.width(), 2000);
+ rect = view.getVisibleRect().get();
+ assertEquals(50 - windowHorizontalMargin, rect.left);
+ assertEquals(1020 + windowVerticalMargin, rect.top);
+ assertEquals(windowRect.width(), rect.width());
+ assertEquals(windowRect.height(), rect.height());
+
+ // Change view height.
+ // A candidate window is over a composition text.
+ view.layout(0, 0, 50 + windowRect.width(), 1020);
+ rect = view.getVisibleRect().get();
+ assertEquals(50 - windowHorizontalMargin, rect.left);
+ assertEquals(1000 - windowRect.height() - windowVerticalMargin, rect.top);
+ assertEquals(windowRect.width(), rect.width());
+ assertEquals(windowRect.height(), rect.height());
+ }
+
+ @SmallTest
+ public void testCandidateWindowPositionWithoutMock() {
+ FloatingCandidateView view = new FloatingCandidateView(
+ getInstrumentation().getTargetContext(), new PopupWindowMock());
+ view.layout(0, 0, 1000, 2000);
+
+ assertFalse(view.getVisibleRect().isPresent());
+
+ view.setCandidates(generateCommandsProto(1, 0, Category.CONVERSION));
+ assertTrue(view.getVisibleRect().isPresent());
+
+ view.setCandidates(generateCommandsProto(0, 0, Category.CONVERSION));
+ assertFalse(view.getVisibleRect().isPresent());
+ }
+
+ @SmallTest
+ public void testSuppressSuggestion() {
+ FloatingCandidateView view = new FloatingCandidateView(
+ getInstrumentation().getTargetContext(), new PopupWindowMock());
+ view.layout(0, 0, 1000, 2000);
+
+ Command suggestionCommand = generateCommandsProto(1, 0, Category.SUGGESTION);
+ Command conversionCommand = generateCommandsProto(1, 0, Category.CONVERSION);
+
+ view.setCandidates(suggestionCommand);
+ assertTrue(view.getVisibleRect().isPresent());
+
+ class Data extends Parameter {
+ public final int inputClass;
+ public final int flags;
+ public final int variations;
+ public final boolean expectedSuppressSuggestions;
+ public Data(int inputClass, int flags, int variations, boolean expectedSuppressSuggestions) {
+ Preconditions.checkArgument(inputClass == (inputClass & InputType.TYPE_MASK_CLASS));
+ Preconditions.checkArgument(flags == (flags & InputType.TYPE_MASK_FLAGS));
+ Preconditions.checkArgument(variations == (variations & InputType.TYPE_MASK_VARIATION));
+ this.inputClass = inputClass;
+ this.flags = flags;
+ this.variations = variations;
+ this.expectedSuppressSuggestions = expectedSuppressSuggestions;
+ }
+ }
+
+ Data testDataArray[] = {
+ new Data(InputType.TYPE_CLASS_DATETIME, 0, InputType.TYPE_TEXT_VARIATION_NORMAL, true),
+ new Data(InputType.TYPE_CLASS_DATETIME, 0, InputType.TYPE_TEXT_VARIATION_PASSWORD, true),
+ new Data(InputType.TYPE_CLASS_DATETIME, InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS,
+ InputType.TYPE_TEXT_VARIATION_NORMAL, true),
+ new Data(InputType.TYPE_CLASS_DATETIME, InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS,
+ InputType.TYPE_TEXT_VARIATION_PASSWORD, true),
+
+ new Data(InputType.TYPE_CLASS_NUMBER, 0, InputType.TYPE_TEXT_VARIATION_NORMAL, true),
+ new Data(InputType.TYPE_CLASS_NUMBER, 0, InputType.TYPE_TEXT_VARIATION_PASSWORD, true),
+ new Data(InputType.TYPE_CLASS_NUMBER, InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS,
+ InputType.TYPE_TEXT_VARIATION_NORMAL, true),
+ new Data(InputType.TYPE_CLASS_NUMBER, InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS,
+ InputType.TYPE_TEXT_VARIATION_PASSWORD, true),
+
+ new Data(InputType.TYPE_CLASS_PHONE, 0, InputType.TYPE_TEXT_VARIATION_NORMAL, true),
+ new Data(InputType.TYPE_CLASS_PHONE, 0, InputType.TYPE_TEXT_VARIATION_PASSWORD, true),
+ new Data(InputType.TYPE_CLASS_PHONE, InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS,
+ InputType.TYPE_TEXT_VARIATION_NORMAL, true),
+ new Data(InputType.TYPE_CLASS_PHONE, InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS,
+ InputType.TYPE_TEXT_VARIATION_PASSWORD, true),
+
+ new Data(InputType.TYPE_CLASS_TEXT, 0, InputType.TYPE_TEXT_VARIATION_NORMAL, false),
+ new Data(InputType.TYPE_CLASS_TEXT, 0, InputType.TYPE_TEXT_VARIATION_PASSWORD, true),
+ new Data(InputType.TYPE_CLASS_TEXT, InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS,
+ InputType.TYPE_TEXT_VARIATION_NORMAL, true),
+ new Data(InputType.TYPE_CLASS_TEXT, InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS,
+ InputType.TYPE_TEXT_VARIATION_PASSWORD, true),
+
+ new Data(InputType.TYPE_CLASS_TEXT, InputType.TYPE_TEXT_FLAG_AUTO_COMPLETE,
+ InputType.TYPE_TEXT_VARIATION_NORMAL, true),
+ new Data(InputType.TYPE_CLASS_TEXT, InputType.TYPE_TEXT_FLAG_AUTO_CORRECT,
+ InputType.TYPE_TEXT_VARIATION_NORMAL, false),
+ new Data(InputType.TYPE_CLASS_TEXT, InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS,
+ InputType.TYPE_TEXT_VARIATION_NORMAL, false),
+ new Data(InputType.TYPE_CLASS_TEXT, InputType.TYPE_TEXT_FLAG_CAP_SENTENCES,
+ InputType.TYPE_TEXT_VARIATION_NORMAL, false),
+ new Data(InputType.TYPE_CLASS_TEXT, InputType.TYPE_TEXT_FLAG_CAP_WORDS,
+ InputType.TYPE_TEXT_VARIATION_NORMAL, false),
+ new Data(InputType.TYPE_CLASS_TEXT, InputType.TYPE_TEXT_FLAG_IME_MULTI_LINE,
+ InputType.TYPE_TEXT_VARIATION_NORMAL, false),
+ new Data(InputType.TYPE_CLASS_TEXT, InputType.TYPE_TEXT_FLAG_MULTI_LINE,
+ InputType.TYPE_TEXT_VARIATION_NORMAL, false),
+ new Data(InputType.TYPE_CLASS_TEXT, InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS,
+ InputType.TYPE_TEXT_VARIATION_NORMAL, true),
+
+ new Data(InputType.TYPE_CLASS_TEXT, 0, InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS, true),
+ new Data(InputType.TYPE_CLASS_TEXT, 0, InputType.TYPE_TEXT_VARIATION_EMAIL_SUBJECT, false),
+ new Data(InputType.TYPE_CLASS_TEXT, 0, InputType.TYPE_TEXT_VARIATION_FILTER, true),
+ new Data(InputType.TYPE_CLASS_TEXT, 0, InputType.TYPE_TEXT_VARIATION_LONG_MESSAGE, false),
+ new Data(InputType.TYPE_CLASS_TEXT, 0, InputType.TYPE_TEXT_VARIATION_NORMAL, false),
+ new Data(InputType.TYPE_CLASS_TEXT, 0, InputType.TYPE_TEXT_VARIATION_PASSWORD, true),
+ new Data(InputType.TYPE_CLASS_TEXT, 0, InputType.TYPE_TEXT_VARIATION_PERSON_NAME, false),
+ new Data(InputType.TYPE_CLASS_TEXT, 0, InputType.TYPE_TEXT_VARIATION_PHONETIC, false),
+ new Data(InputType.TYPE_CLASS_TEXT, 0, InputType.TYPE_TEXT_VARIATION_POSTAL_ADDRESS, false),
+ new Data(InputType.TYPE_CLASS_TEXT, 0, InputType.TYPE_TEXT_VARIATION_SHORT_MESSAGE, false),
+ new Data(InputType.TYPE_CLASS_TEXT, 0, InputType.TYPE_TEXT_VARIATION_URI, true),
+ new Data(InputType.TYPE_CLASS_TEXT, 0, InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD,
+ true),
+ new Data(InputType.TYPE_CLASS_TEXT, 0, InputType.TYPE_TEXT_VARIATION_WEB_EDIT_TEXT, false),
+ new Data(InputType.TYPE_CLASS_TEXT, 0, InputType.TYPE_TEXT_VARIATION_WEB_EMAIL_ADDRESS,
+ true),
+ new Data(InputType.TYPE_CLASS_TEXT, 0, InputType.TYPE_TEXT_VARIATION_WEB_PASSWORD, true),
+ };
+
+ for (Data data : testDataArray) {
+ EditorInfo editorInfo = new EditorInfo();
+ editorInfo.inputType = data.inputClass | data.flags | data.variations;
+ view.setEditorInfo(editorInfo);
+ view.setCandidates(suggestionCommand);
+ assertEquals(data.toString(),
+ data.expectedSuppressSuggestions, !view.getVisibleRect().isPresent());
+
+ view.setCandidates(conversionCommand);
+ assertTrue(view.getVisibleRect().isPresent());
+ }
+ }
+}
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/InOutAnimatedFrameLayoutTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/InOutAnimatedFrameLayoutTest.java
index bae0a8b..ecfed59 100644
--- a/src/android/tests/src/com/google/android/inputmethod/japanese/InOutAnimatedFrameLayoutTest.java
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/InOutAnimatedFrameLayoutTest.java
@@ -159,7 +159,6 @@
int[] nextVisibilities = {View.VISIBLE, View.INVISIBLE, View.GONE};
for (int nextVisibility : nextVisibilities) {
- int currentVisibility = view.getVisibility();
resetAll();
onVisibilityChangeListener.onVisibilityChange();
replayAll();
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/JapaneseKeyboardFactoryTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/JapaneseKeyboardFactoryTest.java
deleted file mode 100644
index 09748df..0000000
--- a/src/android/tests/src/com/google/android/inputmethod/japanese/JapaneseKeyboardFactoryTest.java
+++ /dev/null
@@ -1,106 +0,0 @@
-// Copyright 2010-2014, Google Inc.
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-package org.mozc.android.inputmethod.japanese;
-
-import org.mozc.android.inputmethod.japanese.JapaneseKeyboard.KeyboardSpecification;
-
-import android.content.res.Resources;
-import android.graphics.Rect;
-import android.test.InstrumentationTestCase;
-
-/**
- */
-public class JapaneseKeyboardFactoryTest extends InstrumentationTestCase {
-
- public void testGet() {
- Resources resources = getInstrumentation().getTargetContext().getResources();
- // With portrait/landscape keyboard size for HVGA display;
- Rect portrait = new Rect(0, 0, 320, 480);
- Rect landscape = new Rect(0, 0, 480, 320);
-
- JapaneseKeyboardFactory factory = new JapaneseKeyboardFactory();
-
- // Tests for portrait ones.
- JapaneseKeyboard portraitTwelveKeyKeyboard =
- factory.get(resources, KeyboardSpecification.TWELVE_KEY_TOGGLE_KANA, portrait.width(),
- portrait.height());
- assertNotNull(portraitTwelveKeyKeyboard);
-
- JapaneseKeyboard portraitQwertyKeyboard =
- factory.get(resources, KeyboardSpecification.QWERTY_KANA, portrait.width(),
- portrait.height());
- assertNotNull(portraitQwertyKeyboard);
-
- // Those instances should be different.
- assertNotSame(portraitTwelveKeyKeyboard, portraitQwertyKeyboard);
-
- // The same instance should be returned for same resource and specification.
- assertSame(portraitTwelveKeyKeyboard,
- factory.get(resources, KeyboardSpecification.TWELVE_KEY_TOGGLE_KANA,
- portrait.width(), portrait.height()));
- assertSame(portraitQwertyKeyboard,
- factory.get(resources, KeyboardSpecification.QWERTY_KANA, portrait.width(),
- portrait.height()));
-
- // Then tests for landscape ones. The keyboards for landscape should be different from portrait
- // ones.
- JapaneseKeyboard landscapeTwelveKeyKeyboard =
- factory.get(resources, KeyboardSpecification.TWELVE_KEY_TOGGLE_KANA, landscape.width(),
- landscape.height());
- assertNotNull(landscapeTwelveKeyKeyboard);
- assertNotSame(portraitTwelveKeyKeyboard, landscapeTwelveKeyKeyboard);
-
- JapaneseKeyboard landscapeQwertyKeyboard =
- factory.get(resources, KeyboardSpecification.QWERTY_KANA, landscape.width(),
- landscape.height());
- assertNotNull(landscapeQwertyKeyboard);
- assertNotSame(portraitQwertyKeyboard, landscapeQwertyKeyboard);
-
- // Those instances should be different.
- assertNotSame(landscapeTwelveKeyKeyboard, landscapeQwertyKeyboard);
-
- // The same instance should be returned for same resource and specification.
- assertSame(landscapeTwelveKeyKeyboard,
- factory.get(resources, KeyboardSpecification.TWELVE_KEY_TOGGLE_KANA,
- landscape.width(), landscape.height()));
- assertSame(landscapeQwertyKeyboard,
- factory.get(resources, KeyboardSpecification.QWERTY_KANA, landscape.width(),
- landscape.height()));
-
- // Assuming the cache is large enough, the same instance should be used for portrait even after
- // we load ones for landscape.
- assertSame(portraitTwelveKeyKeyboard,
- factory.get(resources, KeyboardSpecification.TWELVE_KEY_TOGGLE_KANA,
- portrait.width(), portrait.height()));
- assertSame(portraitQwertyKeyboard,
- factory.get(resources, KeyboardSpecification.QWERTY_KANA, portrait.width(),
- portrait.height()));
- }
-}
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/JapaneseKeyboardParserTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/JapaneseKeyboardParserTest.java
deleted file mode 100644
index 4b7a0ad..0000000
--- a/src/android/tests/src/com/google/android/inputmethod/japanese/JapaneseKeyboardParserTest.java
+++ /dev/null
@@ -1,65 +0,0 @@
-// Copyright 2010-2014, Google Inc.
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-package org.mozc.android.inputmethod.japanese;
-
-import org.mozc.android.inputmethod.japanese.JapaneseKeyboard.KeyboardSpecification;
-import org.mozc.android.inputmethod.japanese.resources.R;
-
-import android.content.res.Resources;
-import android.content.res.Resources.NotFoundException;
-import android.test.InstrumentationTestCase;
-import android.test.suitebuilder.annotation.SmallTest;
-
-import org.xmlpull.v1.XmlPullParserException;
-
-import java.io.IOException;
-
-/**
- */
-public class JapaneseKeyboardParserTest extends InstrumentationTestCase {
- @SmallTest
- public void testParseKeyboard()
- throws NotFoundException, XmlPullParserException, IOException {
- // The only diff from KeyboardParser, the base of this class, is
- // that the result type is JapaneseKeyboard, and it has a corresponding
- // specification.
- Resources resources = getInstrumentation().getTargetContext().getResources();
- JapaneseKeyboardParser parser = new JapaneseKeyboardParser(
- resources, resources.getXml(R.xml.kbd_12keys_kana),
- KeyboardSpecification.TWELVE_KEY_TOGGLE_KANA, 480, 200);
-
- // ClassCastException shouldn't be raised.
- JapaneseKeyboard keyboard = parser.parseKeyboard();
-
- // The keyboard should have specified Specification.
- assertEquals(KeyboardSpecification.TWELVE_KEY_TOGGLE_KANA,
- keyboard.getSpecification());
- }
-}
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/JapaneseKeyboardTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/JapaneseKeyboardTest.java
deleted file mode 100644
index 8f6e224..0000000
--- a/src/android/tests/src/com/google/android/inputmethod/japanese/JapaneseKeyboardTest.java
+++ /dev/null
@@ -1,121 +0,0 @@
-// Copyright 2010-2014, Google Inc.
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-package org.mozc.android.inputmethod.japanese;
-
-import org.mozc.android.inputmethod.japanese.JapaneseKeyboard.KeyboardSpecification;
-import org.mozc.android.inputmethod.japanese.keyboard.ProbableKeyEventGuesser;
-import org.mozc.android.inputmethod.japanese.resources.R;
-
-import android.app.Instrumentation;
-import android.content.res.Configuration;
-import android.content.res.Resources;
-import android.content.res.Resources.NotFoundException;
-import android.test.InstrumentationTestCase;
-import android.test.suitebuilder.annotation.SmallTest;
-
-import org.xmlpull.v1.XmlPullParserException;
-
-import java.io.IOException;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-/**
- */
-public class JapaneseKeyboardTest extends InstrumentationTestCase {
- public static JapaneseKeyboard createJapaneseKeyboard(KeyboardSpecification spec,
- Instrumentation instrumentation) {
- Resources resources = instrumentation.getTargetContext().getResources();
- JapaneseKeyboardParser parser = new JapaneseKeyboardParser(
- resources, resources.getXml(spec.getXmlLayoutResourceId()), spec, 480, 200);
- try {
- return parser.parseKeyboard();
- } catch (NotFoundException e) {
- fail(e.getMessage());
- } catch (XmlPullParserException e) {
- fail(e.getMessage());
- } catch (IOException e) {
- fail(e.getMessage());
- }
-
- throw new AssertionError("Should never reach here");
- }
-
- @SmallTest
- public void testConstructor() {
- for (KeyboardSpecification specification : KeyboardSpecification.values()) {
- // when ResourceId is 0, it means this specification has no Keyboard
- if (specification.getXmlLayoutResourceId() == 0) {
- continue;
- }
- // Make sure that all specification has corresponding JapaneseKeyboard instance,
- // and it has the given specification.
- JapaneseKeyboard keyboard = createJapaneseKeyboard(specification, getInstrumentation());
- assertEquals(specification.toString(), specification, keyboard.getSpecification());
- }
- }
-
- @SmallTest
- public void testGetKeyboardName() {
- Pattern pattern = Pattern.compile("^(\\w+)-(\\d+)\\.(\\d+)\\.(\\d+)-(\\w+)$");
- Configuration configuration = new Configuration();
- for (KeyboardSpecification specification : KeyboardSpecification.values()) {
- for (int orientation : new int[] {Configuration.ORIENTATION_PORTRAIT,
- Configuration.ORIENTATION_LANDSCAPE}) {
- configuration.orientation = orientation;
- KeyboardSpecificationName keyboardSpecificationName =
- specification.getKeyboardSpecificationName();
- String name = keyboardSpecificationName.formattedKeyboardName(configuration);
- Matcher matcher = pattern.matcher(name);
- assertTrue(matcher.matches());
- assertEquals(keyboardSpecificationName.baseName, matcher.group(1));
- assertEquals(Integer.toString(keyboardSpecificationName.major), matcher.group(2));
- assertEquals(Integer.toString(keyboardSpecificationName.minor), matcher.group(3));
- assertEquals(Integer.toString(keyboardSpecificationName.revision), matcher.group(4));
- assertEquals(KeyboardSpecificationName.getDeviceOrientationString(configuration),
- matcher.group(5));
- }
- }
- }
-
- @SmallTest
- public void testGetKeycodeMapper() {
- ProbableKeyEventGuesser guesser =
- new ProbableKeyEventGuesser(getInstrumentation().getTargetContext().getAssets());
- Configuration configuration = new Configuration();
- configuration.orientation = Configuration.ORIENTATION_LANDSCAPE;
- guesser.setConfiguration(configuration);
- Resources resources = getInstrumentation().getTargetContext().getResources();
-
- JapaneseKeyboard godanKana = JapaneseKeyboardTest.createJapaneseKeyboard(
- KeyboardSpecification.GODAN_KANA, getInstrumentation());
- assertEquals(resources.getInteger(R.integer.uchar_digit_two), godanKana.getKeyCode(10));
- assertEquals(Integer.MIN_VALUE, godanKana.getKeyCode(123456)); // No corresponding key,
- }
-}
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/JapaneseKeyboardViewTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/JapaneseKeyboardViewTest.java
deleted file mode 100644
index 6a7bf9b..0000000
--- a/src/android/tests/src/com/google/android/inputmethod/japanese/JapaneseKeyboardViewTest.java
+++ /dev/null
@@ -1,176 +0,0 @@
-// Copyright 2010-2014, Google Inc.
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-package org.mozc.android.inputmethod.japanese;
-
-import static org.easymock.EasyMock.eq;
-
-import org.mozc.android.inputmethod.japanese.JapaneseKeyboard.KeyboardSpecification;
-import org.mozc.android.inputmethod.japanese.keyboard.KeyEventHandler;
-import org.mozc.android.inputmethod.japanese.keyboard.KeyboardActionListener;
-import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Input.TouchEvent;
-import org.mozc.android.inputmethod.japanese.resources.R;
-import org.mozc.android.inputmethod.japanese.testing.InstrumentationTestCaseWithMock;
-import org.mozc.android.inputmethod.japanese.testing.MainThreadRunner;
-import org.mozc.android.inputmethod.japanese.testing.Parameter;
-
-import android.app.Activity;
-import android.content.res.Resources;
-import android.content.res.Resources.NotFoundException;
-import android.os.Looper;
-import android.test.suitebuilder.annotation.SmallTest;
-import android.util.DisplayMetrics;
-import android.view.MotionEvent;
-
-import org.easymock.EasyMock;
-import org.xmlpull.v1.XmlPullParserException;
-
-import java.io.IOException;
-import java.util.List;
-
-/**
- */
-public class JapaneseKeyboardViewTest extends InstrumentationTestCaseWithMock {
- private static final int STEP_COUNT = 20;
- private static final int NUM_ROWS = 4;
-
- // TODO(hidehiko): Get rid of hard coded parameter (21.8) and split the dependency to the real
- // resources from functional unittests (instead, we should have test cases for resources
- // or regression tests independently).
- private static int getKeyWidth(Resources resources) {
- DisplayMetrics displayMetrics = resources.getDisplayMetrics();
- return (int) Math.round(displayMetrics.widthPixels * 21.8);
- }
-
- private static int getTwelveKeysLayoutKeyHeight(Resources resources) {
- return resources.getDimensionPixelOffset(R.dimen.input_frame_height) / 4;
- }
-
- private static void drag(MainThreadRunner mainThreadRunner, JapaneseKeyboardView view,
- int fromX, int toX, int fromY, int toY) {
- long downTime = MozcUtil.getUptimeMillis();
- long eventTime = MozcUtil.getUptimeMillis();
-
- mainThreadRunner.onTouchEvent(
- view, MotionEvent.obtain(downTime, eventTime, MotionEvent.ACTION_DOWN, fromX, fromY, 0));
-
- for (int i = 1; i < STEP_COUNT; ++i) {
- int x = fromX + (toX - fromX) * i / STEP_COUNT;
- int y = fromY + (toY - fromY) * i / STEP_COUNT;
-
- eventTime = MozcUtil.getUptimeMillis();
- mainThreadRunner.onTouchEvent(
- view, MotionEvent.obtain(downTime, eventTime, MotionEvent.ACTION_MOVE, x, y, 0));
- }
-
- eventTime = MozcUtil.getUptimeMillis();
- mainThreadRunner.onTouchEvent(
- view, MotionEvent.obtain(downTime, eventTime, MotionEvent.ACTION_UP, toX, toY, 0));
- }
-
- private JapaneseKeyboard createJapaneseKeyboard(KeyboardSpecification spec,
- int width, int height) {
- Resources resources = getInstrumentation().getTargetContext().getResources();
- JapaneseKeyboardParser parser = new JapaneseKeyboardParser(
- resources, resources.getXml(spec.getXmlLayoutResourceId()), spec, width, height);
- try {
- return parser.parseKeyboard();
- } catch (NotFoundException e) {
- fail(e.getMessage());
- } catch (XmlPullParserException e) {
- fail(e.getMessage());
- } catch (IOException e) {
- fail(e.getMessage());
- }
-
- throw new AssertionError("Should never reach here");
- }
-
- @SmallTest
- public void testFlick() {
- JapaneseKeyboardView view = new JapaneseKeyboardView(getInstrumentation().getTargetContext());
- Activity activity = launchActivity(
- getInstrumentation().getTargetContext().getPackageName(), Activity.class, null);
- try {
- MainThreadRunner mainThreadRunner = new MainThreadRunner(getInstrumentation());
- mainThreadRunner.setContentView(activity, view);
- Resources resources = getInstrumentation().getTargetContext().getResources();
- int keyWidth = getKeyWidth(resources);
- int keyHeight = getTwelveKeysLayoutKeyHeight(resources);
- int width = resources.getDisplayMetrics().widthPixels;
- int height = keyHeight * NUM_ROWS;
- mainThreadRunner.setJapaneseKeyboard(
- view, createJapaneseKeyboard(KeyboardSpecification.TWELVE_KEY_FLICK_KANA, width, height));
- mainThreadRunner.layout(view, 0, 0, width, height);
-
- // Move center to up.
- int fromX = view.getWidth() / 2;
- int fromY = view.getHeight() / 2 - keyHeight / 2;
-
- class TestData extends Parameter {
- final int toX;
- final int toY;
- final int expectedCode;
- TestData(int toX, int toY, int expectedCode) {
- this.toX = toX;
- this.toY = toY;
- this.expectedCode = expectedCode;
- }
- }
- TestData[] testDataList = {
- new TestData(fromX - keyWidth, fromY, 'j'), // Left
- new TestData(fromX + keyWidth, fromY, 'l'), // Right
- new TestData(fromX, fromY - keyWidth, 'k'), // Up
- new TestData(fromX, fromY + keyWidth, '%'), // Down
- };
-
- KeyboardActionListener keyboardActionListener = createMock(KeyboardActionListener.class);
- KeyEventHandler keyEventHandler =
- new KeyEventHandler(Looper.myLooper(), keyboardActionListener, 0, 0, 0);
- for (TestData testData : testDataList) {
- resetAll();
- keyboardActionListener.onPress('5');
- keyboardActionListener.onKey(
- eq(testData.expectedCode), EasyMock.<List<TouchEvent>>notNull());
- keyboardActionListener.onRelease('5');
- replayAll();
-
- view.setKeyEventHandler(keyEventHandler);
- drag(mainThreadRunner, view, fromX, testData.toX, fromY, testData.toY);
- view.setKeyEventHandler(null);
-
- verifyAll();
- }
- } finally {
- if (activity != null) {
- activity.finish();
- }
- }
- }
-}
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/KeyEventButtonTouchListenerTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/KeyEventButtonTouchListenerTest.java
index 4652b80..8171ca4 100644
--- a/src/android/tests/src/com/google/android/inputmethod/japanese/KeyEventButtonTouchListenerTest.java
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/KeyEventButtonTouchListenerTest.java
@@ -33,6 +33,7 @@
import static org.easymock.EasyMock.expect;
import static org.easymock.EasyMock.isA;
+import org.mozc.android.inputmethod.japanese.keyboard.BackgroundDrawableFactory.DrawableType;
import org.mozc.android.inputmethod.japanese.keyboard.Key;
import org.mozc.android.inputmethod.japanese.keyboard.Key.Stick;
import org.mozc.android.inputmethod.japanese.keyboard.KeyEventContext;
@@ -70,8 +71,9 @@
}
private KeyEventContext createKeyEventContextMock() {
- Key key = new Key(0, 0, 0, 0, 0, 0, false, false, false, Stick.EVEN,
- Collections.<KeyState>emptyList());
+ Key key = new Key(0, 0, 0, 0, 0, 0, false, false, Stick.EVEN,
+ DrawableType.TWELVEKEYS_REGULAR_KEY_BACKGROUND,
+ Collections.<KeyState>emptyList());
return createMockBuilder(KeyEventContext.class)
.withConstructor(Key.class, int.class, float.class, float.class,
int.class, int.class, float.class, Set.class)
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/KeyEventScenarioTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/KeyEventScenarioTest.java
index 1efb658..e4c2b0e 100644
--- a/src/android/tests/src/com/google/android/inputmethod/japanese/KeyEventScenarioTest.java
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/KeyEventScenarioTest.java
@@ -30,9 +30,8 @@
package org.mozc.android.inputmethod.japanese;
import org.mozc.android.inputmethod.japanese.DependencyFactory.Dependency;
-import org.mozc.android.inputmethod.japanese.JapaneseKeyboard.KeyboardSpecification;
import org.mozc.android.inputmethod.japanese.KeycodeConverter.KeyEventInterface;
-import org.mozc.android.inputmethod.japanese.hardwarekeyboard.HardwareKeyboard.CompositionSwitchMode;
+import org.mozc.android.inputmethod.japanese.keyboard.Keyboard.KeyboardSpecification;
import org.mozc.android.inputmethod.japanese.preference.ClientSidePreference.HardwareKeyMap;
import org.mozc.android.inputmethod.japanese.preference.ClientSidePreference.InputStyle;
import org.mozc.android.inputmethod.japanese.preference.ClientSidePreference.KeyboardLayout;
@@ -76,7 +75,7 @@
private void verifyKeyboardSpecificationInView(KeyboardSpecification specification) {
waitForExecution();
- assertEquals(specification, service.viewManager.getJapaneseKeyboardSpecification());
+ assertEquals(specification, service.viewManager.getKeyboardSpecification());
}
private void verifyKeyboardSpecificationInService(KeyboardSpecification specification) {
@@ -157,7 +156,7 @@
}
private void setHardwareKeyMap(HardwareKeyMap keyMap) {
- service.hardwareKeyboard.setHardwareKeyMap(keyMap);
+ service.viewManager.setHardwareKeyMap(keyMap);
}
private void setKeyboardSpecification(KeyboardLayout layout, InputStyle inputStyle) {
@@ -165,10 +164,6 @@
service.viewManager.setInputStyle(inputStyle);
}
- private void changeHardwareKeyboardCompositionMode(CompositionSwitchMode mode) {
- service.getViewEventListener().onHardwareKeyboardCompositionModeChange(mode);
- }
-
// Waits for all the execution of the session executor.
// Expected to be called from verify* methods.
private void waitForExecution() {
@@ -283,85 +278,43 @@
}
/**
- * If h/w keyboard sends some special keys, narrow mode is not shown.
+ * Even if h/w keyboard sends some special keys, transition to narrow mode happens.
*/
- public void testHardwareSpecialKeyEvent_ShouldNotShowNarrowMode() {
+ public void testHardwareSpecialKeyEvent_TransitionToNarrowMode() {
createService(DependencyFactory.TOUCH_FRAGMENT_PREF);
setHardwareKeyMap(HardwareKeyMap.DEFAULT);
- verifyNarrowMode(false);
+ setKeyboardSpecification(KeyboardLayout.TWELVE_KEYS, InputStyle.TOGGLE_FLICK);
verifyKeyboardSpecificationInView(KeyboardSpecification.TWELVE_KEY_TOGGLE_FLICK_KANA);
verifyKeyboardSpecificationInService(KeyboardSpecification.TWELVE_KEY_TOGGLE_FLICK_KANA);
+
+ verifyNarrowMode(false);
hardwareKeyEvent(KeyEvent.KEYCODE_ENTER, 0, 0, InputDevice.SOURCE_KEYBOARD);
+ verifyNarrowMode(true);
+
+ service.viewManager.setNarrowMode(false);
+ verifyNarrowMode(false);
hardwareKeyEvent(KeyEvent.KEYCODE_DPAD_LEFT, 0, 0, InputDevice.SOURCE_KEYBOARD);
+ verifyNarrowMode(true);
+
+ service.viewManager.setNarrowMode(false);
+ verifyNarrowMode(false);
hardwareKeyEvent(KeyEvent.KEYCODE_DPAD_RIGHT, 0, 0, InputDevice.SOURCE_KEYBOARD);
- hardwareKeyEvent(KeyEvent.KEYCODE_DPAD_LEFT, KeyEvent.META_SHIFT_ON, 0,
- InputDevice.SOURCE_KEYBOARD);
- hardwareKeyEvent(KeyEvent.KEYCODE_DPAD_RIGHT, KeyEvent.META_SHIFT_ON, 0,
- InputDevice.SOURCE_KEYBOARD);
+ verifyNarrowMode(true);
+
+ service.viewManager.setNarrowMode(false);
+ verifyNarrowMode(false);
+ hardwareKeyEvent(
+ KeyEvent.KEYCODE_DPAD_LEFT, KeyEvent.META_SHIFT_ON, 0, InputDevice.SOURCE_KEYBOARD);
+ verifyNarrowMode(true);
+
+ service.viewManager.setNarrowMode(false);
+ verifyNarrowMode(false);
+ hardwareKeyEvent(
+ KeyEvent.KEYCODE_DPAD_LEFT, KeyEvent.META_SHIFT_ON, 0, InputDevice.SOURCE_KEYBOARD);
+ verifyNarrowMode(true);
+
// Nothing is input.
verifyCompositionText("");
- // No narrow mode.
- verifyNarrowMode(false);
- }
-
- /**
- * Normal case for h/w 12keys keyboard.
- */
- public void testHardwareTwelveKey_NormalCase() {
- createService(DependencyFactory.TOUCH_FRAGMENT_PREF);
- setHardwareKeyMap(HardwareKeyMap.TWELVEKEY);
- setKeyboardSpecification(KeyboardLayout.TWELVE_KEYS, InputStyle.TOGGLE_FLICK);
- verifyNarrowMode(false);
- verifyKeyboardSpecificationInView(KeyboardSpecification.TWELVE_KEY_TOGGLE_FLICK_KANA);
- verifyKeyboardSpecificationInService(KeyboardSpecification.TWELVE_KEY_TOGGLE_FLICK_KANA);
- hardwareKeyEvent(KeyEvent.KEYCODE_1, 0, 0, InputDevice.SOURCE_KEYBOARD);
- hardwareKeyEvent(KeyEvent.KEYCODE_2, 0, 0, InputDevice.SOURCE_KEYBOARD);
- hardwareKeyEvent(KeyEvent.KEYCODE_3, 0, 0, InputDevice.SOURCE_KEYBOARD);
- hardwareKeyEvent(KeyEvent.KEYCODE_4, 0, 0, InputDevice.SOURCE_KEYBOARD);
- hardwareKeyEvent(KeyEvent.KEYCODE_5, 0, 0, InputDevice.SOURCE_KEYBOARD);
- hardwareKeyEvent(KeyEvent.KEYCODE_6, 0, 0, InputDevice.SOURCE_KEYBOARD);
- hardwareKeyEvent(KeyEvent.KEYCODE_7, 0, 0, InputDevice.SOURCE_KEYBOARD);
- hardwareKeyEvent(KeyEvent.KEYCODE_8, 0, 0, InputDevice.SOURCE_KEYBOARD);
- hardwareKeyEvent(KeyEvent.KEYCODE_9, 0, 0, InputDevice.SOURCE_KEYBOARD);
- hardwareKeyEvent(KeyEvent.KEYCODE_0, 0, 0, InputDevice.SOURCE_KEYBOARD);
- hardwareKeyEvent(KeyEvent.KEYCODE_STAR, 0, 0, InputDevice.SOURCE_KEYBOARD);
- verifyCompositionText("あかさたなはまやらゎ");
- verifyNarrowMode(true);
- verifyKeyboardSpecificationInView(KeyboardSpecification.TWELVE_KEY_TOGGLE_FLICK_KANA);
- verifyKeyboardSpecificationInService(KeyboardSpecification.TWELVE_KEY_TOGGLE_KANA);
- hardwareKeyEvent(KeyEvent.KEYCODE_ENTER, 0, 0, InputDevice.SOURCE_KEYBOARD);
- verifyCompositionText("");
- verifySubmittedText("あかさたなはまやらゎ");
- }
-
- public void testHardwareTwelveKey_CompositionModeChange() {
- createService(DependencyFactory.TOUCH_FRAGMENT_PREF);
- setHardwareKeyMap(HardwareKeyMap.TWELVEKEY);
- hardwareKeyEvent(KeyEvent.KEYCODE_1, 0, 0, InputDevice.SOURCE_KEYBOARD);
- verifyCompositionText("あ");
- changeHardwareKeyboardCompositionMode(CompositionSwitchMode.TOGGLE);
- hardwareKeyEvent(KeyEvent.KEYCODE_1, 0, 0, InputDevice.SOURCE_KEYBOARD);
- verifyCompositionText("あ@");
- changeHardwareKeyboardCompositionMode(CompositionSwitchMode.TOGGLE);
- hardwareKeyEvent(KeyEvent.KEYCODE_1, 0, 0, InputDevice.SOURCE_KEYBOARD);
- verifyCompositionText("あ@あ");
- }
-
- public void testHardwareTwelveKey_SpecialKeysFor12Keys() {
- createService(DependencyFactory.TOUCH_FRAGMENT_PREF);
- setHardwareKeyMap(HardwareKeyMap.TWELVEKEY);
-
- hardwareKeyEvent(KeyEvent.KEYCODE_1, 0, 0, InputDevice.SOURCE_KEYBOARD);
- // KEYCODE_POUND(#) behaves as KEYCODE_ENTER.
- hardwareKeyEvent(KeyEvent.KEYCODE_POUND, 0, 0, InputDevice.SOURCE_KEYBOARD);
- verifyCompositionText("");
- verifySubmittedText("あ");
-
- hardwareKeyEvent(KeyEvent.KEYCODE_1, 0, 0, InputDevice.SOURCE_KEYBOARD);
- // KEYCODE_DPAD_CENTER(#) behaves as KEYCODE_ENTER.
- hardwareKeyEvent(KeyEvent.KEYCODE_DPAD_CENTER, 0, 0, InputDevice.SOURCE_KEYBOARD);
- verifyCompositionText("");
- verifySubmittedText("あ");
}
/**
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/MozcMenuDialogListenerImplTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/MozcMenuDialogListenerImplTest.java
index 646f0ff..247ad1f 100644
--- a/src/android/tests/src/com/google/android/inputmethod/japanese/MozcMenuDialogListenerImplTest.java
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/MozcMenuDialogListenerImplTest.java
@@ -59,7 +59,6 @@
public class MozcMenuDialogListenerImplTest extends InstrumentationTestCaseWithMock {
private Context context;
private InputMethodService inputMethodService;
- private ImeSwitcher imeSwitcher;
private MenuDialogListener listener;
@Override
@@ -67,8 +66,7 @@
super.setUp();
context = createMock(MockContext.class);
inputMethodService = createMock(InputMethodService.class);
- imeSwitcher = createMock(ImeSwitcher.class);
- listener = new MozcMenuDialogListenerImpl(inputMethodService, imeSwitcher);
+ listener = new MozcMenuDialogListenerImpl(inputMethodService);
}
@Override
@@ -112,7 +110,7 @@
final ViewManagerInterface stubViewManager = createNiceMock(ViewManagerInterface.class);
final Activity stubPreferenceActivity = createNiceMock(Activity.class);
- Context context = createNiceMock(Context.class);
+ Context context = createNiceMock(MockContext.class);
String packageName = "test.package.name";
try {
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/MozcServiceTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/MozcServiceTest.java
index 5c93851..a871616 100644
--- a/src/android/tests/src/com/google/android/inputmethod/japanese/MozcServiceTest.java
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/MozcServiceTest.java
@@ -30,6 +30,7 @@
package org.mozc.android.inputmethod.japanese;
import static org.mozc.android.inputmethod.japanese.testing.MozcMatcher.matchesKeyEvent;
+import static org.mozc.android.inputmethod.japanese.testing.MozcMatcher.sameOptional;
import static org.easymock.EasyMock.anyBoolean;
import static org.easymock.EasyMock.anyObject;
import static org.easymock.EasyMock.capture;
@@ -37,19 +38,17 @@
import static org.easymock.EasyMock.expect;
import static org.easymock.EasyMock.expectLastCall;
import static org.easymock.EasyMock.isA;
-import static org.easymock.EasyMock.isNull;
import static org.easymock.EasyMock.same;
import org.mozc.android.inputmethod.japanese.DependencyFactory.Dependency;
import org.mozc.android.inputmethod.japanese.FeedbackManager.FeedbackEvent;
import org.mozc.android.inputmethod.japanese.FeedbackManager.FeedbackListener;
-import org.mozc.android.inputmethod.japanese.JapaneseKeyboard.KeyboardSpecification;
import org.mozc.android.inputmethod.japanese.KeycodeConverter.KeyEventInterface;
import org.mozc.android.inputmethod.japanese.MozcService.SymbolHistoryStorageImpl;
import org.mozc.android.inputmethod.japanese.ViewManagerInterface.LayoutAdjustment;
import org.mozc.android.inputmethod.japanese.emoji.EmojiProviderType;
-import org.mozc.android.inputmethod.japanese.hardwarekeyboard.HardwareKeyboard;
import org.mozc.android.inputmethod.japanese.hardwarekeyboard.HardwareKeyboard.CompositionSwitchMode;
+import org.mozc.android.inputmethod.japanese.keyboard.Keyboard.KeyboardSpecification;
import org.mozc.android.inputmethod.japanese.model.JapaneseSoftwareKeyboardModel;
import org.mozc.android.inputmethod.japanese.model.SelectionTracker;
import org.mozc.android.inputmethod.japanese.model.SymbolCandidateStorage.SymbolHistoryStorage;
@@ -59,6 +58,8 @@
import org.mozc.android.inputmethod.japanese.preference.ClientSidePreference.InputStyle;
import org.mozc.android.inputmethod.japanese.preference.ClientSidePreference.KeyboardLayout;
import org.mozc.android.inputmethod.japanese.preference.PreferenceUtil;
+import org.mozc.android.inputmethod.japanese.protobuf.ProtoCandidates.CandidateList;
+import org.mozc.android.inputmethod.japanese.protobuf.ProtoCandidates.Category;
import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands;
import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Command;
import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.CompositionMode;
@@ -77,7 +78,6 @@
import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.SessionCommand;
import org.mozc.android.inputmethod.japanese.protobuf.ProtoConfig.Config;
import org.mozc.android.inputmethod.japanese.protobuf.ProtoConfig.Config.SelectionShortcut;
-import org.mozc.android.inputmethod.japanese.protobuf.ProtoConfig.Config.SessionKeymap;
import org.mozc.android.inputmethod.japanese.session.SessionExecutor;
import org.mozc.android.inputmethod.japanese.session.SessionExecutor.EvaluationCallback;
import org.mozc.android.inputmethod.japanese.session.SessionHandlerFactory;
@@ -86,6 +86,7 @@
import org.mozc.android.inputmethod.japanese.testing.Parameter;
import org.mozc.android.inputmethod.japanese.ui.MenuDialog.MenuDialogListener;
import org.mozc.android.inputmethod.japanese.util.ImeSwitcherFactory.ImeSwitcher;
+import org.mozc.android.inputmethod.japanese.view.Skin;
import org.mozc.android.inputmethod.japanese.view.SkinType;
import com.google.common.base.Optional;
import com.google.protobuf.ByteString;
@@ -96,6 +97,7 @@
import android.content.SharedPreferences.Editor;
import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
import android.content.res.Configuration;
+import android.content.res.Resources;
import android.media.AudioManager;
import android.os.Build;
import android.os.Handler;
@@ -181,13 +183,14 @@
private MozcService createInitializedService(SessionExecutor sessionExecutor) {
MozcService service = createService();
- invokeOnCreateInternal(service, null, null, getDefaultDeviceConfiguration(), sessionExecutor);
+ invokeOnCreateInternal(
+ service, null, getSharedPreferences(), getDefaultDeviceConfiguration(), sessionExecutor);
return service;
}
private MozcService initializeMozcService(MozcService service,
SessionExecutor sessionExecutor) {
- invokeOnCreateInternal(initializeService(service), null, null,
+ invokeOnCreateInternal(initializeService(service), null, getSharedPreferences(),
getDefaultDeviceConfiguration(), sessionExecutor);
return service;
}
@@ -226,9 +229,7 @@
ViewEventListener eventListener = service.new MozcEventListener();
service.onCreateInternal(
eventListener, viewManager, sharedPreferences, deviceConfiguration, sessionExecutor);
- if (sharedPreferences != null) {
- sharedPreferenceChangeListeners.add(service.sharedPreferenceChangeListener);
- }
+ sharedPreferenceChangeListeners.add(service.sharedPreferenceChangeListener);
}
@SmallTest
@@ -236,7 +237,7 @@
@UiThreadTest
public void testOnCreate() {
SharedPreferences preferences = getSharedPreferences();
- // Client-side conifg
+ // Client-side config
preferences.edit()
.putBoolean("pref_haptic_feedback_key", true)
.putBoolean("pref_other_anonimous_mode_key", true)
@@ -247,12 +248,14 @@
sessionExecutor.setLogging(anyBoolean());
sessionExecutor.setImposedConfig(isA(Config.class));
sessionExecutor.setConfig(ConfigUtil.toConfig(preferences));
- sessionExecutor.switchInputMode(isNull(KeyEventInterface.class), isA(CompositionMode.class),
+ sessionExecutor.switchInputMode(same(Optional.<KeyEventInterface>absent()),
+ isA(CompositionMode.class),
anyObject(EvaluationCallback.class));
expectLastCall().asStub();
sessionExecutor.updateRequest(isA(Request.class), eq(Collections.<TouchEvent>emptyList()));
expectLastCall().asStub();
- sessionExecutor.preferenceUsageStatsEvent(anyObject(SharedPreferences.class));
+ sessionExecutor.preferenceUsageStatsEvent(
+ anyObject(SharedPreferences.class), anyObject(Resources.class));
ViewManager viewManager = createMockBuilder(ViewManager.class)
.withConstructor(Context.class, ViewEventListener.class,
@@ -306,7 +309,7 @@
public void testOnCreate_viewManager() {
MozcService service = createService();
try {
- invokeOnCreateInternal(service, null, null, getDefaultDeviceConfiguration(),
+ invokeOnCreateInternal(service, null, getSharedPreferences(), getDefaultDeviceConfiguration(),
createNiceMock(SessionExecutor.class));
assertSame(ViewManager.class, service.viewManager.getClass());
@@ -322,7 +325,8 @@
SessionExecutor sessionExecutor = createNiceMock(SessionExecutor.class);
replayAll();
- invokeOnCreateInternal(service, null, null, getDefaultDeviceConfiguration(), sessionExecutor);
+ invokeOnCreateInternal(
+ service, null, getSharedPreferences(), getDefaultDeviceConfiguration(), sessionExecutor);
verifyAll();
assertNotNull(service.onCreateInputView());
@@ -335,17 +339,13 @@
SessionExecutor sessionExecutor = createNiceMock(SessionExecutor.class);
KeyboardSpecification defaultSpecification = service.currentKeyboardSpecification;
sessionExecutor.updateRequest(
- MozcUtil.getRequestForKeyboard(
- defaultSpecification.getKeyboardSpecificationName(),
- Optional.of(defaultSpecification.getSpecialRomanjiTable()),
- Optional.of(defaultSpecification.getSpaceOnAlphanumeric()),
- Optional.of(defaultSpecification.isKanaModifierInsensitiveConversion()),
- Optional.of(defaultSpecification.getCrossingEdgeBehavior()),
- getDefaultDeviceConfiguration()),
+ MozcUtil.getRequestBuilder(
+ service.getResources(), defaultSpecification, getDefaultDeviceConfiguration()).build(),
Collections.<TouchEvent>emptyList());
replayAll();
- invokeOnCreateInternal(service, null, null, getDefaultDeviceConfiguration(), sessionExecutor);
+ invokeOnCreateInternal(
+ service, null, getSharedPreferences(), getDefaultDeviceConfiguration(), sessionExecutor);
verifyAll();
}
@@ -447,7 +447,8 @@
// Exactly one message is issued to switch composition mode.
// It should not render a result in order to preserve
// the existent text. b/5181946
- sessionExecutor.switchInputMode(isNull(KeyEventInterface.class), eq(CompositionMode.HIRAGANA),
+ sessionExecutor.switchInputMode(same(Optional.<KeyEventInterface>absent()),
+ eq(CompositionMode.HIRAGANA),
anyObject(EvaluationCallback.class));
replayAll();
@@ -509,20 +510,24 @@
.addMockedMethods("isInputViewShown", "sendKeyWithKeyboardSpecification")
.createMock();
SessionExecutor sessionExecutor = createNiceMock(SessionExecutor.class);
- HardwareKeyboard hardwareKeyboard = createNiceMock(HardwareKeyboard.class);
ViewEventListener eventListener = createNiceMock(ViewEventListener.class);
ViewManager viewManager = createMockBuilder(ViewManager.class)
.withConstructor(Context.class, ViewEventListener.class,
SymbolHistoryStorage.class, ImeSwitcher.class, MenuDialogListener.class)
.withArgs(context, eventListener, createNiceMock(SymbolHistoryStorage.class),
createNiceMock(ImeSwitcher.class), createNiceMock(MenuDialogListener.class))
+ .addMockedMethods("onHardwareKeyEvent")
.createNiceMock();
+ service.sendKeyWithKeyboardSpecification(
+ same(ProtoCommands.KeyEvent.class.cast(null)), same(KeyEventInterface.class.cast(null)),
+ anyObject(KeyboardSpecification.class), anyObject(Configuration.class),
+ eq(Collections.<TouchEvent>emptyList()));
+ expectLastCall().asStub();
// Before test, we need to setup mock instances with some method calls.
// Because the calls is out of this test, we do it by NiceMock and replayAll.
replayAll();
initializeMozcService(service, sessionExecutor);
- service.hardwareKeyboard = hardwareKeyboard;
SharedPreferences sharedPreferences = getSharedPreferences();
invokeOnCreateInternal(service, viewManager, sharedPreferences,
context.getResources().getConfiguration(), sessionExecutor);
@@ -533,54 +538,11 @@
resetAll();
KeyEvent event = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_A);
- ProtoCommands.KeyEvent mozcKeyEvent =
- ProtoCommands.KeyEvent.newBuilder().setKeyCode('a').build();
- KeyboardSpecification keyboardSpecification = KeyboardSpecification.HARDWARE_QWERTY_KANA;
-
expect(service.isInputViewShown()).andStubReturn(true);
-
ClientSidePreference clientSidePreference = service.propagatedClientSidePreference;
assertNotNull(clientSidePreference);
- assertNull(clientSidePreference.getHardwareKeyMap());
- hardwareKeyboard.setHardwareKeyMap(anyObject(HardwareKeyMap.class));
-
- expect(hardwareKeyboard.getCompositionMode()).andStubReturn(CompositionMode.HIRAGANA);
-
- expect(hardwareKeyboard.setCompositionModeByKey(event)).andReturn(false);
- expect(hardwareKeyboard.getMozcKeyEvent(event)).andReturn(mozcKeyEvent);
- expect(hardwareKeyboard.getKeyEventInterface(event))
- .andReturn(KeycodeConverter.getKeyEventInterface(event));
- expect(hardwareKeyboard.getKeyboardSpecification()).andReturn(keyboardSpecification);
- service.sendKeyWithKeyboardSpecification(
- same(mozcKeyEvent), matchesKeyEvent(event),
- same(keyboardSpecification),
- eq(getDefaultDeviceConfiguration()),
- eq(Collections.<TouchEvent>emptyList()));
-
- replayAll();
-
- assertTrue(service.onKeyDownInternal(0, event, getDefaultDeviceConfiguration()));
-
- verifyAll();
-
- // Change CompositionMode.
- resetAll();
-
- expect(service.isInputViewShown()).andStubReturn(true);
-
- expect(hardwareKeyboard.getCompositionMode()).andReturn(CompositionMode.HIRAGANA);
- expect(hardwareKeyboard.setCompositionModeByKey(event)).andReturn(false);
- expect(hardwareKeyboard.getCompositionMode()).andReturn(CompositionMode.HALF_ASCII);
- viewManager.setHardwareKeyboardCompositionMode(CompositionMode.HALF_ASCII);
- expect(hardwareKeyboard.getMozcKeyEvent(event)).andReturn(mozcKeyEvent);
- expect(hardwareKeyboard.getKeyEventInterface(event))
- .andReturn(KeycodeConverter.getKeyEventInterface(event));
- expect(hardwareKeyboard.getKeyboardSpecification()).andReturn(keyboardSpecification);
- service.sendKeyWithKeyboardSpecification(
- same(mozcKeyEvent), matchesKeyEvent(event),
- same(keyboardSpecification),
- eq(getDefaultDeviceConfiguration()),
- eq(Collections.<TouchEvent>emptyList()));
+ assertEquals(HardwareKeyMap.DEFAULT, clientSidePreference.getHardwareKeyMap());
+ viewManager.onHardwareKeyEvent(event);
replayAll();
@@ -620,20 +582,17 @@
verifyAll();
// Send "a" with keyboard specification change. [HARDWARE_QWERTY_KANA]
+ // This is transition from software to hardware keyboard, so submit() is called.
resetAll();
mozcKeyEvent = ProtoCommands.KeyEvent.newBuilder().setKeyCode('a').build();
keyEvent = KeycodeConverter.getKeyEventInterface(KeyEvent.KEYCODE_A);
keyboardSpecification = KeyboardSpecification.HARDWARE_QWERTY_KANA;
+ sessionExecutor.submit(same(service.renderResultCallback));
sessionExecutor.updateRequest(
- MozcUtil.getRequestForKeyboard(
- keyboardSpecification.getKeyboardSpecificationName(),
- Optional.of(keyboardSpecification.getSpecialRomanjiTable()),
- Optional.of(keyboardSpecification.getSpaceOnAlphanumeric()),
- Optional.of(keyboardSpecification.isKanaModifierInsensitiveConversion()),
- Optional.of(keyboardSpecification.getCrossingEdgeBehavior()),
- getDefaultDeviceConfiguration()),
+ MozcUtil.getRequestBuilder(
+ service.getResources(), keyboardSpecification, getDefaultDeviceConfiguration()).build(),
Collections.<TouchEvent>emptyList());
sessionExecutor.sendKey(
ProtoCommands.KeyEvent.newBuilder(mozcKeyEvent)
@@ -675,16 +634,12 @@
keyboardSpecification = KeyboardSpecification.TWELVE_KEY_FLICK_KANA;
sessionExecutor.updateRequest(
- MozcUtil.getRequestForKeyboard(
- keyboardSpecification.getKeyboardSpecificationName(),
- Optional.of(keyboardSpecification.getSpecialRomanjiTable()),
- Optional.of(keyboardSpecification.getSpaceOnAlphanumeric()),
- Optional.of(keyboardSpecification.isKanaModifierInsensitiveConversion()),
- Optional.of(keyboardSpecification.getCrossingEdgeBehavior()),
- getDefaultDeviceConfiguration()),
+ MozcUtil.getRequestBuilder(
+ service.getResources(), keyboardSpecification, getDefaultDeviceConfiguration()).build(),
Collections.<TouchEvent>emptyList());
- sessionExecutor.switchInputMode(keyEvent, keyboardSpecification.getCompositionMode(),
- renderResultCallback);
+ sessionExecutor.switchInputMode(same(Optional.<KeyEventInterface>absent()),
+ eq(keyboardSpecification.getCompositionMode()),
+ same(renderResultCallback));
replayAll();
@@ -721,17 +676,13 @@
resetAll();
keyboardSpecification = KeyboardSpecification.HARDWARE_QWERTY_KANA;
+ sessionExecutor.submit(same(service.renderResultCallback));
sessionExecutor.updateRequest(
- MozcUtil.getRequestForKeyboard(
- keyboardSpecification.getKeyboardSpecificationName(),
- Optional.of(keyboardSpecification.getSpecialRomanjiTable()),
- Optional.of(keyboardSpecification.getSpaceOnAlphanumeric()),
- Optional.of(keyboardSpecification.isKanaModifierInsensitiveConversion()),
- Optional.of(keyboardSpecification.getCrossingEdgeBehavior()),
- getDefaultDeviceConfiguration()),
+ MozcUtil.getRequestBuilder(
+ service.getResources(), keyboardSpecification, getDefaultDeviceConfiguration()).build(),
Collections.<TouchEvent>emptyList());
sessionExecutor.switchInputMode(
- same(keyEvent), isA(CompositionMode.class), same(service.renderResultCallback));
+ sameOptional(keyEvent), isA(CompositionMode.class), same(service.renderResultCallback));
replayAll();
@@ -822,8 +773,8 @@
Preedit preedit = Preedit.newBuilder()
.addSegment(Segment.newBuilder()
- .setValue("0")
- .setAnnotation(Annotation.UNDERLINE)
+ .setValue("\uD83D\uDC31") // a character meaning a cat
+ .setAnnotation(Annotation.HIGHLIGHT)
.setValueLength(1))
.addSegment(Segment.newBuilder()
.setValue("1")
@@ -831,13 +782,15 @@
.setValueLength(1))
.addSegment(Segment.newBuilder()
.setValue("2")
- .setAnnotation(Annotation.HIGHLIGHT)
+ .setAnnotation(Annotation.UNDERLINE)
.setValueLength(1))
- .setCursor(3)
+ .setCursor(1)
.build();
Command command = Command.newBuilder()
.setInput(Input.newBuilder().setType(Input.CommandType.SEND_KEY))
- .setOutput(Output.newBuilder().setConsumed(true).setPreedit(preedit))
+ .setOutput(Output.newBuilder()
+ .setConsumed(true).setPreedit(preedit)
+ .setAllCandidateWords(CandidateList.newBuilder().setCategory(Category.SUGGESTION)))
.build();
resetAll();
@@ -847,6 +800,8 @@
// the cursor is at the tail
expect(inputConnection.setComposingText(capture(spannableStringBuilderCapture), eq(1)))
.andReturn(true);
+ expect(selectionTracker.getPreeditStartPosition()).andReturn(0);
+ expect(inputConnection.setSelection(1, 1)).andReturn(true);
selectionTracker.onRender(null, null, preedit);
expect(inputConnection.endBatchEdit()).andReturn(true);
replayAll();
@@ -855,11 +810,13 @@
verifyAll();
SpannableStringBuilder sb = spannableStringBuilderCapture.getValue();
- assertEquals("012", sb.toString());
+ assertEquals("\uD83D\uDC3112", sb.toString());
assertEquals(0, sb.getSpanStart(MozcService.SPAN_UNDERLINE));
- assertEquals(3, sb.getSpanEnd(MozcService.SPAN_UNDERLINE));
- assertEquals(2, sb.getSpanStart(MozcService.SPAN_CONVERT_HIGHLIGHT));
- assertEquals(3, sb.getSpanEnd(MozcService.SPAN_CONVERT_HIGHLIGHT));
+ assertEquals(4, sb.getSpanEnd(MozcService.SPAN_UNDERLINE));
+ assertEquals(2, sb.getSpanStart(MozcService.SPAN_PARTIAL_SUGGESTION_COLOR));
+ assertEquals(4, sb.getSpanEnd(MozcService.SPAN_PARTIAL_SUGGESTION_COLOR));
+ assertEquals(0, sb.getSpanStart(MozcService.SPAN_BEFORE_CURSOR));
+ assertEquals(2, sb.getSpanEnd(MozcService.SPAN_BEFORE_CURSOR));
}
@SmallTest
@@ -1003,7 +960,8 @@
.setOutput(Output.newBuilder()
.setConsumed(true)
.setResult(Result.newBuilder().setValue("commit").setType(ResultType.STRING))
- .setPreedit(preedit))
+ .setPreedit(preedit)
+ .setAllCandidateWords(CandidateList.newBuilder().setCategory(Category.CONVERSION)))
.build();
resetAll();
@@ -1227,7 +1185,7 @@
verifyAll();
- // If the subview (SymbolInputView or CursorView) is shown, close it and do not pass the event
+ // If SymbolInputView is shown, close it and do not pass the event
// to the client application.
resetAll();
expect(service.isInputViewShown()).andReturn(true);
@@ -1256,7 +1214,7 @@
public void testSendKeyEventEnter() {
MozcService service = createMockBuilder(MozcService.class)
.addMockedMethods("requestHideSelf", "sendDownUpKeyEvents", "isInputViewShown",
- "sendDefaultEditorAction")
+ "sendDefaultEditorAction", "getCurrentInputEditorInfo")
.createMock();
ViewEventListener eventListener = createNiceMock(ViewEventListener.class);
ViewManager viewManager =
@@ -1287,6 +1245,7 @@
resetAll();
expect(service.isInputViewShown()).andReturn(true);
expect(service.sendDefaultEditorAction(true)).andReturn(true);
+ expect(service.getCurrentInputEditorInfo()).andStubReturn(new EditorInfo());
replayAll();
service.sendKeyEvent(keyEvent);
@@ -1367,15 +1326,10 @@
KeyboardSpecification newSpecification = KeyboardSpecification.QWERTY_KANA;
sessionExecutor.updateRequest(
- MozcUtil.getRequestForKeyboard(
- newSpecification.getKeyboardSpecificationName(),
- Optional.of(newSpecification.getSpecialRomanjiTable()),
- Optional.of(newSpecification.getSpaceOnAlphanumeric()),
- Optional.of(newSpecification.isKanaModifierInsensitiveConversion()),
- Optional.of(newSpecification.getCrossingEdgeBehavior()),
- getDefaultDeviceConfiguration()),
+ MozcUtil.getRequestBuilder(
+ service.getResources(), newSpecification, getDefaultDeviceConfiguration()).build(),
touchEventList);
- sessionExecutor.switchInputMode(isNull(KeyEventInterface.class),
+ sessionExecutor.switchInputMode(same(Optional.<KeyEventInterface>absent()),
eq(newSpecification.getCompositionMode()),
anyObject(EvaluationCallback.class));
@@ -1417,11 +1371,13 @@
sessionExecutor.setImposedConfig(isA(Config.class));
sessionExecutor.updateRequest(isA(Request.class), eq(Collections.<TouchEvent>emptyList()));
expectLastCall().asStub();
- sessionExecutor.switchInputMode(isNull(KeyEventInterface.class), isA(CompositionMode.class),
+ sessionExecutor.switchInputMode(same(Optional.<KeyEventInterface>absent()),
+ isA(CompositionMode.class),
anyObject(EvaluationCallback.class));
expectLastCall().asStub();
sessionExecutor.setConfig(isA(Config.class));
- sessionExecutor.preferenceUsageStatsEvent(sharedPreferences);
+ sessionExecutor.preferenceUsageStatsEvent(
+ sharedPreferences, getInstrumentation().getTargetContext().getResources());
replayAll();
invokeOnCreateInternal(service, null, sharedPreferences, getDefaultDeviceConfiguration(),
@@ -1432,7 +1388,7 @@
// Make sure the UI is initialized expectedly.
assertEquals(KeyboardLayout.QWERTY,
- service.viewManager.getJapaneseSoftwareKeyboardModel().getKeyboardLayout());
+ service.viewManager.getActiveSoftwareKeyboardModel().getKeyboardLayout());
}
@SmallTest
@@ -1537,7 +1493,8 @@
replayAll();
// Invoke onConversionCandidateSelected.
- service.viewManager.getEventListener().onConversionCandidateSelected(0);
+ service.viewManager.getEventListener()
+ .onConversionCandidateSelected(0, Optional.<Integer>absent());
verifyAll();
}
@@ -1580,33 +1537,50 @@
verifyAll();
}
+ @SuppressWarnings("unchecked")
@SmallTest
- public void testMozcEventListener_onClickHardwareKeyboardCompositionModeButton() {
- MozcService service = createService();
+ public void testMozcEventListener_onNarrowModeChanged() {
+ SessionExecutor sessionExecutorMock = createMock(SessionExecutor.class);
+ MozcService service = initializeMozcService(new MozcService(), sessionExecutorMock);
+ ViewManagerInterface viewManagerMock = createMock(ViewManagerInterface.class);
+ service.viewManager = viewManagerMock;
ViewEventListener viewEventListener = service.new MozcEventListener();
- ViewManager viewManager =
- createViewManagerMock(getInstrumentation().getTargetContext(), viewEventListener);
- invokeOnCreateInternal(service, viewManager, null, getDefaultDeviceConfiguration(),
- createNiceMock(SessionExecutor.class));
- HardwareKeyboard hardwareKeyboard = createMock(HardwareKeyboard.class);
- service.hardwareKeyboard = hardwareKeyboard;
+ Capture<Config> configCapture = new Capture<Config>();
+
+ // On transition from narrow mode to non-narrow mode, submit() should be called.
resetAll();
-
- hardwareKeyboard.setCompositionMode(CompositionSwitchMode.TOGGLE);
- // As current composition mode
- expect(hardwareKeyboard.getCompositionMode()).andReturn(CompositionMode.HIRAGANA);
- // As updated composition mode
- expect(hardwareKeyboard.getCompositionMode()).andReturn(CompositionMode.HALF_ASCII);
- viewManager.setHardwareKeyboardCompositionMode(CompositionMode.HALF_ASCII);
- expect(hardwareKeyboard.getKeyboardSpecification())
- .andReturn(KeyboardSpecification.HARDWARE_QWERTY_ALPHABET);
-
+ expect(viewManagerMock.isNarrowMode()).andStubReturn(false);
+ expect(viewManagerMock.isFloatingCandidateMode()).andStubReturn(false);
+ sessionExecutorMock.submit(same(service.renderResultCallback));
+ sessionExecutorMock.setImposedConfig(capture(configCapture));
replayAll();
-
- viewEventListener.onHardwareKeyboardCompositionModeChange(CompositionSwitchMode.TOGGLE);
-
+ viewEventListener.onNarrowModeChanged(false);
verifyAll();
+ assertEquals(SelectionShortcut.NO_SHORTCUT,
+ configCapture.getValue().getSelectionShortcut());
+
+ // On the opposite transition, submit() should not be called.
+ resetAll();
+ expect(viewManagerMock.isNarrowMode()).andStubReturn(true);
+ expect(viewManagerMock.isFloatingCandidateMode()).andStubReturn(true);
+ sessionExecutorMock.setImposedConfig(capture(configCapture));
+ replayAll();
+ viewEventListener.onNarrowModeChanged(true);
+ verifyAll();
+ assertEquals(SelectionShortcut.SHORTCUT_123456789,
+ configCapture.getValue().getSelectionShortcut());
+
+ // Don't use shortcut keys if floating candidate window is disabled.
+ resetAll();
+ expect(viewManagerMock.isNarrowMode()).andStubReturn(true);
+ expect(viewManagerMock.isFloatingCandidateMode()).andStubReturn(false);
+ sessionExecutorMock.setImposedConfig(capture(configCapture));
+ replayAll();
+ viewEventListener.onNarrowModeChanged(true);
+ verifyAll();
+ assertEquals(SelectionShortcut.NO_SHORTCUT,
+ configCapture.getValue().getSelectionShortcut());
}
@SmallTest
@@ -1655,7 +1629,7 @@
@SmallTest
public void testPropagateClientSidePreference_touchUI() {
-
+ Resources resoureces = getInstrumentation().getTargetContext().getResources();
SessionExecutor sessionExecutor = createNiceMock(SessionExecutor.class);
replayAll();
MozcService service = createInitializedService(sessionExecutor);
@@ -1668,7 +1642,7 @@
new ClientSidePreference(
true, 100, true, 100, false, KeyboardLayout.QWERTY, InputStyle.TOGGLE, false, false,
0, EmojiProviderType.DOCOMO, HardwareKeyMap.JAPANESE109A, SkinType.ORANGE_LIGHTGRAY,
- LayoutAdjustment.FILL, 100);
+ true, LayoutAdjustment.FILL, 100);
service.propagateClientSidePreference(clientSidePreference);
// Check all the fields are propagated.
@@ -1676,16 +1650,16 @@
assertTrue(feedbackManager.isHapticFeedbackEnabled());
assertEquals(feedbackManager.getHapticFeedbackDuration(), 100L);
assertTrue(feedbackManager.isSoundFeedbackEnabled());
- assertEquals(feedbackManager.getSoundFeedbackVolume(), 0.2f);
+ assertEquals(feedbackManager.getSoundFeedbackVolume(), 0.8f);
assertFalse(viewManager.isPopupEnabled());
- JapaneseSoftwareKeyboardModel model = viewManager.getJapaneseSoftwareKeyboardModel();
+ JapaneseSoftwareKeyboardModel model = viewManager.getActiveSoftwareKeyboardModel();
assertEquals(KeyboardLayout.QWERTY, model.getKeyboardLayout());
assertEquals(InputStyle.TOGGLE, model.getInputStyle());
assertFalse(model.isQwertyLayoutForAlphabet());
assertFalse(viewManager.isFullscreenMode());
assertFalse(service.onEvaluateFullscreenMode());
assertEquals(EmojiProviderType.DOCOMO, viewManager.getEmojiProviderType());
- assertEquals(HardwareKeyMap.JAPANESE109A, service.hardwareKeyboard.getHardwareKeyMap());
+ assertEquals(HardwareKeyMap.JAPANESE109A, service.viewManager.getHardwareKeyMap());
assertEquals(LayoutAdjustment.FILL, viewManager.getLayoutAdjustment());
assertEquals(100, viewManager.getKeyboardHeightRatio());
}
@@ -1705,7 +1679,8 @@
final int expectFlickSensitivity;
final EmojiProviderType expectEmojiProviderType;
final HardwareKeyMap expectHardwareKeyMap;
- final SkinType expectSkinType;
+ final Skin expectSkin;
+ final boolean expectMicrophoneButtonEnabledByPreference;
final LayoutAdjustment expectLayoutAdjustment;
final int expectKeyboardHeight;
@@ -1720,7 +1695,8 @@
int expectFlickSensitivity,
EmojiProviderType expectEmojiProviderType,
HardwareKeyMap expectHardwareKeyMap,
- SkinType expectSkinType,
+ Skin expectSkin,
+ boolean expectMicrophoneButtonEnabledByPreference,
LayoutAdjustment expectLayoutAdjustment,
int expectKeyboardHeight) {
this.clientSidePreference = clientSidePreference;
@@ -1736,7 +1712,8 @@
this.expectFlickSensitivity = expectFlickSensitivity;
this.expectEmojiProviderType = expectEmojiProviderType;
this.expectHardwareKeyMap = expectHardwareKeyMap;
- this.expectSkinType = expectSkinType;
+ this.expectSkin = expectSkin;
+ this.expectMicrophoneButtonEnabledByPreference = expectMicrophoneButtonEnabledByPreference;
this.expectLayoutAdjustment = expectLayoutAdjustment;
this.expectKeyboardHeight = expectKeyboardHeight;
}
@@ -1748,11 +1725,11 @@
new ClientSidePreference(
false, 10, true, 10, true, KeyboardLayout.QWERTY, InputStyle.TOGGLE, false, false,
0, EmojiProviderType.DOCOMO, HardwareKeyMap.DEFAULT, SkinType.ORANGE_LIGHTGRAY,
- LayoutAdjustment.FILL, 100),
+ true, LayoutAdjustment.FILL, 100),
false,
10,
true,
- 0.02f,
+ 0.08f,
true,
KeyboardLayout.QWERTY,
InputStyle.TOGGLE,
@@ -1761,18 +1738,19 @@
0,
EmojiProviderType.DOCOMO,
HardwareKeyMap.DEFAULT,
- SkinType.ORANGE_LIGHTGRAY,
+ SkinType.ORANGE_LIGHTGRAY.getSkin(resoureces),
+ true,
LayoutAdjustment.FILL,
100),
new TestData(
new ClientSidePreference(
false, 20, true, 20, false, KeyboardLayout.QWERTY, InputStyle.TOGGLE, false, false,
-1, EmojiProviderType.DOCOMO, HardwareKeyMap.DEFAULT, SkinType.ORANGE_LIGHTGRAY,
- LayoutAdjustment.FILL, 100),
+ false, LayoutAdjustment.FILL, 100),
false,
20,
true,
- 0.04f,
+ 0.16f,
false,
KeyboardLayout.QWERTY,
InputStyle.TOGGLE,
@@ -1781,18 +1759,19 @@
-1,
EmojiProviderType.DOCOMO,
HardwareKeyMap.DEFAULT,
- SkinType.ORANGE_LIGHTGRAY,
+ SkinType.ORANGE_LIGHTGRAY.getSkin(resoureces),
+ false,
LayoutAdjustment.FILL,
100),
new TestData(
new ClientSidePreference(
false, 30, false, 30, true, KeyboardLayout.QWERTY, InputStyle.TOGGLE, false, false,
2, EmojiProviderType.KDDI, HardwareKeyMap.DEFAULT, SkinType.ORANGE_LIGHTGRAY,
- LayoutAdjustment.FILL, 100),
+ true, LayoutAdjustment.FILL, 100),
false,
30,
false,
- 0.06f,
+ 0.24f,
true,
KeyboardLayout.QWERTY,
InputStyle.TOGGLE,
@@ -1801,18 +1780,19 @@
2,
EmojiProviderType.KDDI,
HardwareKeyMap.DEFAULT,
- SkinType.ORANGE_LIGHTGRAY,
+ SkinType.ORANGE_LIGHTGRAY.getSkin(resoureces),
+ true,
LayoutAdjustment.FILL,
100),
new TestData(
new ClientSidePreference(
false, 40, false, 40, true, KeyboardLayout.TWELVE_KEYS, InputStyle.TOGGLE,
false, false, -3, EmojiProviderType.SOFTBANK, HardwareKeyMap.DEFAULT,
- SkinType.ORANGE_LIGHTGRAY, LayoutAdjustment.FILL, 100),
+ SkinType.ORANGE_LIGHTGRAY, true, LayoutAdjustment.FILL, 100),
false,
40,
false,
- 0.08f,
+ 0.32f,
true,
KeyboardLayout.TWELVE_KEYS,
InputStyle.TOGGLE,
@@ -1821,18 +1801,19 @@
-3,
EmojiProviderType.SOFTBANK,
HardwareKeyMap.DEFAULT,
- SkinType.ORANGE_LIGHTGRAY,
+ SkinType.ORANGE_LIGHTGRAY.getSkin(resoureces),
+ true,
LayoutAdjustment.FILL,
100),
new TestData(
new ClientSidePreference(
false, 50, false, 50, true, KeyboardLayout.TWELVE_KEYS, InputStyle.FLICK,
false, false, 4, EmojiProviderType.DOCOMO, HardwareKeyMap.DEFAULT,
- SkinType.ORANGE_LIGHTGRAY, LayoutAdjustment.FILL, 100),
+ SkinType.ORANGE_LIGHTGRAY, false, LayoutAdjustment.FILL, 100),
false,
50,
false,
- 0.1f,
+ 0.4f,
true,
KeyboardLayout.TWELVE_KEYS,
InputStyle.FLICK,
@@ -1841,18 +1822,19 @@
4,
EmojiProviderType.DOCOMO,
HardwareKeyMap.DEFAULT,
- SkinType.ORANGE_LIGHTGRAY,
+ SkinType.ORANGE_LIGHTGRAY.getSkin(resoureces),
+ false,
LayoutAdjustment.FILL,
100),
new TestData(
new ClientSidePreference(
false, 60, false, 60, true, KeyboardLayout.TWELVE_KEYS, InputStyle.FLICK,
true, false, -5, EmojiProviderType.KDDI, HardwareKeyMap.DEFAULT,
- SkinType.ORANGE_LIGHTGRAY, LayoutAdjustment.FILL, 100),
+ SkinType.ORANGE_LIGHTGRAY, true, LayoutAdjustment.FILL, 100),
false,
60,
false,
- 0.12f,
+ 0.48f,
true,
KeyboardLayout.TWELVE_KEYS,
InputStyle.FLICK,
@@ -1861,18 +1843,19 @@
-5,
EmojiProviderType.KDDI,
HardwareKeyMap.DEFAULT,
- SkinType.ORANGE_LIGHTGRAY,
+ SkinType.ORANGE_LIGHTGRAY.getSkin(resoureces),
+ true,
LayoutAdjustment.FILL,
100),
new TestData(
new ClientSidePreference(
false, 70, false, 70, true, KeyboardLayout.TWELVE_KEYS, InputStyle.FLICK,
true, true, 6, EmojiProviderType.SOFTBANK, HardwareKeyMap.DEFAULT,
- SkinType.ORANGE_LIGHTGRAY, LayoutAdjustment.FILL, 100),
+ SkinType.ORANGE_LIGHTGRAY, false, LayoutAdjustment.FILL, 100),
false,
70,
false,
- 0.14f,
+ 0.56f,
true,
KeyboardLayout.TWELVE_KEYS,
InputStyle.FLICK,
@@ -1881,17 +1864,18 @@
6,
EmojiProviderType.SOFTBANK,
HardwareKeyMap.DEFAULT,
- SkinType.ORANGE_LIGHTGRAY,
+ SkinType.ORANGE_LIGHTGRAY.getSkin(resoureces),
+ false,
LayoutAdjustment.FILL, 100),
new TestData(
new ClientSidePreference(
false, 80, false, 80, true, KeyboardLayout.TWELVE_KEYS, InputStyle.FLICK,
true, true, -7, EmojiProviderType.SOFTBANK, HardwareKeyMap.JAPANESE109A,
- SkinType.ORANGE_LIGHTGRAY, LayoutAdjustment.FILL, 100),
+ SkinType.ORANGE_LIGHTGRAY, false, LayoutAdjustment.FILL, 100),
false,
80,
false,
- 0.16f,
+ 0.64f,
true,
KeyboardLayout.TWELVE_KEYS,
InputStyle.FLICK,
@@ -1900,18 +1884,19 @@
-7,
EmojiProviderType.SOFTBANK,
HardwareKeyMap.JAPANESE109A,
- SkinType.ORANGE_LIGHTGRAY,
+ SkinType.ORANGE_LIGHTGRAY.getSkin(resoureces),
+ false,
LayoutAdjustment.FILL,
100),
new TestData(
new ClientSidePreference(
false, 90, false, 90, true, KeyboardLayout.TWELVE_KEYS, InputStyle.FLICK,
- true, true, 8, EmojiProviderType.SOFTBANK, HardwareKeyMap.TWELVEKEY,
- SkinType.ORANGE_LIGHTGRAY, LayoutAdjustment.RIGHT, 100),
+ true, true, 8, EmojiProviderType.SOFTBANK, HardwareKeyMap.DEFAULT,
+ SkinType.ORANGE_LIGHTGRAY, true, LayoutAdjustment.RIGHT, 100),
false,
90,
false,
- 0.18f,
+ 0.72f,
true,
KeyboardLayout.TWELVE_KEYS,
InputStyle.FLICK,
@@ -1919,19 +1904,20 @@
true,
8,
EmojiProviderType.SOFTBANK,
- HardwareKeyMap.TWELVEKEY,
- SkinType.ORANGE_LIGHTGRAY,
+ HardwareKeyMap.DEFAULT,
+ SkinType.ORANGE_LIGHTGRAY.getSkin(resoureces),
+ true,
LayoutAdjustment.RIGHT,
100),
new TestData(
new ClientSidePreference(
false, 100, false, 100, true, KeyboardLayout.TWELVE_KEYS, InputStyle.FLICK,
- true, true, 8, EmojiProviderType.SOFTBANK, HardwareKeyMap.TWELVEKEY,
- SkinType.ORANGE_LIGHTGRAY, LayoutAdjustment.RIGHT, 120),
+ true, true, 8, EmojiProviderType.SOFTBANK, HardwareKeyMap.DEFAULT,
+ SkinType.ORANGE_LIGHTGRAY, true, LayoutAdjustment.RIGHT, 120),
false,
100,
false,
- 0.2f,
+ 0.8f,
true,
KeyboardLayout.TWELVE_KEYS,
InputStyle.FLICK,
@@ -1939,8 +1925,9 @@
true,
8,
EmojiProviderType.SOFTBANK,
- HardwareKeyMap.TWELVEKEY,
- SkinType.ORANGE_LIGHTGRAY,
+ HardwareKeyMap.DEFAULT,
+ SkinType.ORANGE_LIGHTGRAY.getSkin(resoureces),
+ true,
LayoutAdjustment.RIGHT,
120),
};
@@ -1964,7 +1951,7 @@
assertEquals(testData.toString(),
testData.expectPopupFeedback,
viewManager.isPopupEnabled());
- JapaneseSoftwareKeyboardModel model = viewManager.getJapaneseSoftwareKeyboardModel();
+ JapaneseSoftwareKeyboardModel model = viewManager.getActiveSoftwareKeyboardModel();
assertEquals(testData.toString(), testData.expectKeyboardLayout, model.getKeyboardLayout());
assertEquals(testData.toString(), testData.expectInputStyle, model.getInputStyle());
assertEquals(testData.toString(),
@@ -1981,10 +1968,13 @@
testData.expectEmojiProviderType,
viewManager.getEmojiProviderType());
assertEquals(testData.toString(),
- testData.expectHardwareKeyMap, service.hardwareKeyboard.getHardwareKeyMap());
+ testData.expectHardwareKeyMap, service.viewManager.getHardwareKeyMap());
assertEquals(testData.toString(),
- testData.expectSkinType,
- viewManager.getSkinType());
+ testData.expectSkin,
+ viewManager.getSkin());
+ assertEquals(testData.toString(),
+ testData.expectMicrophoneButtonEnabledByPreference,
+ viewManager.isMicrophoneButtonEnabledByPreference());
assertEquals(testData.toString(),
testData.expectLayoutAdjustment,
viewManager.getLayoutAdjustment());
@@ -2020,21 +2010,15 @@
createNiceMock(SymbolHistoryStorage.class),
createNiceMock(ImeSwitcher.class),
createNiceMock(MenuDialogListener.class))
- .addMockedMethods("isNarrowMode", "hideSubInputView", "setNarrowMode",
- "onConfigurationChanged")
+ .addMockedMethods("onConfigurationChanged")
.createMock();
MozcService service = createService();
- invokeOnCreateInternal(service, viewManager, null, getDefaultDeviceConfiguration(),
- sessionExecutor);
+ invokeOnCreateInternal(
+ service, viewManager, getSharedPreferences(), getDefaultDeviceConfiguration(),
+ sessionExecutor);
service.selectionTracker = selectionTracker;
service.inputBound = true;
- Config expectedConfig = Config.newBuilder()
- .setSessionKeymap(SessionKeymap.MOBILE)
- .setSelectionShortcut(SelectionShortcut.NO_SHORTCUT)
- .setUseEmojiConversion(true)
- .build();
-
Configuration deviceConfig = new Configuration();
deviceConfig.keyboard = Configuration.KEYBOARD_NOKEYS;
deviceConfig.keyboardHidden = Configuration.KEYBOARDHIDDEN_YES;
@@ -2052,8 +2036,8 @@
selectionTracker.onConfigurationChanged();
sessionExecutor.resetContext();
- sessionExecutor.setImposedConfig(expectedConfig);
- sessionExecutor.switchInputMode(isNull(KeyEventInterface.class), isA(CompositionMode.class),
+ sessionExecutor.switchInputMode(same(Optional.<KeyEventInterface>absent()),
+ isA(CompositionMode.class),
anyObject(EvaluationCallback.class));
expectLastCall().asStub();
sessionExecutor.updateRequest(isA(Request.class), eq(Collections.<TouchEvent>emptyList()));
@@ -2189,23 +2173,18 @@
}
}
TestData[] testDataList = {
- new TestData((InputType.TYPE_CLASS_TEXT |
- InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD),
+ new TestData((InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD),
InputFieldType.PASSWORD),
- new TestData((InputType.TYPE_CLASS_TEXT |
- InputType.TYPE_TEXT_VARIATION_URI |
- InputType.TYPE_TEXT_FLAG_AUTO_COMPLETE),
+ new TestData((InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_URI
+ | InputType.TYPE_TEXT_FLAG_AUTO_COMPLETE),
InputFieldType.NORMAL),
- new TestData((InputType.TYPE_CLASS_TEXT |
- InputType.TYPE_TEXT_VARIATION_PASSWORD |
- InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS),
+ new TestData((InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD
+ | InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS),
InputFieldType.PASSWORD),
- new TestData((InputType.TYPE_CLASS_TEXT |
- InputType.TYPE_TEXT_VARIATION_SHORT_MESSAGE |
- InputType.TYPE_TEXT_FLAG_AUTO_CORRECT),
+ new TestData((InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_SHORT_MESSAGE
+ | InputType.TYPE_TEXT_FLAG_AUTO_CORRECT),
InputFieldType.NORMAL),
- new TestData((InputType.TYPE_CLASS_NUMBER |
- InputType.TYPE_NUMBER_FLAG_SIGNED),
+ new TestData((InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_SIGNED),
InputFieldType.NUMBER),
new TestData(InputType.TYPE_CLASS_PHONE,
InputFieldType.TEL),
@@ -2232,28 +2211,21 @@
createNiceMock(SymbolHistoryStorage.class),
createNiceMock(ImeSwitcher.class),
createNiceMock(MenuDialogListener.class))
- .addMockedMethod("setHardwareKeyboardCompositionMode")
+ .addMockedMethod("switchHardwareKeyboardCompositionMode")
.createMock();
- invokeOnCreateInternal(service, viewManager, null, getDefaultDeviceConfiguration(),
- createNiceMock(SessionExecutor.class));
+ invokeOnCreateInternal(
+ service, viewManager, getSharedPreferences(), getDefaultDeviceConfiguration(),
+ createNiceMock(SessionExecutor.class));
MozcView mozcView = viewManager.createMozcView(context);
- HardwareKeyboard hardwareKeyboard = createMockBuilder(HardwareKeyboard.class)
- .addMockedMethods("setCompositionMode", "getCompositionMode").createMock();
- service.hardwareKeyboard = hardwareKeyboard;
resetAll();
- expect(service.isInputViewShown()).andStubReturn(true);
- hardwareKeyboard.setCompositionMode(CompositionSwitchMode.TOGGLE);
- // As current composition mode
- expect(hardwareKeyboard.getCompositionMode()).andReturn(CompositionMode.HALF_ASCII);
- // As updated composition mode
- expect(hardwareKeyboard.getCompositionMode()).andReturn(CompositionMode.HIRAGANA);
- viewManager.setHardwareKeyboardCompositionMode(CompositionMode.HIRAGANA);
+ expect(service.isInputViewShown()).andStubReturn(true);
+ viewManager.switchHardwareKeyboardCompositionMode(CompositionSwitchMode.TOGGLE);
replayAll();
- mozcView.getHardwareCompositionButton().performClick();
+ mozcView.findViewById(R.id.hardware_composition_button).performClick();
verifyAll();
}
@@ -2264,52 +2236,46 @@
getInstrumentation().getTargetContext(),
createNiceMock(ViewEventListener.class));
MozcService service = createService();
- invokeOnCreateInternal(service, viewManager, null, getDefaultDeviceConfiguration(),
- createNiceMock(SessionExecutor.class));
+
+ resetAll();
+ SessionExecutor sessionExecutorMock = createNiceMock(SessionExecutor.class);
+ expect(viewManager.isNarrowMode()).andStubReturn(false);
+ expect(viewManager.isFloatingCandidateMode()).andStubReturn(false);
+ viewManager.onConfigurationChanged(anyObject(Configuration.class));
+ replayAll();
+ invokeOnCreateInternal(
+ service, viewManager, null, getDefaultDeviceConfiguration(), sessionExecutorMock);
+ verifyAll();
Configuration configuration = new Configuration();
resetAll();
-
expect(viewManager.isNarrowMode()).andReturn(false);
expect(viewManager.hideSubInputView()).andReturn(true);
viewManager.setNarrowMode(true);
-
replayAll();
-
configuration.hardKeyboardHidden = Configuration.HARDKEYBOARDHIDDEN_NO;
service.maybeSetNarrowMode(configuration);
-
verifyAll();
resetAll();
-
expect(viewManager.isNarrowMode()).andReturn(true);
viewManager.setNarrowMode(false);
-
replayAll();
-
configuration.hardKeyboardHidden = Configuration.HARDKEYBOARDHIDDEN_YES;
service.maybeSetNarrowMode(configuration);
-
verifyAll();
resetAll();
-
replayAll();
-
configuration.hardKeyboardHidden = Configuration.HARDKEYBOARDHIDDEN_YES;
service.maybeSetNarrowMode(configuration);
-
verifyAll();
resetAll();
-
replayAll();
-
configuration.hardKeyboardHidden = Configuration.HARDKEYBOARDHIDDEN_UNDEFINED;
service.maybeSetNarrowMode(configuration);
-
verifyAll();
}
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/MozcUtilTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/MozcUtilTest.java
index 8217b56..59be1ee 100644
--- a/src/android/tests/src/com/google/android/inputmethod/japanese/MozcUtilTest.java
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/MozcUtilTest.java
@@ -29,26 +29,45 @@
package org.mozc.android.inputmethod.japanese;
-import org.mozc.android.inputmethod.japanese.JapaneseKeyboard.KeyboardSpecification;
+import static org.easymock.EasyMock.expect;
+
+import org.mozc.android.inputmethod.japanese.keyboard.Keyboard.KeyboardSpecification;
import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Request;
-import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Request.CrossingEdgeBehavior;
-import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Request.SpaceOnAlphanumeric;
-import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Request.SpecialRomanjiTable;
+import org.mozc.android.inputmethod.japanese.testing.InstrumentationTestCaseWithMock;
import org.mozc.android.inputmethod.japanese.testing.Parameter;
import com.google.common.base.Optional;
+import com.google.common.base.Preconditions;
import com.google.protobuf.ByteString;
import android.content.Context;
import android.content.res.Configuration;
-import android.test.InstrumentationTestCase;
import android.test.mock.MockContext;
+import android.test.mock.MockResources;
import android.test.suitebuilder.annotation.SmallTest;
import android.text.InputType;
import android.view.inputmethod.EditorInfo;
/**
*/
-public class MozcUtilTest extends InstrumentationTestCase {
+public class MozcUtilTest extends InstrumentationTestCaseWithMock {
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ clearnUpMozcUtil();
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ clearnUpMozcUtil();
+ super.tearDown();
+ }
+
+ private void clearnUpMozcUtil() {
+ MozcUtil.setSystemApplication(Optional.<Boolean>absent());
+ MozcUtil.setUpdatedSystemApplication(Optional.<Boolean>absent());
+ }
+
@SmallTest
public void testIsDevChannel() {
class TestData extends Parameter {
@@ -90,82 +109,41 @@
@SmallTest
public void testGetRequest() {
Configuration configuration = new Configuration();
+ int floatingCandidatePageSize = 9;
+ MockResources mockResources = createNiceMock(MockResources.class);
+ resetAll();
+ expect(mockResources.getInteger(R.integer.floating_candidate_candidate_num)).andStubReturn(
+ floatingCandidatePageSize);
+ replayAll();
+
for (KeyboardSpecification specification : KeyboardSpecification.values()) {
for (int orientation : new int[] {Configuration.ORIENTATION_PORTRAIT,
Configuration.ORIENTATION_LANDSCAPE}) {
configuration.orientation = orientation;
- Request request = MozcUtil.getRequestForKeyboard(
- specification.getKeyboardSpecificationName(),
- Optional.of(specification.getSpecialRomanjiTable()),
- Optional.of(specification.getSpaceOnAlphanumeric()),
- Optional.of(specification.isKanaModifierInsensitiveConversion()),
- Optional.of(specification.getCrossingEdgeBehavior()),
- configuration);
+ Request request =
+ MozcUtil.getRequestBuilder(mockResources, specification, configuration).build();
assertEquals(specification.getKeyboardSpecificationName()
.formattedKeyboardName(configuration),
request.getKeyboardName());
assertEquals(specification.getSpecialRomanjiTable(), request.getSpecialRomanjiTable());
assertEquals(specification.getSpaceOnAlphanumeric(), request.getSpaceOnAlphanumeric());
+
+ if (specification.isHardwareKeyboard()) {
+ assertFalse(request.getMixedConversion());
+ assertFalse(request.getZeroQuerySuggestion());
+ assertTrue(request.getUpdateInputModeFromSurroundingText());
+ assertFalse(request.getAutoPartialSuggestion());
+ assertEquals(floatingCandidatePageSize, request.getCandidatePageSize());
+ } else {
+ assertTrue(request.getMixedConversion());
+ assertTrue(request.getZeroQuerySuggestion());
+ assertFalse(request.getUpdateInputModeFromSurroundingText());
+ assertTrue(request.getAutoPartialSuggestion());
+ }
}
}
- }
- @SmallTest
- public void testGetRequest_pseudoKeyboards() {
- Configuration configuration = new Configuration();
- {
- Request request =
- MozcUtil.getRequestForKeyboard(new KeyboardSpecificationName("baseName", 1, 2, 3),
- Optional.of(SpecialRomanjiTable.DEFAULT_TABLE),
- Optional.<SpaceOnAlphanumeric>absent(),
- Optional.<Boolean>absent(),
- Optional.<CrossingEdgeBehavior>absent(),
- configuration);
- assertEquals(SpecialRomanjiTable.DEFAULT_TABLE, request.getSpecialRomanjiTable());
- assertFalse(request.hasSpaceOnAlphanumeric());
- assertFalse(request.hasKanaModifierInsensitiveConversion());
- assertFalse(request.hasCrossingEdgeBehavior());
- }
- {
- Request request =
- MozcUtil.getRequestForKeyboard(new KeyboardSpecificationName("baseName", 1, 2, 3),
- Optional.<SpecialRomanjiTable>absent(),
- Optional.of(SpaceOnAlphanumeric.COMMIT),
- Optional.<Boolean>absent(),
- Optional.<CrossingEdgeBehavior>absent(),
- configuration);
- assertFalse(request.hasSpecialRomanjiTable());
- assertEquals(SpaceOnAlphanumeric.COMMIT, request.getSpaceOnAlphanumeric());
- assertFalse(request.hasKanaModifierInsensitiveConversion());
- assertFalse(request.hasCrossingEdgeBehavior());
- }
- {
- Request request =
- MozcUtil.getRequestForKeyboard(new KeyboardSpecificationName("baseName", 1, 2, 3),
- Optional.<SpecialRomanjiTable>absent(),
- Optional.<SpaceOnAlphanumeric>absent(),
- Optional.of(Boolean.TRUE),
- Optional.<CrossingEdgeBehavior>absent(),
- configuration);
- assertFalse(request.hasSpaceOnAlphanumeric());
- assertFalse(request.hasSpecialRomanjiTable());
- assertTrue(request.getKanaModifierInsensitiveConversion());
- assertFalse(request.hasCrossingEdgeBehavior());
- }
- {
- Request request =
- MozcUtil.getRequestForKeyboard(new KeyboardSpecificationName("baseName", 1, 2, 3),
- Optional.<SpecialRomanjiTable>absent(),
- Optional.<SpaceOnAlphanumeric>absent(),
- Optional.<Boolean>absent(),
- Optional.of(CrossingEdgeBehavior.COMMIT_WITHOUT_CONSUMING),
- configuration);
- assertFalse(request.hasSpaceOnAlphanumeric());
- assertFalse(request.hasSpecialRomanjiTable());
- assertFalse(request.hasKanaModifierInsensitiveConversion());
- assertEquals(CrossingEdgeBehavior.COMMIT_WITHOUT_CONSUMING,
- request.getCrossingEdgeBehavior());
- }
+ verifyAll();
}
@SmallTest
@@ -211,39 +189,7 @@
};
for (TestData testData : testDataList) {
- EditorInfo editorInfo = new EditorInfo();
- editorInfo.inputType = testData.inputType;
- assertEquals(testData.expectedPasswordField, MozcUtil.isPasswordField(editorInfo));
- }
- }
-
- @SmallTest
- public void testIsVoiceInputAllowed() {
- class TestData extends Parameter {
- final String privateImeOptions;
- final boolean expectedIsVoiceInputAllowed;
- TestData(String privateImeOptions, boolean expectedIsVoiceInputAllowed) {
- this.privateImeOptions = privateImeOptions;
- this.expectedIsVoiceInputAllowed = expectedIsVoiceInputAllowed;
- }
- }
-
- TestData[] testDataList = {
- new TestData(null, true),
- new TestData("", true),
- new TestData("nnm", true),
- new TestData("nnm,a", true),
- new TestData("nm", false),
- new TestData("a,nm", false),
- new TestData("nm,b", false),
- new TestData("a,nm,b", false),
- new TestData("com.google.android.inputmethod.latin.noMicrophoneKey", false),
- };
-
- for (TestData testData : testDataList) {
- EditorInfo editorInfo = new EditorInfo();
- editorInfo.privateImeOptions = testData.privateImeOptions;
- assertEquals(testData.expectedIsVoiceInputAllowed, MozcUtil.isVoiceInputAllowed(editorInfo));
+ assertEquals(testData.expectedPasswordField, MozcUtil.isPasswordField(testData.inputType));
}
}
@@ -317,4 +263,61 @@
}
}
}
+
+ @SmallTest
+ public void testIsVoiceInputPreferred() {
+ class TestData extends Parameter {
+ final int inputType;
+ final String privateImeOptions;
+ final boolean expectPreffered;
+ TestData(int inputType, String privateImeOptions, boolean expectEligible) {
+ this.inputType = inputType;
+ this.privateImeOptions = Preconditions.checkNotNull(privateImeOptions);
+ this.expectPreffered = expectEligible;
+ }
+ }
+ TestData[] testDataList = {
+ new TestData(0, "", true),
+ new TestData(InputType.TYPE_CLASS_TEXT, "", true),
+ new TestData(InputType.TYPE_CLASS_NUMBER, "", false),
+ new TestData(InputType.TYPE_CLASS_PHONE, "", false),
+ new TestData(InputType.TYPE_CLASS_DATETIME, "", false),
+ new TestData(InputType.TYPE_CLASS_TEXT
+ | InputType.TYPE_TEXT_VARIATION_PASSWORD, "", false),
+ new TestData(InputType.TYPE_CLASS_TEXT
+ | InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD, "", false),
+ new TestData(InputType.TYPE_CLASS_TEXT
+ | InputType.TYPE_TEXT_VARIATION_WEB_PASSWORD, "", false),
+ new TestData(InputType.TYPE_CLASS_TEXT
+ | InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS, "", false),
+ new TestData(InputType.TYPE_CLASS_TEXT
+ | InputType.TYPE_TEXT_VARIATION_WEB_EMAIL_ADDRESS, "", false),
+ new TestData(InputType.TYPE_CLASS_TEXT
+ | InputType.TYPE_TEXT_VARIATION_EMAIL_SUBJECT, "", true),
+ new TestData(InputType.TYPE_CLASS_TEXT
+ | InputType.TYPE_TEXT_VARIATION_URI, "", false),
+ new TestData(0, "a", true),
+ new TestData(0, "nm", false),
+ new TestData(0, "a,nm", false),
+ new TestData(0, "nm,a", false),
+ new TestData(0, "a,nm,a", false),
+ new TestData(0, "com.google.android.inputmethod.latin.noMicrophoneKey", false),
+ new TestData(InputType.TYPE_CLASS_TEXT, "a", true),
+ new TestData(InputType.TYPE_CLASS_NUMBER, "a", false),
+ new TestData(InputType.TYPE_CLASS_PHONE, "a", false),
+ new TestData(InputType.TYPE_CLASS_DATETIME, "a", false),
+ new TestData(InputType.TYPE_CLASS_TEXT, "nm", false),
+ new TestData(InputType.TYPE_CLASS_NUMBER, "nm", false),
+ new TestData(InputType.TYPE_CLASS_PHONE, "nm", false),
+ new TestData(InputType.TYPE_CLASS_DATETIME, "nm", false),
+ };
+
+ EditorInfo editorInfo = new EditorInfo();
+ for (TestData testData : testDataList) {
+ editorInfo.inputType = testData.inputType;
+ editorInfo.privateImeOptions = testData.privateImeOptions;
+ assertEquals(testData.toString(),
+ testData.expectPreffered, MozcUtil.isVoiceInputPreferred(editorInfo));
+ }
+ }
}
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/MozcViewTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/MozcViewTest.java
index 3ca845a..a0687ab 100644
--- a/src/android/tests/src/com/google/android/inputmethod/japanese/MozcViewTest.java
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/MozcViewTest.java
@@ -29,8 +29,10 @@
package org.mozc.android.inputmethod.japanese;
+import static org.mozc.android.inputmethod.japanese.testing.MozcMatcher.sameOptional;
import static org.easymock.EasyMock.anyFloat;
import static org.easymock.EasyMock.anyInt;
+import static org.easymock.EasyMock.anyObject;
import static org.easymock.EasyMock.capture;
import static org.easymock.EasyMock.eq;
import static org.easymock.EasyMock.expect;
@@ -38,37 +40,48 @@
import static org.easymock.EasyMock.isA;
import static org.easymock.EasyMock.same;
+import org.mozc.android.inputmethod.japanese.CandidateViewManager.KeyboardCandidateViewHeightListener;
import org.mozc.android.inputmethod.japanese.FeedbackManager.FeedbackEvent;
import org.mozc.android.inputmethod.japanese.InOutAnimatedFrameLayout.VisibilityChangeListener;
-import org.mozc.android.inputmethod.japanese.JapaneseKeyboard.KeyboardSpecification;
import org.mozc.android.inputmethod.japanese.LayoutParamsAnimator.InterpolationListener;
import org.mozc.android.inputmethod.japanese.MozcView.DimensionPixelSize;
import org.mozc.android.inputmethod.japanese.MozcView.HeightLinearInterpolationListener;
import org.mozc.android.inputmethod.japanese.ViewManagerInterface.LayoutAdjustment;
import org.mozc.android.inputmethod.japanese.emoji.EmojiProviderType;
-import org.mozc.android.inputmethod.japanese.hardwarekeyboard.HardwareKeyboard.CompositionSwitchMode;
import org.mozc.android.inputmethod.japanese.keyboard.KeyEventHandler;
+import org.mozc.android.inputmethod.japanese.keyboard.KeyState.MetaState;
+import org.mozc.android.inputmethod.japanese.keyboard.Keyboard;
+import org.mozc.android.inputmethod.japanese.keyboard.Keyboard.KeyboardSpecification;
import org.mozc.android.inputmethod.japanese.keyboard.KeyboardActionListener;
+import org.mozc.android.inputmethod.japanese.keyboard.KeyboardView;
import org.mozc.android.inputmethod.japanese.keyboard.Row;
import org.mozc.android.inputmethod.japanese.model.SymbolCandidateStorage;
import org.mozc.android.inputmethod.japanese.model.SymbolCandidateStorage.SymbolHistoryStorage;
+import org.mozc.android.inputmethod.japanese.model.SymbolMajorCategory;
import org.mozc.android.inputmethod.japanese.model.SymbolMinorCategory;
import org.mozc.android.inputmethod.japanese.protobuf.ProtoCandidates.CandidateList;
import org.mozc.android.inputmethod.japanese.protobuf.ProtoCandidates.CandidateWord;
import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Command;
+import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.CompositionMode;
import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Output;
+import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Preedit;
+import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Preedit.Segment;
import org.mozc.android.inputmethod.japanese.resources.R;
import org.mozc.android.inputmethod.japanese.testing.InstrumentationTestCaseWithMock;
import org.mozc.android.inputmethod.japanese.testing.Parameter;
import org.mozc.android.inputmethod.japanese.testing.VisibilityProxy;
import org.mozc.android.inputmethod.japanese.ui.SideFrameStubProxy;
+import org.mozc.android.inputmethod.japanese.view.MozcImageView;
+import org.mozc.android.inputmethod.japanese.view.Skin;
import org.mozc.android.inputmethod.japanese.view.SkinType;
import com.google.common.base.Optional;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Rect;
+import android.graphics.drawable.Drawable;
import android.inputmethodservice.InputMethodService.Insets;
+import android.os.Build;
import android.os.Handler;
import android.os.Looper;
import android.test.mock.MockResources;
@@ -86,48 +99,60 @@
import android.widget.LinearLayout.LayoutParams;
import org.easymock.Capture;
+import org.easymock.IMockBuilder;
import java.util.Collections;
+import java.util.EnumSet;
/**
*/
public class MozcViewTest extends InstrumentationTestCaseWithMock {
+ private IMockBuilder<CandidateViewManager> createCandidateViewManagerMockBuilder() {
+ return createMockBuilder(CandidateViewManager.class)
+ .withConstructor(CandidateView.class, FloatingCandidateView.class)
+ .withArgs(createViewMockBuilder(CandidateView.class).createNiceMock(),
+ createViewMockBuilder(FloatingCandidateView.class).createNiceMock());
+ }
+
@SmallTest
public void testSetViewEventListener() {
+ Context context = getInstrumentation().getContext();
+
+ CandidateViewManager candidateViewManager =
+ createCandidateViewManagerMockBuilder().createMock();
ViewEventListener viewEventListener = createMock(ViewEventListener.class);
OnClickListener widenButtonClickListener = createMock(OnClickListener.class);
- CandidateView candidateView = createViewMock(CandidateView.class);
- candidateView.setViewEventListener(same(viewEventListener), isA(OnClickListener.class));
SymbolInputView symbolInputView = createViewMock(SymbolInputView.class);
- symbolInputView.setViewEventListener(same(viewEventListener),
- isA(OnClickListener.class));
- ImageView hardwareCompositionButton = new ImageView(getInstrumentation().getContext());
- ImageView widenButton = new ImageView(getInstrumentation().getContext());
-
OnClickListener leftAdjustButtonClickListener = createMock(OnClickListener.class);
OnClickListener rightAdjustButtonClickListener = createMock(OnClickListener.class);
-
+ OnClickListener mictophoneButtonClickListener = createMock(OnClickListener.class);
+ NarrowFrameView narrowFrameView = createViewMock(NarrowFrameView.class);
+ MozcImageView microphoneButton = new MozcImageView(context);
MozcView mozcView = createViewMockBuilder(MozcView.class)
.addMockedMethods(
- "checkInflated", "getCandidateView", "getSymbolInputView",
- "getHardwareCompositionButton", "getWidenButton")
+ "checkInflated", "getSymbolInputView", "getNarrowFrame", "getMicrophoneButton")
.createMock();
+ mozcView.candidateViewManager = candidateViewManager;
+
+ resetAll();
+
+ symbolInputView.setEventListener(
+ same(viewEventListener), isA(OnClickListener.class), isA(OnClickListener.class));
+ candidateViewManager.setEventListener(
+ same(viewEventListener), isA(KeyboardCandidateViewHeightListener.class));
mozcView.checkInflated();
expectLastCall().asStub();
- expect(mozcView.getCandidateView()).andStubReturn(candidateView);
expect(mozcView.getSymbolInputView()).andStubReturn(symbolInputView);
- expect(mozcView.getHardwareCompositionButton()).andStubReturn(hardwareCompositionButton);
- expect(mozcView.getWidenButton()).andStubReturn(widenButton);
- viewEventListener.onHardwareKeyboardCompositionModeChange(CompositionSwitchMode.TOGGLE);
- widenButtonClickListener.onClick(widenButton);
+ expect(mozcView.getNarrowFrame()).andStubReturn(narrowFrameView);
+ expect(mozcView.getMicrophoneButton()).andStubReturn(microphoneButton);
+ narrowFrameView.setEventListener(viewEventListener, widenButtonClickListener);
replayAll();
mozcView.setEventListener(viewEventListener, widenButtonClickListener,
- leftAdjustButtonClickListener, rightAdjustButtonClickListener);
- mozcView.getHardwareCompositionButton().performClick();
- mozcView.getWidenButton().performClick();
+ leftAdjustButtonClickListener, rightAdjustButtonClickListener,
+ mictophoneButtonClickListener);
verifyAll();
@@ -145,7 +170,7 @@
public void testSetKeyEventHandler() {
KeyEventHandler keyEventHandler = new KeyEventHandler(
Looper.getMainLooper(), createNiceMock(KeyboardActionListener.class), 0, 0, 0);
- JapaneseKeyboardView keyboardView = createViewMock(JapaneseKeyboardView.class);
+ KeyboardView keyboardView = createViewMock(KeyboardView.class);
keyboardView.setKeyEventHandler(keyEventHandler);
SymbolInputView symbolInputView = createViewMock(SymbolInputView.class);
symbolInputView.setKeyEventHandler(keyEventHandler);
@@ -170,11 +195,11 @@
@SmallTest
public void testGetJapaneseKeyboard() {
- JapaneseKeyboard keyboard = new JapaneseKeyboard(
+ Keyboard keyboard = new Keyboard(
Optional.<String>absent(),
Collections.<Row>emptyList(), 1, KeyboardSpecification.TWELVE_KEY_TOGGLE_KANA);
- JapaneseKeyboardView keyboardView = createViewMock(JapaneseKeyboardView.class);
- expect(keyboardView.getJapaneseKeyboard()).andStubReturn(keyboard);
+ KeyboardView keyboardView = createViewMock(KeyboardView.class);
+ expect(keyboardView.getKeyboard()).andStubReturn(Optional.of(keyboard));
MozcView mozcView = createViewMockBuilder(MozcView.class)
.addMockedMethods("checkInflated", "getKeyboardView")
.createMock();
@@ -184,28 +209,37 @@
replayAll();
- assertSame(keyboard, mozcView.getJapaneseKeyboard());
+ assertSame(keyboard, mozcView.getKeyboard());
verifyAll();
}
@SmallTest
public void testSetJapaneseKeyboard() {
- JapaneseKeyboard keyboard = new JapaneseKeyboard(
+ Keyboard keyboard = new Keyboard(
Optional.<String>absent(),
Collections.<Row>emptyList(), 1, KeyboardSpecification.TWELVE_KEY_TOGGLE_KANA);
- JapaneseKeyboardView keyboardView = createViewMock(JapaneseKeyboardView.class);
- keyboardView.setJapaneseKeyboard(keyboard);
+ KeyboardView keyboardView = createViewMock(KeyboardView.class);
+ NarrowFrameView narrowFrame = createViewMock(NarrowFrameView.class);
+ CandidateViewManager candidateViewManager =
+ createCandidateViewManagerMockBuilder().createNiceMock();
MozcView mozcView = createViewMockBuilder(MozcView.class)
- .addMockedMethods("checkInflated", "getKeyboardView")
+ .addMockedMethods("checkInflated", "getKeyboardView", "getNarrowFrame")
.createMock();
+ mozcView.candidateViewManager = candidateViewManager;
+
+ resetAll();
+
mozcView.checkInflated();
expectLastCall().asStub();
expect(mozcView.getKeyboardView()).andStubReturn(keyboardView);
+ expect(mozcView.getNarrowFrame()).andStubReturn(narrowFrame);
+ keyboardView.setKeyboard(keyboard);
+ narrowFrame.setHardwareCompositionButtonImage(CompositionMode.HIRAGANA);
replayAll();
- mozcView.setJapaneseKeyboard(keyboard);
+ mozcView.setKeyboard(keyboard);
verifyAll();
}
@@ -254,29 +288,48 @@
}
}
+ @SuppressWarnings("deprecation")
@SmallTest
public void testSetSkinType() {
- CandidateView candidateView = createViewMock(CandidateView.class);
- JapaneseKeyboardView keyboardView = createViewMock(JapaneseKeyboardView.class);
+ Context context = getInstrumentation().getTargetContext();
+
+ CandidateViewManager candidateViewManager =
+ createCandidateViewManagerMockBuilder().createMock();
+ KeyboardView keyboardView = createViewMock(KeyboardView.class);
SymbolInputView symbolInputView = createViewMock(SymbolInputView.class);
+ NarrowFrameView narrowFrameView = createViewMock(NarrowFrameView.class);
+ MozcImageView microphoneButton = createViewMock(MozcImageView.class);
+ View separatorView = createViewMock(View.class);
+ View buttonFrame = createViewMock(View.class);
MozcView mozcView = createViewMockBuilder(MozcView.class)
- .addMockedMethods("checkInflated", "getKeyboardView", "getCandidateView",
- "getSymbolInputView")
+ .addMockedMethods("checkInflated", "getKeyboardView", "getSymbolInputView",
+ "getNarrowFrame", "getMicrophoneButton", "getButtonFrame",
+ "getMicrophoneButton", "getKeyboardFrameSeparator")
.createMock();
+ mozcView.candidateViewManager = candidateViewManager;
for (SkinType skinType : SkinType.values()) {
resetAll();
mozcView.checkInflated();
expectLastCall().asStub();
expect(mozcView.getKeyboardView()).andStubReturn(keyboardView);
- expect(mozcView.getCandidateView()).andStubReturn(candidateView);
expect(mozcView.getSymbolInputView()).andStubReturn(symbolInputView);
- keyboardView.setSkinType(skinType);
- candidateView.setSkinType(skinType);
- symbolInputView.setSkinType(skinType);
+ expect(mozcView.getNarrowFrame()).andStubReturn(narrowFrameView);
+ expect(mozcView.getMicrophoneButton()).andStubReturn(microphoneButton);
+ expect(mozcView.getButtonFrame()).andStubReturn(buttonFrame);
+ expect(mozcView.getKeyboardFrameSeparator()).andStubReturn(separatorView);
+ Skin skin = skinType.getSkin(context.getResources());
+ keyboardView.setSkin(skin);
+ candidateViewManager.setSkin(skin);
+ symbolInputView.setSkin(skin);
+ microphoneButton.setSkin(skin);
+ microphoneButton.setBackgroundDrawable(anyObject(Drawable.class));
+ narrowFrameView.setSkin(skin);
+ buttonFrame.setBackgroundDrawable(anyObject(Drawable.class));
+ separatorView.setBackgroundDrawable(anyObject(Drawable.class));
replayAll();
- mozcView.setSkinType(skinType);
+ mozcView.setSkin(skin);
verifyAll();
}
@@ -284,18 +337,21 @@
@SmallTest
public void testSetPopupEnabled() {
- JapaneseKeyboardView keyboardView = createViewMock(JapaneseKeyboardView.class);
+ KeyboardView keyboardView = createViewMock(KeyboardView.class);
+ SymbolInputView symbolInputView = createViewMock(SymbolInputView.class);
MozcView mozcView = createViewMockBuilder(MozcView.class)
- .addMockedMethods("checkInflated", "getKeyboardView")
+ .addMockedMethods("checkInflated", "getKeyboardView", "getSymbolInputView")
.createMock();
boolean parameters[] = { true, false };
for (boolean popupEnabled : parameters) {
resetAll();
keyboardView.setPopupEnabled(popupEnabled);
+ symbolInputView.setPopupEnabled(popupEnabled);
mozcView.checkInflated();
expectLastCall().asStub();
expect(mozcView.getKeyboardView()).andStubReturn(keyboardView);
+ expect(mozcView.getSymbolInputView()).andStubReturn(symbolInputView);
replayAll();
mozcView.setPopupEnabled(popupEnabled);
@@ -304,13 +360,15 @@
}
}
+ @SuppressWarnings("unchecked")
@SmallTest
public void testSetCommand() {
- CandidateView candidateView = createViewMock(CandidateView.class);
+ CandidateViewManager candidateViewManager =
+ createCandidateViewManagerMockBuilder().createMock();
MozcView mozcView = createViewMockBuilder(MozcView.class)
- .addMockedMethods("checkInflated", "getCandidateView", "startCandidateViewInAnimation",
- "startCandidateViewOutAnimation")
+ .addMockedMethods("checkInflated", "updateMetaStatesBasedOnOutput")
.createMock();
+ mozcView.candidateViewManager = candidateViewManager;
// Set non-empty command.
{
@@ -320,11 +378,11 @@
.addCandidates(CandidateWord.getDefaultInstance())))
.buildPartial();
- candidateView.update(command);
- mozcView.startCandidateViewInAnimation();
+ resetAll();
+ candidateViewManager.update(command);
mozcView.checkInflated();
expectLastCall().asStub();
- expect(mozcView.getCandidateView()).andStubReturn(candidateView);
+ mozcView.updateMetaStatesBasedOnOutput(anyObject(Output.class));
replayAll();
mozcView.setCommand(command);
@@ -334,20 +392,64 @@
// Set empty command.
{
+ Command emptyCommand = Command.getDefaultInstance();
+
resetAll();
- mozcView.startCandidateViewOutAnimation();
mozcView.checkInflated();
expectLastCall().asStub();
- expect(mozcView.getCandidateView()).andStubReturn(candidateView);
+ candidateViewManager.update(emptyCommand);
+ mozcView.updateMetaStatesBasedOnOutput(anyObject(Output.class));
replayAll();
- mozcView.setCommand(Command.getDefaultInstance());
+ mozcView.setCommand(emptyCommand);
verifyAll();
}
}
@SmallTest
+ public void testUpdateMetaStatesBasedOnOutput() {
+ MozcView mozcView = createViewMockBuilder(MozcView.class)
+ .addMockedMethods("getKeyboardView")
+ .createMock();
+ KeyboardView keyboard = createViewMockBuilder(KeyboardView.class)
+ .addMockedMethod("updateMetaStates")
+ .createMock();
+
+ {
+ // No preedit field -> Remove COMPOSING
+ resetAll();
+ keyboard.updateMetaStates(Collections.<MetaState>emptySet(), EnumSet.of(MetaState.COMPOSING));
+ expect(mozcView.getKeyboardView()).andStubReturn(keyboard);
+ replayAll();
+ mozcView.updateMetaStatesBasedOnOutput(Output.getDefaultInstance());
+ verifyAll();
+ }
+ {
+ // No segments -> Remove COMPOSING
+ resetAll();
+ keyboard.updateMetaStates(Collections.<MetaState>emptySet(), EnumSet.of(MetaState.COMPOSING));
+ expect(mozcView.getKeyboardView()).andStubReturn(keyboard);
+ replayAll();
+ mozcView.updateMetaStatesBasedOnOutput(
+ Output.newBuilder().setPreedit(Preedit.getDefaultInstance()).buildPartial());
+ verifyAll();
+ }
+ {
+ // With segments -> Add COMPOSING
+ resetAll();
+ keyboard.updateMetaStates(EnumSet.of(MetaState.COMPOSING), Collections.<MetaState>emptySet());
+ expect(mozcView.getKeyboardView()).andStubReturn(keyboard);
+ replayAll();
+ mozcView.updateMetaStatesBasedOnOutput(
+ Output.newBuilder().setPreedit(Preedit.newBuilder().addSegment(
+ Segment.getDefaultInstance()).buildPartial()).buildPartial());
+ verifyAll();
+ }
+
+ }
+
+ @SmallTest
public void testReset() {
LayoutInflater inflater = LayoutInflater.from(getInstrumentation().getTargetContext());
MozcView mozcView = MozcView.class.cast(inflater.inflate(R.layout.mozc_view, null));
@@ -357,7 +459,6 @@
keyboardFrame.setVisibility(View.GONE);
keyboardFrame.getLayoutParams().height = 0;
- mozcView.getCandidateView().startInAnimation();
mozcView.getSymbolInputView().startInAnimation();
}
@@ -365,26 +466,53 @@
assertEquals(View.VISIBLE, mozcView.getKeyboardFrame().getVisibility());
assertTrue(mozcView.getKeyboardFrame().getLayoutParams().height > 0);
-
- assertEquals(View.GONE, mozcView.getCandidateView().getVisibility());
- assertNull(mozcView.getCandidateView().getAnimation());
-
+ assertFalse(mozcView.candidateViewManager.isKeyboardCandidateViewVisible());
assertEquals(View.GONE, mozcView.getSymbolInputView().getVisibility());
assertNull(mozcView.getSymbolInputView().getAnimation());
}
@SmallTest
+ public void testSetGlobeButtonEnabled() {
+ LayoutInflater inflater = LayoutInflater.from(getInstrumentation().getTargetContext());
+ MozcView mozcView = MozcView.class.cast(inflater.inflate(R.layout.mozc_view, null));
+
+ assertEquals(EnumSet.of(MetaState.NO_GLOBE), mozcView.getKeyboardView().getMetaStates());
+
+ mozcView.setGlobeButtonEnabled(false);
+ assertEquals(EnumSet.of(MetaState.NO_GLOBE), mozcView.getKeyboardView().getMetaStates());
+
+ mozcView.setGlobeButtonEnabled(true);
+ assertEquals(EnumSet.of(MetaState.GLOBE), mozcView.getKeyboardView().getMetaStates());
+
+ mozcView.getKeyboardView().updateMetaStates(EnumSet.of(MetaState.ACTION_GO, MetaState.CAPS_LOCK,
+ MetaState.VARIATION_EMAIL_ADDRESS, MetaState.GLOBE), EnumSet.allOf(MetaState.class));
+ mozcView.setGlobeButtonEnabled(false);
+ assertEquals(EnumSet.of(MetaState.NO_GLOBE,
+ MetaState.ACTION_GO,
+ MetaState.CAPS_LOCK,
+ MetaState.VARIATION_EMAIL_ADDRESS),
+ mozcView.getKeyboardView().getMetaStates());
+ mozcView.setGlobeButtonEnabled(true);
+ assertEquals(EnumSet.of(MetaState.ACTION_GO,
+ MetaState.CAPS_LOCK,
+ MetaState.VARIATION_EMAIL_ADDRESS,
+ MetaState.GLOBE),
+ mozcView.getKeyboardView().getMetaStates());
+
+ mozcView.reset();
+ assertEquals(EnumSet.of(MetaState.NO_GLOBE), mozcView.getKeyboardView().getMetaStates());
+ }
+
+ @SmallTest
public void testGetVisibleViewHeight() {
Resources resources = getInstrumentation().getTargetContext().getResources();
- int imeWindowHeight =
- resources.getDimensionPixelSize(R.dimen.ime_window_height)
- - resources.getDimensionPixelSize(R.dimen.translucent_border_height);
+ int imeWindowHeight = resources.getDimensionPixelSize(R.dimen.ime_window_height);
int inputFrameHeight =
resources.getDimensionPixelSize(R.dimen.input_frame_height);
- int narrowImeWindowHeight =
- resources.getDimensionPixelSize(R.dimen.narrow_ime_window_height)
- - resources.getDimensionPixelSize(R.dimen.translucent_border_height);
+ int buttonFrameHeight = resources.getDimensionPixelSize(R.dimen.button_frame_height);
+ int symbolInputFrameHeight = inputFrameHeight + buttonFrameHeight;
+ int narrowImeWindowHeight = resources.getDimensionPixelSize(R.dimen.narrow_ime_window_height);
int narrowFrameHeight =
resources.getDimensionPixelSize(R.dimen.narrow_frame_height);
@@ -406,11 +534,11 @@
// At normal view mode.
// If both candidate view and symbol input view are hidden, the height of the view
// equals to input frame height.
- new TestData(false, View.GONE, View.GONE, inputFrameHeight),
+ new TestData(false, View.GONE, View.GONE, inputFrameHeight + buttonFrameHeight),
// If either candidate view or symbol input view are visible, the height of the view
// equals to ime window height.
new TestData(false, View.VISIBLE, View.GONE, imeWindowHeight),
- new TestData(false, View.GONE, View.VISIBLE, imeWindowHeight),
+ new TestData(false, View.GONE, View.VISIBLE, symbolInputFrameHeight),
// At narrow view mode.
// If both candidate view and symbol input view are hidden, the height of the view
@@ -424,9 +552,11 @@
LayoutInflater inflater = LayoutInflater.from(getInstrumentation().getTargetContext());
MozcView mozcView = MozcView.class.cast(inflater.inflate(R.layout.mozc_view, null));
+ mozcView.allowFloatingCandidateMode = false;
for (TestData testData : testDataList) {
mozcView.setLayoutAdjustmentAndNarrowMode(LayoutAdjustment.FILL, testData.narrowMode);
- mozcView.getCandidateView().setVisibility(testData.candidateViewVisibility);
+ mozcView.candidateViewManager.keyboardCandidateView.setVisibility(
+ testData.candidateViewVisibility);
mozcView.getSymbolInputView().setVisibility(testData.symbolInputViewVisibility);
assertEquals(testData.toString(),
testData.expectedHeight, mozcView.getVisibleViewHeight());
@@ -437,7 +567,6 @@
public void testSymbolInputViewInitializationLazily() {
LayoutInflater inflater = LayoutInflater.from(getInstrumentation().getTargetContext());
MozcView mozcView = MozcView.class.cast(inflater.inflate(R.layout.mozc_view, null));
- mozcView.isDropShadowExpanded = true;
SymbolCandidateStorage candidateStorage = createMockBuilder(SymbolCandidateStorage.class)
.withConstructor(SymbolHistoryStorage.class)
.withArgs(createMock(SymbolHistoryStorage.class))
@@ -451,7 +580,7 @@
assertFalse(mozcView.getSymbolInputView().isInflated());
// Once symbol input view is shown, the view (and its children) should be inflated.
- assertTrue(mozcView.showSymbolInputView());
+ assertTrue(mozcView.showSymbolInputView(Optional.<SymbolMajorCategory>absent()));
assertTrue(mozcView.getSymbolInputView().isInflated());
// Even after closing the view, the inflation state should be kept.
@@ -463,9 +592,9 @@
public void testUpdateInputFrameHeight() {
Resources resources = getInstrumentation().getTargetContext().getResources();
- int shadowHeight = resources.getDimensionPixelSize(R.dimen.translucent_border_height);
int imeWindowHeight = resources.getDimensionPixelSize(R.dimen.ime_window_height);
int inputFrameHeight = resources.getDimensionPixelSize(R.dimen.input_frame_height);
+ int buttonFrameHeight = resources.getDimensionPixelSize(R.dimen.button_frame_height);
int narrowImeWindowHeight = resources.getDimensionPixelSize(R.dimen.narrow_ime_window_height);
int narrowFrameHeight = resources.getDimensionPixelSize(R.dimen.narrow_frame_height);
@@ -488,7 +617,7 @@
// At fullscreen mode and narrow mode
// If candidate view is hidden, the height of the view
// equals to narrow frame height.
- new TestData(true, true, View.GONE, narrowFrameHeight + shadowHeight),
+ new TestData(true, true, View.GONE, narrowFrameHeight),
// If candidate view is visible, the height of the view
// equals to narrow ime window height.
new TestData(true, true, View.VISIBLE, narrowImeWindowHeight),
@@ -496,7 +625,7 @@
// At fullscreen mode and not narrow mode
// If candidate view is hidden, the height of the view
// equals to input frame height.
- new TestData(true, false, View.GONE, inputFrameHeight + shadowHeight),
+ new TestData(true, false, View.GONE, inputFrameHeight + buttonFrameHeight),
// If candidate view is visible, the height of the view
// equals to ime window height.
new TestData(true, false, View.VISIBLE, imeWindowHeight),
@@ -514,11 +643,13 @@
LayoutInflater inflater = LayoutInflater.from(getInstrumentation().getTargetContext());
MozcView mozcView = MozcView.class.cast(inflater.inflate(R.layout.mozc_view, null));
+ mozcView.allowFloatingCandidateMode = false;
for (TestData testData : testDataList) {
mozcView.setFullscreenMode(testData.fullscreenMode);
mozcView.resetFullscreenMode();
mozcView.setLayoutAdjustmentAndNarrowMode(LayoutAdjustment.FILL, testData.narrowMode);
- mozcView.getCandidateView().setVisibility(testData.candidateViewVisibility);
+ mozcView.candidateViewManager.keyboardCandidateView.setVisibility(
+ testData.candidateViewVisibility);
mozcView.updateInputFrameHeight();
assertEquals(testData.toString(),
@@ -546,24 +677,38 @@
Context context = getInstrumentation().getTargetContext();
LayoutInflater inflater = LayoutInflater.from(context);
MozcView mozcView = MozcView.class.cast(inflater.inflate(R.layout.mozc_view, null));
+ CandidateViewManager candidateViewManager =
+ createCandidateViewManagerMockBuilder().createMock();
+ mozcView.allowFloatingCandidateMode = false;
+ mozcView.candidateViewManager = candidateViewManager;
View overlayView = mozcView.getOverlayView();
LinearLayout textInputFrame = mozcView.getTextInputFrame();
VisibilityChangeListener onVisibilityChangeListener = mozcView.onVisibilityChangeListener;
+ resetAll();
+ candidateViewManager.setOnVisibilityChangeListener(sameOptional(onVisibilityChangeListener));
+ candidateViewManager.setExtractedMode(true);
+ expect(candidateViewManager.isKeyboardCandidateViewVisible()).andStubReturn(false);
+ replayAll();
mozcView.setFullscreenMode(true);
mozcView.resetFullscreenMode();
- assertEquals(0, overlayView.getLayoutParams().height);
+ verifyAll();
+ assertEquals(View.GONE, overlayView.getVisibility());
assertEquals(FrameLayout.LayoutParams.WRAP_CONTENT, textInputFrame.getLayoutParams().height);
assertSame(onVisibilityChangeListener,
- mozcView.getCandidateView().onVisibilityChangeListener);
- assertSame(onVisibilityChangeListener,
mozcView.getSymbolInputView().onVisibilityChangeListener);
+ resetAll();
+ candidateViewManager.setOnVisibilityChangeListener(
+ Optional.<InOutAnimatedFrameLayout.VisibilityChangeListener>absent());
+ expect(candidateViewManager.isKeyboardCandidateViewVisible()).andStubReturn(false);
+ candidateViewManager.setExtractedMode(false);
+ replayAll();
mozcView.setFullscreenMode(false);
mozcView.resetFullscreenMode();
- assertEquals(LinearLayout.LayoutParams.MATCH_PARENT, overlayView.getLayoutParams().height);
+ verifyAll();
+ assertEquals(View.VISIBLE, overlayView.getVisibility());
assertEquals(FrameLayout.LayoutParams.MATCH_PARENT, textInputFrame.getLayoutParams().height);
- assertNull(mozcView.getCandidateView().onVisibilityChangeListener);
assertNull(mozcView.getSymbolInputView().onVisibilityChangeListener);
}
@@ -588,7 +733,8 @@
MozcView mozcView =
MozcView.class.cast(LayoutInflater.from(context).inflate(R.layout.mozc_view, null));
View keyboardFrame = mozcView.getKeyboardFrame();
- View inputFrameButton = mozcView.getCandidateView().getInputFrameFoldButton();
+ View inputFrameButton =
+ mozcView.candidateViewManager.keyboardCandidateView.getInputFrameFoldButton();
View narrowFrame = mozcView.getNarrowFrame();
mozcView.setLayoutAdjustmentAndNarrowMode(LayoutAdjustment.FILL, true);
@@ -631,17 +777,23 @@
@SmallTest
public void testSetLayoutAdjustmentAndNarrowMode() {
+ Context context = getInstrumentation().getTargetContext();
+ Resources resources = context.getResources();
+
MozcView mozcView = createViewMockBuilder(MozcView.class)
.addMockedMethods("checkInflated", "getForegroundFrame", "getInputFrameHeight",
"updateBackgroundColor", "updateInputFrameHeight", "getSymbolInputView",
- "getCandidateView", "getConversionCandidateWordContainerView",
- "getKeyboardFrame", "getNarrowFrame", "resetKeyboardFrameVisibility")
+ "getKeyboardFrame", "getNarrowFrame", "getButtonFrame",
+ "resetKeyboardFrameVisibility")
.createMock();
+ CandidateViewManager candidateViewManager =
+ createCandidateViewManagerMockBuilder().createMock();
+ mozcView.candidateViewManager = candidateViewManager;
View foreGroundFrame = createViewMockBuilder(View.class)
.addMockedMethods("getLayoutParams", "setLayoutParams")
.createMock();
- View keyboardFrame = new View(getInstrumentation().getTargetContext());
- FrameLayout narrowFrame = new FrameLayout(getInstrumentation().getTargetContext());
+ View keyboardFrame = new View(context);
+ NarrowFrameView narrowFrameView = new NarrowFrameView(context);
SideFrameStubProxy leftFrameStubProxy = createMock(SideFrameStubProxy.class);
SideFrameStubProxy rightFrameStubProxy = createMock(SideFrameStubProxy.class);
VisibilityProxy.setField(mozcView, "leftFrameStubProxy", leftFrameStubProxy);
@@ -649,13 +801,7 @@
SymbolInputView symbolInputView = createViewMockBuilder(SymbolInputView.class)
.addMockedMethods("setCandidateTextDimension")
.createMock();
- CandidateView candidateView = createViewMockBuilder(CandidateView.class)
- .addMockedMethods("setCandidateTextDimension", "setNarrowMode")
- .createMock();
- ConversionCandidateWordContainerView conversionCandidateWordContainerView =
- createViewMockBuilder(ConversionCandidateWordContainerView.class)
- .addMockedMethods("setCandidateTextDimension")
- .createMock();
+ View buttonFrame = new View(context);
class TestData extends Parameter {
final LayoutAdjustment layoutAdjustment;
@@ -678,7 +824,6 @@
}
}
- Resources resources = getInstrumentation().getTargetContext().getResources();
int displayWidth = resources.getDisplayMetrics().widthPixels;
int partialWidth = resources.getDimensionPixelSize(R.dimen.ime_window_partial_width)
+ resources.getDimensionPixelSize(R.dimen.side_frame_width);
@@ -698,6 +843,13 @@
displayWidth, Gravity.BOTTOM, View.GONE, View.GONE),
};
+ boolean isCursorAnchorInfoEnabled = Build.VERSION.SDK_INT >= 21;
+ resetAll();
+ candidateViewManager.setAllowFloatingMode(isCursorAnchorInfoEnabled);
+ replayAll();
+ mozcView.setCursorAnchorInfoEnabled(isCursorAnchorInfoEnabled);
+ verifyAll();
+
for (TestData testData : testDataList) {
Capture<FrameLayout.LayoutParams> layoutCapture = new Capture<FrameLayout.LayoutParams>();
resetAll();
@@ -706,19 +858,16 @@
expect(mozcView.getInputFrameHeight()).andStubReturn(100);
expect(mozcView.getForegroundFrame()).andReturn(foreGroundFrame);
expect(foreGroundFrame.getLayoutParams()).andReturn(new FrameLayout.LayoutParams(0, 0));
- expect(mozcView.getCandidateView()).andStubReturn(candidateView);
expect(mozcView.getSymbolInputView()).andStubReturn(symbolInputView);
- expect(mozcView.getConversionCandidateWordContainerView())
- .andStubReturn(conversionCandidateWordContainerView);
- candidateView.setCandidateTextDimension(anyFloat(), anyFloat());
- candidateView.setNarrowMode(testData.narrowMode);
+ candidateViewManager.setCandidateTextDimension(anyFloat(), anyFloat());
+ candidateViewManager.setNarrowMode(testData.narrowMode);
symbolInputView.setCandidateTextDimension(anyFloat(), anyFloat());
- conversionCandidateWordContainerView.setCandidateTextDimension(anyFloat());
foreGroundFrame.setLayoutParams(capture(layoutCapture));
leftFrameStubProxy.setFrameVisibility(testData.expectLeftFrameVisibility);
rightFrameStubProxy.setFrameVisibility(testData.expectRightFrameVisibility);
expect(mozcView.getKeyboardFrame()).andStubReturn(keyboardFrame);
- expect(mozcView.getNarrowFrame()).andStubReturn(narrowFrame);
+ expect(mozcView.getNarrowFrame()).andStubReturn(narrowFrameView);
+ expect(mozcView.getButtonFrame()).andStubReturn(buttonFrame);
if (!testData.narrowMode) {
mozcView.resetKeyboardFrameVisibility();
}
@@ -726,8 +875,8 @@
mozcView.updateBackgroundColor();
replayAll();
- mozcView.setLayoutAdjustmentAndNarrowMode(testData.layoutAdjustment, testData.narrowMode);
+ mozcView.setLayoutAdjustmentAndNarrowMode(testData.layoutAdjustment, testData.narrowMode);
verifyAll();
assertEquals(testData.toString(), testData.layoutAdjustment, mozcView.layoutAdjustment);
assertEquals(testData.toString(),
@@ -735,14 +884,14 @@
assertEquals(testData.toString(),
testData.expectForegroundFrameGravity, layoutCapture.getValue().gravity);
assertEquals(testData.narrowMode ? View.GONE : View.VISIBLE, keyboardFrame.getVisibility());
- assertEquals(testData.narrowMode ? View.VISIBLE : View.GONE, narrowFrame.getVisibility());
+ assertEquals(testData.narrowMode ? View.VISIBLE : View.GONE, narrowFrameView.getVisibility());
}
}
@SmallTest
public void testUpdateBackgroundColor() {
MozcView mozcView = createViewMockBuilder(MozcView.class)
- .addMockedMethods("getBottomBackground")
+ .addMockedMethods("getBottomBackground", "isFloatingMode")
.createMock();
View bottomBackground = createViewMockBuilder(View.class)
@@ -756,7 +905,7 @@
final int expectResourceId;
- TestData(boolean fullscreenMode, boolean narrowMode, final boolean isFloatable,
+ TestData(boolean fullscreenMode, boolean narrowMode, boolean isFloatable,
int expectedResourceId) {
this.fullscreenMode = fullscreenMode;
this.narrowMode = narrowMode;
@@ -872,11 +1021,10 @@
}
@SmallTest
- public void testExpandDropShadowAndBackground() {
+ public void testExpandBottomBackgroundView() {
MozcView mozcView = createViewMockBuilder(MozcView.class)
- .addMockedMethods("getDropShadowTop", "getBottomBackground")
+ .addMockedMethods("getBottomBackground")
.createMock();
- View dropShadowTop = createViewMock(View.class);
View bottomBackground = createViewMockBuilder(View.class)
.addMockedMethods("getLayoutParams", "setLayoutParams")
.createMock();
@@ -884,45 +1032,34 @@
SideFrameStubProxy rightFrameStubProxy = createMock(SideFrameStubProxy.class);
VisibilityProxy.setField(mozcView, "leftFrameStubProxy", leftFrameStubProxy);
VisibilityProxy.setField(mozcView, "rightFrameStubProxy", rightFrameStubProxy);
- Resources resources = getInstrumentation().getTargetContext().getResources();
int imeWindowHeight = 100;
{
resetAll();
mozcView.imeWindowHeight = imeWindowHeight;
- expect(mozcView.getDropShadowTop()).andStubReturn(dropShadowTop);
expect(mozcView.getBottomBackground()).andStubReturn(bottomBackground);
- leftFrameStubProxy.flipDropShadowVisibility(View.INVISIBLE);
- rightFrameStubProxy.flipDropShadowVisibility(View.INVISIBLE);
- dropShadowTop.setVisibility(View.VISIBLE);
expect(bottomBackground.getLayoutParams()).andStubReturn(new LayoutParams(0, 0));
Capture<LayoutParams> captureBottomBackground = new Capture<LayoutParams>();
bottomBackground.setLayoutParams(capture(captureBottomBackground));
replayAll();
mozcView.fullscreenMode = false;
- mozcView.expandDropShadowAndBackground();
+ mozcView.changeBottomBackgroundHeight(imeWindowHeight);
verifyAll();
- assertEquals(imeWindowHeight
- - resources.getDimensionPixelSize(R.dimen.translucent_border_height),
- captureBottomBackground.getValue().height);
+ assertEquals(imeWindowHeight, captureBottomBackground.getValue().height);
}
{
resetAll();
mozcView.imeWindowHeight = imeWindowHeight;
- expect(mozcView.getDropShadowTop()).andStubReturn(dropShadowTop);
expect(mozcView.getBottomBackground()).andStubReturn(bottomBackground);
- leftFrameStubProxy.flipDropShadowVisibility(View.INVISIBLE);
- rightFrameStubProxy.flipDropShadowVisibility(View.INVISIBLE);
- dropShadowTop.setVisibility(View.VISIBLE);
expect(bottomBackground.getLayoutParams()).andStubReturn(new LayoutParams(0, 0));
Capture<LayoutParams> captureBottomBackground = new Capture<LayoutParams>();
bottomBackground.setLayoutParams(capture(captureBottomBackground));
replayAll();
mozcView.fullscreenMode = true;
- mozcView.expandDropShadowAndBackground();
+ mozcView.changeBottomBackgroundHeight(imeWindowHeight);
verifyAll();
assertEquals(imeWindowHeight, captureBottomBackground.getValue().height);
@@ -930,12 +1067,11 @@
}
@SmallTest
- public void testCollapseDropShadowAndBackground() {
+ public void testCollapseBottomBackgroundView() {
Resources resources = getInstrumentation().getTargetContext().getResources();
MozcView mozcView = createViewMockBuilder(MozcView.class)
- .addMockedMethods("getDropShadowTop", "getBottomBackground", "getInputFrameHeight")
+ .addMockedMethods("getBottomBackground", "getInputFrameHeight")
.createMock();
- View dropShadowTop = createViewMock(View.class);
View bottomBackground = createViewMockBuilder(View.class)
.addMockedMethods("getLayoutParams", "setLayoutParams")
.createMock();
@@ -944,103 +1080,66 @@
VisibilityProxy.setField(mozcView, "leftFrameStubProxy", leftFrameStubProxy);
VisibilityProxy.setField(mozcView, "rightFrameStubProxy", rightFrameStubProxy);
int inputFrameHeight = 100;
+ int buttonFrameHeight = resources.getDimensionPixelSize(R.dimen.button_frame_height);
{
resetAll();
expect(mozcView.getInputFrameHeight()).andStubReturn(inputFrameHeight);
- expect(mozcView.getDropShadowTop()).andStubReturn(dropShadowTop);
expect(mozcView.getBottomBackground()).andStubReturn(bottomBackground);
- leftFrameStubProxy.flipDropShadowVisibility(View.VISIBLE);
- rightFrameStubProxy.flipDropShadowVisibility(View.VISIBLE);
- dropShadowTop.setVisibility(View.INVISIBLE);
expect(bottomBackground.getLayoutParams()).andStubReturn(new LayoutParams(0, 0));
Capture<LayoutParams> captureBottomBackground = new Capture<LayoutParams>();
bottomBackground.setLayoutParams(capture(captureBottomBackground));
replayAll();
mozcView.fullscreenMode = false;
- mozcView.collapseDropShadowAndBackground();
+ mozcView.resetBottomBackgroundHeight();
verifyAll();
- assertEquals(inputFrameHeight, captureBottomBackground.getValue().height);
+ assertEquals(inputFrameHeight + buttonFrameHeight, captureBottomBackground.getValue().height);
}
{
resetAll();
expect(mozcView.getInputFrameHeight()).andStubReturn(inputFrameHeight);
- expect(mozcView.getDropShadowTop()).andStubReturn(dropShadowTop);
expect(mozcView.getBottomBackground()).andStubReturn(bottomBackground);
- leftFrameStubProxy.flipDropShadowVisibility(View.VISIBLE);
- rightFrameStubProxy.flipDropShadowVisibility(View.VISIBLE);
- dropShadowTop.setVisibility(View.VISIBLE);
expect(bottomBackground.getLayoutParams()).andStubReturn(new LayoutParams(0, 0));
Capture<LayoutParams> captureBottomBackground = new Capture<LayoutParams>();
bottomBackground.setLayoutParams(capture(captureBottomBackground));
replayAll();
mozcView.fullscreenMode = true;
- mozcView.collapseDropShadowAndBackground();
+ mozcView.resetBottomBackgroundHeight();
verifyAll();
- assertEquals(inputFrameHeight
- + resources.getDimensionPixelSize(R.dimen.translucent_border_height),
- captureBottomBackground.getValue().height);
+ assertEquals(inputFrameHeight + buttonFrameHeight, captureBottomBackground.getValue().height);
}
}
@SmallTest
public void testStartAnimation() {
MozcView mozcView = createViewMockBuilder(MozcView.class)
- .addMockedMethods("getCandidateView", "getSymbolInputView",
- "expandDropShadowAndBackground", "collapseDropShadowAndBackground",
- "startDropShadowAnimation")
+ .addMockedMethods("getSymbolInputView",
+ "changeBottomBackgroundHeight", "resetBottomBackgroundHeight")
.createMock();
- CandidateView candidateView = createViewMockBuilder(CandidateView.class)
- .addMockedMethods("startInAnimation", "startOutAnimation", "getVisibility")
- .createMock();
+ CandidateViewManager candidateViewManager =
+ createCandidateViewManagerMockBuilder().createMock();
+ mozcView.candidateViewManager = candidateViewManager;
SymbolInputView symbolInputView = createViewMockBuilder(SymbolInputView.class)
.addMockedMethods("startInAnimation", "startOutAnimation", "getVisibility")
.createMock();
- Animation candidateViewInAnimation = createMock(Animation.class);
- Animation candidateViewOutAnimation = createMock(Animation.class);
Animation symbolInputViewInAnimation = createMock(Animation.class);
Animation symbolInputViewOutAnimation = createMock(Animation.class);
- Animation dropShadowCandidateViewInAnimation = createMock(Animation.class);
- Animation dropShadowCandidateViewOutAnimation = createMock(Animation.class);
- Animation dropShadowSymbolInputViewInAnimation = createMock(Animation.class);
- Animation dropShadowSymbolInputViewOutAnimation = createMock(Animation.class);
- mozcView.candidateViewInAnimation = candidateViewInAnimation;
- mozcView.candidateViewOutAnimation = candidateViewOutAnimation;
mozcView.symbolInputViewInAnimation = symbolInputViewInAnimation;
mozcView.symbolInputViewOutAnimation = symbolInputViewOutAnimation;
- mozcView.dropShadowCandidateViewInAnimation = dropShadowCandidateViewInAnimation;
- mozcView.dropShadowCandidateViewOutAnimation = dropShadowCandidateViewOutAnimation;
- mozcView.dropShadowSymbolInputViewInAnimation = dropShadowSymbolInputViewInAnimation;
- mozcView.dropShadowSymbolInputViewOutAnimation = dropShadowSymbolInputViewOutAnimation;
// Test startCandidateViewInAnimation.
{
resetAll();
- mozcView.isDropShadowExpanded = true;
- expect(mozcView.getCandidateView()).andReturn(candidateView);
- candidateView.startInAnimation();
+ mozcView.imeWindowHeight = 100;
+ mozcView.changeBottomBackgroundHeight(100);
replayAll();
- mozcView.startCandidateViewInAnimation();
-
- verifyAll();
- }
- {
- resetAll();
- mozcView.isDropShadowExpanded = false;
- expect(mozcView.getCandidateView()).andReturn(candidateView);
- candidateView.startInAnimation();
- mozcView.expandDropShadowAndBackground();
- mozcView.startDropShadowAnimation(candidateViewInAnimation,
- dropShadowCandidateViewInAnimation);
-
- replayAll();
- mozcView.startCandidateViewInAnimation();
+ mozcView.softwareKeyboardHeightListener.onExpanded();
verifyAll();
}
@@ -1048,29 +1147,22 @@
// Test startCandidateViewOutAnimation.
{
resetAll();
- expect(mozcView.getCandidateView()).andReturn(candidateView);
- candidateView.startOutAnimation();
expect(mozcView.getSymbolInputView()).andReturn(symbolInputView);
expect(symbolInputView.getVisibility()).andReturn(View.VISIBLE);
replayAll();
- mozcView.startCandidateViewOutAnimation();
+ mozcView.softwareKeyboardHeightListener.onCollapse();
verifyAll();
}
{
resetAll();
- mozcView.isDropShadowExpanded = true;
- expect(mozcView.getCandidateView()).andReturn(candidateView);
- candidateView.startOutAnimation();
expect(mozcView.getSymbolInputView()).andReturn(symbolInputView);
expect(symbolInputView.getVisibility()).andReturn(View.INVISIBLE);
- mozcView.collapseDropShadowAndBackground();
- mozcView.startDropShadowAnimation(candidateViewOutAnimation,
- dropShadowCandidateViewOutAnimation);
+ mozcView.resetBottomBackgroundHeight();
replayAll();
- mozcView.startCandidateViewOutAnimation();
+ mozcView.softwareKeyboardHeightListener.onCollapse();
verifyAll();
}
@@ -1078,24 +1170,10 @@
// Test startSymbolInputViewInAnimation.
{
resetAll();
- mozcView.isDropShadowExpanded = true;
expect(mozcView.getSymbolInputView()).andReturn(symbolInputView);
symbolInputView.startInAnimation();
-
- replayAll();
- mozcView.startSymbolInputViewInAnimation();
-
- verifyAll();
- }
- {
- resetAll();
- mozcView.isDropShadowExpanded = false;
- expect(mozcView.getSymbolInputView()).andReturn(symbolInputView);
- symbolInputView.startInAnimation();
-
- mozcView.expandDropShadowAndBackground();
- mozcView.startDropShadowAnimation(symbolInputViewInAnimation,
- dropShadowSymbolInputViewInAnimation);
+ mozcView.symbolInputViewHeight = 200;
+ mozcView.changeBottomBackgroundHeight(200);
replayAll();
mozcView.startSymbolInputViewInAnimation();
@@ -1108,24 +1186,8 @@
resetAll();
expect(mozcView.getSymbolInputView()).andReturn(symbolInputView);
symbolInputView.startOutAnimation();
- expect(mozcView.getCandidateView()).andReturn(candidateView);
- expect(candidateView.getVisibility()).andReturn(View.VISIBLE);
-
- replayAll();
- mozcView.startSymbolInputViewOutAnimation();
-
- verifyAll();
- }
- {
- resetAll();
- mozcView.isDropShadowExpanded = true;
- expect(mozcView.getSymbolInputView()).andReturn(symbolInputView);
- symbolInputView.startOutAnimation();
- expect(mozcView.getCandidateView()).andReturn(candidateView);
- expect(candidateView.getVisibility()).andReturn(View.INVISIBLE);
- mozcView.collapseDropShadowAndBackground();
- mozcView.startDropShadowAnimation(symbolInputViewOutAnimation,
- dropShadowSymbolInputViewOutAnimation);
+ expect(candidateViewManager.isKeyboardCandidateViewVisible()).andReturn(false);
+ mozcView.resetBottomBackgroundHeight();
replayAll();
mozcView.startSymbolInputViewOutAnimation();
@@ -1137,15 +1199,15 @@
@SmallTest
public void testSetKeyboardHeight() {
MozcView mozcView = createViewMockBuilder(MozcView.class)
- .addMockedMethods("checkInflated", "getResources",
+ .addMockedMethods("checkInflated", "getSymbolInputView",
"updateInputFrameHeight", "resetHeightDependingComponents")
.createMock();
- Resources resources = createMock(MockResources.class);
+ SymbolInputView symbolInputView = createViewMockBuilder(SymbolInputView.class)
+ .addMockedMethods("setVerticalDimension")
+ .createMock();
mozcView.checkInflated();
- expect(mozcView.getResources()).andStubReturn(resources);
- expect(resources.getDimensionPixelSize(R.dimen.ime_window_height)).andStubReturn(300);
- expect(resources.getDimensionPixelSize(R.dimen.input_frame_height)).andStubReturn(200);
- createViewMock(SymbolInputView.class);
+ expect(mozcView.getSymbolInputView()).andStubReturn(symbolInputView);
+ symbolInputView.setVerticalDimension(anyInt(), eq(1.2f, 1e-5f));
mozcView.updateInputFrameHeight();
mozcView.resetHeightDependingComponents();
@@ -1153,8 +1215,11 @@
mozcView.setKeyboardHeightRatio(120);
verifyAll();
- assertEquals(360, mozcView.imeWindowHeight);
- assertEquals(240, mozcView.getInputFrameHeight());
+ Resources resources = getInstrumentation().getTargetContext().getResources();
+ float originalImeWindowHeight = resources.getDimension(R.dimen.ime_window_height);
+ float originalInputFrameHeight = resources.getDimension(R.dimen.input_frame_height);
+ assertEquals(Math.round(originalImeWindowHeight * 1.2f), mozcView.imeWindowHeight);
+ assertEquals(Math.round(originalInputFrameHeight * 1.2f), mozcView.getInputFrameHeight());
}
@SmallTest
@@ -1171,26 +1236,16 @@
// Not inflated.
assertNotNull(mozcView.findViewById(R.id.stub_left_frame));
assertNull(mozcView.findViewById(R.id.left_frame));
- assertNull(mozcView.findViewById(R.id.dropshadow_left_short_top));
- assertNull(mozcView.findViewById(R.id.dropshadow_left_long_top));
assertNull(mozcView.findViewById(R.id.left_adjust_button));
- assertNull(mozcView.findViewById(R.id.left_dropshadow_short));
- assertNull(mozcView.findViewById(R.id.left_dropshadow_long));
assertFalse(sideFrameStubProxy.inflated);
sideFrameStubProxy.setButtonOnClickListener(buttonClickListener);
- sideFrameStubProxy.flipDropShadowVisibility(View.VISIBLE);
- sideFrameStubProxy.setDropShadowHeight(3, 4);
sideFrameStubProxy.resetAdjustButtonBottomMargin(100);
// Inflate.
sideFrameStubProxy.setFrameVisibility(View.VISIBLE);
assertNull(mozcView.findViewById(R.id.stub_left_frame));
assertNotNull(mozcView.findViewById(R.id.left_frame));
- assertNotNull(mozcView.findViewById(R.id.dropshadow_left_short_top));
- assertNotNull(mozcView.findViewById(R.id.dropshadow_left_long_top));
assertNotNull(mozcView.findViewById(R.id.left_adjust_button));
- assertNotNull(mozcView.findViewById(R.id.left_dropshadow_short));
- assertNotNull(mozcView.findViewById(R.id.left_dropshadow_long));
assertTrue(sideFrameStubProxy.inflated);
ImageView imageView = ImageView.class.cast(mozcView.findViewById(R.id.left_adjust_button));
imageView.performClick();
@@ -1198,33 +1253,16 @@
FrameLayout.LayoutParams layoutParams = FrameLayout.LayoutParams.class.cast(
imageView.getLayoutParams());
assertEquals((100 - layoutParams.height) / 2, layoutParams.bottomMargin);
- assertEquals(View.VISIBLE, mozcView.findViewById(R.id.left_dropshadow_short).getVisibility());
- assertEquals(View.INVISIBLE, mozcView.findViewById(R.id.left_dropshadow_long).getVisibility());
- assertEquals(3, mozcView.findViewById(R.id.left_dropshadow_short).getLayoutParams().height);
- assertEquals(4, mozcView.findViewById(R.id.left_dropshadow_long).getLayoutParams().height);
verifyAll();
sideFrameStubProxy.setFrameVisibility(View.INVISIBLE);
- sideFrameStubProxy.flipDropShadowVisibility(View.INVISIBLE);
- sideFrameStubProxy.setDropShadowHeight(5, 6);
- Animation animation1 = createNiceMock(Animation.class);
- Animation animation2 = createNiceMock(Animation.class);
- sideFrameStubProxy.startDropShadowAnimation(animation1, animation2);
-
assertEquals(View.INVISIBLE, mozcView.findViewById(R.id.left_frame).getVisibility());
- assertEquals(View.INVISIBLE, mozcView.findViewById(R.id.left_dropshadow_short).getVisibility());
- assertEquals(View.VISIBLE, mozcView.findViewById(R.id.left_dropshadow_long).getVisibility());
- assertEquals(5, mozcView.findViewById(R.id.left_dropshadow_short).getLayoutParams().height);
- assertEquals(6, mozcView.findViewById(R.id.left_dropshadow_long).getLayoutParams().height);
- assertEquals(animation1, mozcView.findViewById(R.id.left_dropshadow_short).getAnimation());
- assertEquals(animation2, mozcView.findViewById(R.id.left_dropshadow_long).getAnimation());
}
@SmallTest
public void testCandidateViewListener() {
ViewEventListener eventListener = createMock(ViewEventListener.class);
-
View keyboardView = new View(getInstrumentation().getTargetContext());
android.view.animation.Interpolator foldKeyboardViewInterpolator =
@@ -1239,15 +1277,16 @@
Capture<InterpolationListener> interpolationListenerCapture =
new Capture<InterpolationListener>();
MozcView mozcView = createViewMock(MozcView.class);
+ mozcView.viewEventListener = eventListener;
CompoundButton inputFrameFoldButton = createViewMock(CompoundButton.class);
MozcView.InputFrameFoldButtonClickListener candidateViewListener =
mozcView.new InputFrameFoldButtonClickListener(
- eventListener, keyboardView,
- 300, foldKeyboardViewInterpolator, 400, expandKeyboardViewInterpolator,
- layoutParamsAnimator);
+ keyboardView, 200, 300L, foldKeyboardViewInterpolator,
+ 400L, expandKeyboardViewInterpolator, layoutParamsAnimator);
{
+ resetAll();
keyboardView.layout(0, 0, 250, 200);
eventListener.onFireFeedbackEvent(FeedbackEvent.INPUTVIEW_FOLD);
layoutParamsAnimator.startAnimation(same(keyboardView), capture(interpolationListenerCapture),
@@ -1276,9 +1315,9 @@
interpolationListenerCapture.reset();
eventListener.onFireFeedbackEvent(FeedbackEvent.INPUTVIEW_EXPAND);
inputFrameFoldButton.setChecked(false);
-
layoutParamsAnimator.startAnimation(same(keyboardView), capture(interpolationListenerCapture),
same(expandKeyboardViewInterpolator), eq(400L), eq(0L));
+
replayAll();
candidateViewListener.onClick(inputFrameFoldButton);
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/NarrowFrameViewTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/NarrowFrameViewTest.java
new file mode 100644
index 0000000..f5f0ea8
--- /dev/null
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/NarrowFrameViewTest.java
@@ -0,0 +1,109 @@
+// Copyright 2010-2014, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package org.mozc.android.inputmethod.japanese;
+
+import static org.easymock.EasyMock.expect;
+
+import org.mozc.android.inputmethod.japanese.FeedbackManager.FeedbackEvent;
+import org.mozc.android.inputmethod.japanese.hardwarekeyboard.HardwareKeyboard.CompositionSwitchMode;
+import org.mozc.android.inputmethod.japanese.testing.InstrumentationTestCaseWithMock;
+import org.mozc.android.inputmethod.japanese.view.DummyDrawable;
+import org.mozc.android.inputmethod.japanese.view.MozcImageView;
+import org.mozc.android.inputmethod.japanese.view.Skin;
+import org.mozc.android.inputmethod.japanese.view.SkinType;
+
+import android.content.Context;
+import android.test.suitebuilder.annotation.SmallTest;
+import android.view.View;
+import android.view.View.OnClickListener;
+
+/** Test for narrow frame view. */
+public class NarrowFrameViewTest extends InstrumentationTestCaseWithMock {
+
+ @SmallTest
+ public void testSetEventListener() {
+ Context context = getInstrumentation().getTargetContext();
+ NarrowFrameView narrowFrameView = createViewMockBuilder(NarrowFrameView.class)
+ .addMockedMethods("getHardwareCompositionButton", "getWidenButton")
+ .createMock();
+
+ ViewEventListener viewEventListener = createMock(ViewEventListener.class);
+ OnClickListener widenButtonClickListener = createMock(OnClickListener.class);
+ MozcImageView hardwareCompositionButton = new MozcImageView(context);
+ MozcImageView widenButton = new MozcImageView(context);
+
+ resetAll();
+ expect(narrowFrameView.getHardwareCompositionButton()).andStubReturn(hardwareCompositionButton);
+ expect(narrowFrameView.getWidenButton()).andStubReturn(widenButton);
+ replayAll();
+ narrowFrameView.setEventListener(viewEventListener, widenButtonClickListener);
+ verifyAll();
+
+ resetAll();
+ viewEventListener.onFireFeedbackEvent(
+ FeedbackEvent.NARROW_FRAME_HARDWARE_COMPOSITION_BUTTON_DOWN);
+ viewEventListener.onHardwareKeyboardCompositionModeChange(CompositionSwitchMode.TOGGLE);
+ replayAll();
+ hardwareCompositionButton.performClick();
+ verifyAll();
+
+ resetAll();
+ widenButtonClickListener.onClick(widenButton);
+ replayAll();
+ widenButton.performClick();
+ verifyAll();
+ }
+
+ @SuppressWarnings("deprecation")
+ @SmallTest
+ public void testSetSkinType() {
+ Context context = getInstrumentation().getTargetContext();
+ NarrowFrameView narrowFrameView = createViewMockBuilder(NarrowFrameView.class)
+ .addMockedMethods("setBackgroundDrawable", "getHardwareCompositionButton", "getWidenButton",
+ "getNarrowFrameSeparator")
+ .createMock();
+ MozcImageView hardwareCompositionButton = new MozcImageView(context);
+ MozcImageView widenButton = new MozcImageView(context);
+ Skin skin = SkinType.MATERIAL_DESIGN_LIGHT.getSkin(context.getResources());
+
+ resetAll();
+ expect(narrowFrameView.getHardwareCompositionButton()).andStubReturn(hardwareCompositionButton);
+ expect(narrowFrameView.getWidenButton()).andStubReturn(widenButton);
+ expect(narrowFrameView.getNarrowFrameSeparator()).andStubReturn(new View(context));
+ narrowFrameView.setBackgroundDrawable(skin.narrowFrameBackgroundDrawable);
+ replayAll();
+ narrowFrameView.setSkin(skin);
+ verifyAll();
+
+ assertNotSame(DummyDrawable.getInstance(), hardwareCompositionButton.getDrawable());
+ assertNotSame(DummyDrawable.getInstance(), widenButton.getDrawable());
+ assertNotSame(hardwareCompositionButton.getDrawable(), widenButton.getDrawable());
+ }
+}
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/PrimaryKeyCodeConverterTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/PrimaryKeyCodeConverterTest.java
index 14ad936..e385daf 100644
--- a/src/android/tests/src/com/google/android/inputmethod/japanese/PrimaryKeyCodeConverterTest.java
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/PrimaryKeyCodeConverterTest.java
@@ -40,6 +40,8 @@
import org.mozc.android.inputmethod.japanese.resources.R;
import org.mozc.android.inputmethod.japanese.testing.InstrumentationTestCaseWithMock;
import org.mozc.android.inputmethod.japanese.testing.Parameter;
+import com.google.common.base.Optional;
+import com.google.common.base.Preconditions;
import android.content.Context;
import android.content.res.AssetManager;
@@ -63,10 +65,10 @@
PrimaryKeyCodeConverter primaryKeyCodeConverter = new PrimaryKeyCodeConverter(context);
// Invalid Keycode.
- ProtoCommands.KeyEvent keyEvent = primaryKeyCodeConverter.createMozcKeyEvent(
+ Optional<ProtoCommands.KeyEvent> keyEvent = primaryKeyCodeConverter.createMozcKeyEvent(
Integer.MIN_VALUE, Collections.<TouchEvent>emptyList());
- assertNull(keyEvent);
+ assertFalse(keyEvent.isPresent());
}
@SmallTest
@@ -85,16 +87,16 @@
class TestData extends Parameter {
final int keyCode;
- final List<? extends TouchEvent> touchEventList;
+ final List<TouchEvent> touchEventList;
final ProtoCommands.KeyEvent expectKeyEvent;
final int expectKeyCode;
TestData(
- int keyCode, List<? extends TouchEvent> touchEventList,
+ int keyCode, List<TouchEvent> touchEventList,
ProtoCommands.KeyEvent expectKeyEvent, int expectKeyCode) {
this.keyCode = keyCode;
- this.touchEventList = touchEventList;
- this.expectKeyEvent = expectKeyEvent;
+ this.touchEventList = Preconditions.checkNotNull(touchEventList);
+ this.expectKeyEvent = Preconditions.checkNotNull(expectKeyEvent);
this.expectKeyCode = expectKeyCode;
}
}
@@ -104,32 +106,32 @@
TestData[] testDataList = {
// White space.
new TestData(
- ' ', null,
+ ' ', Collections.<TouchEvent>emptyList(),
ProtoCommands.KeyEvent.newBuilder().setSpecialKey(SpecialKey.SPACE).build(),
KeyEvent.KEYCODE_SPACE),
// Enter.
new TestData(
- resources.getInteger(R.integer.key_enter), null,
+ resources.getInteger(R.integer.key_enter), Collections.<TouchEvent>emptyList(),
ProtoCommands.KeyEvent.newBuilder().setSpecialKey(SpecialKey.VIRTUAL_ENTER).build(),
KeyEvent.KEYCODE_ENTER),
// Delete.
new TestData(
- resources.getInteger(R.integer.key_backspace), null,
+ resources.getInteger(R.integer.key_backspace), Collections.<TouchEvent>emptyList(),
ProtoCommands.KeyEvent.newBuilder().setSpecialKey(SpecialKey.BACKSPACE).build(),
KeyEvent.KEYCODE_DEL),
// Left.
new TestData(
- resources.getInteger(R.integer.key_left), null,
+ resources.getInteger(R.integer.key_left), Collections.<TouchEvent>emptyList(),
ProtoCommands.KeyEvent.newBuilder().setSpecialKey(SpecialKey.VIRTUAL_LEFT).build(),
KeyEvent.KEYCODE_DPAD_LEFT),
// Right.
new TestData(
- resources.getInteger(R.integer.key_right), null,
+ resources.getInteger(R.integer.key_right), Collections.<TouchEvent>emptyList(),
ProtoCommands.KeyEvent.newBuilder().setSpecialKey(SpecialKey.VIRTUAL_RIGHT).build(),
KeyEvent.KEYCODE_DPAD_RIGHT),
// Normal character with no correction stats.
new TestData(
- 'a', null,
+ 'a', Collections.<TouchEvent>emptyList(),
ProtoCommands.KeyEvent.newBuilder().setKeyCode('a').build(),
KeyEvent.KEYCODE_A),
// Normal character with correction stats.
@@ -155,9 +157,9 @@
replayAll();
for (TestData testData : testDataList) {
- ProtoCommands.KeyEvent keyEvent = primaryKeyCodeConverter.createMozcKeyEvent(
+ Optional<ProtoCommands.KeyEvent> keyEvent = primaryKeyCodeConverter.createMozcKeyEvent(
testData.keyCode, testData.touchEventList);
- assertEquals(testData.toString(), testData.expectKeyEvent, keyEvent);
+ assertEquals(testData.toString(), testData.expectKeyEvent, keyEvent.orNull());
KeyEventInterface primaryCodeKeyEvent = primaryKeyCodeConverter.getPrimaryCodeKeyEvent(
testData.keyCode);
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/SymbolInputViewTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/SymbolInputViewTest.java
index fa4b158..65a29fa 100644
--- a/src/android/tests/src/com/google/android/inputmethod/japanese/SymbolInputViewTest.java
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/SymbolInputViewTest.java
@@ -47,6 +47,7 @@
import android.content.Context;
import android.test.suitebuilder.annotation.SmallTest;
import android.view.View;
+import android.view.View.OnClickListener;
import java.util.Collections;
@@ -84,7 +85,7 @@
symbolInputView.sharedPreferences = null;
AlertDialog dialog = createDialogMock(AlertDialog.class);
- symbolInputView.emojiProviderDialog = dialog;
+ symbolInputView.emojiProviderDialog = Optional.of(dialog);
symbolInputView.maybeInitializeEmojiProviderDialog(context);
expect(symbolInputView.getWindowToken()).andReturn(null);
@@ -120,14 +121,29 @@
view.reset();
ViewEventListener listener = createMock(ViewEventListener.class);
- view.setViewEventListener(listener, null);
+ view.setEventListener(
+ listener, createNiceMock(OnClickListener.class), createNiceMock(OnClickListener.class));
checkConsistency(view);
+ // NUMBER
+ resetAll();
+ replayAll();
+
+ view.setMajorCategory(SymbolMajorCategory.NUMBER);
+
+ verifyAll();
+ checkConsistency(view);
+
+ // The others
for (SymbolMajorCategory category : SymbolMajorCategory.values()) {
+ if (category == SymbolMajorCategory.NUMBER) {
+ continue;
+ }
+
resetAll();
expect(historyStorage.getAllHistory(category)).andReturn(Collections.<String>emptyList());
- listener.onFireFeedbackEvent(FeedbackEvent.INPUTVIEW_EXPAND);
+ listener.onSubmitPreedit();
replayAll();
view.setMajorCategory(category);
@@ -150,14 +166,31 @@
view.reset();
ViewEventListener listener = createMock(ViewEventListener.class);
- view.setViewEventListener(listener, null);
+ view.setEventListener(
+ listener, createNiceMock(OnClickListener.class), createNiceMock(OnClickListener.class));
checkConsistency(view);
+
+ // NUMBER
+ resetAll();
+ replayAll();
+
+ view.setMajorCategory(SymbolMajorCategory.NUMBER);
+
+ verifyAll();
+ checkConsistency(view);
+
+ // The others
for (final SymbolMajorCategory category : SymbolMajorCategory.values()) {
+ if (category == SymbolMajorCategory.NUMBER) {
+ continue;
+ }
+
resetAll();
expect(historyStorage.getAllHistory(category))
.andReturn(Collections.singletonList(category.name()));
- listener.onFireFeedbackEvent(FeedbackEvent.INPUTVIEW_EXPAND);
+ listener.onFireFeedbackEvent(FeedbackEvent.SYMBOL_INPUTVIEW_MINOR_CATEGORY_SELECTED);
expectLastCall().asStub();
+ listener.onSubmitPreedit();
replayAll();
view.setMajorCategory(category);
@@ -181,7 +214,8 @@
view.setMajorCategory(SymbolMajorCategory.EMOTICON);
ViewEventListener viewEventListener = createMock(ViewEventListener.class);
- view.setViewEventListener(viewEventListener, null);
+ view.setEventListener(viewEventListener, createNiceMock(OnClickListener.class),
+ createNiceMock(OnClickListener.class));
resetAll();
viewEventListener.onSymbolCandidateSelected(SymbolMajorCategory.EMOTICON, "(^_^)", true);
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/ViewManagerTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/ViewManagerTest.java
index f6a7517..fb0ee08 100644
--- a/src/android/tests/src/com/google/android/inputmethod/japanese/ViewManagerTest.java
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/ViewManagerTest.java
@@ -31,28 +31,36 @@
import static org.mozc.android.inputmethod.japanese.testing.MozcMatcher.matchesKeyEvent;
import static org.easymock.EasyMock.anyObject;
+import static org.easymock.EasyMock.capture;
import static org.easymock.EasyMock.eq;
import static org.easymock.EasyMock.expect;
import static org.easymock.EasyMock.isA;
import static org.easymock.EasyMock.same;
import org.mozc.android.inputmethod.japanese.FeedbackManager.FeedbackEvent;
-import org.mozc.android.inputmethod.japanese.JapaneseKeyboard.KeyboardSpecification;
import org.mozc.android.inputmethod.japanese.KeycodeConverter.KeyEventInterface;
import org.mozc.android.inputmethod.japanese.MozcView.HeightLinearInterpolationListener;
import org.mozc.android.inputmethod.japanese.ViewManager.ViewManagerEventListener;
import org.mozc.android.inputmethod.japanese.emoji.EmojiProviderType;
import org.mozc.android.inputmethod.japanese.emoji.EmojiUtil;
+import org.mozc.android.inputmethod.japanese.hardwarekeyboard.HardwareKeyboard;
+import org.mozc.android.inputmethod.japanese.hardwarekeyboard.HardwareKeyboard.CompositionSwitchMode;
+import org.mozc.android.inputmethod.japanese.keyboard.BackgroundDrawableFactory.DrawableType;
import org.mozc.android.inputmethod.japanese.keyboard.Key;
import org.mozc.android.inputmethod.japanese.keyboard.Key.Stick;
import org.mozc.android.inputmethod.japanese.keyboard.KeyEntity;
import org.mozc.android.inputmethod.japanese.keyboard.KeyEventContext;
import org.mozc.android.inputmethod.japanese.keyboard.KeyState;
import org.mozc.android.inputmethod.japanese.keyboard.KeyState.MetaState;
+import org.mozc.android.inputmethod.japanese.keyboard.Keyboard;
+import org.mozc.android.inputmethod.japanese.keyboard.Keyboard.KeyboardSpecification;
import org.mozc.android.inputmethod.japanese.keyboard.KeyboardActionListener;
+import org.mozc.android.inputmethod.japanese.keyboard.KeyboardView;
import org.mozc.android.inputmethod.japanese.keyboard.ProbableKeyEventGuesser;
import org.mozc.android.inputmethod.japanese.model.JapaneseSoftwareKeyboardModel;
+import org.mozc.android.inputmethod.japanese.model.JapaneseSoftwareKeyboardModel.KeyboardMode;
import org.mozc.android.inputmethod.japanese.model.SymbolCandidateStorage.SymbolHistoryStorage;
+import org.mozc.android.inputmethod.japanese.model.SymbolMajorCategory;
import org.mozc.android.inputmethod.japanese.preference.ClientSidePreference.InputStyle;
import org.mozc.android.inputmethod.japanese.preference.ClientSidePreference.KeyboardLayout;
import org.mozc.android.inputmethod.japanese.protobuf.ProtoCandidates.CandidateList;
@@ -61,6 +69,7 @@
import org.mozc.android.inputmethod.japanese.protobuf.ProtoCandidates.Candidates.Candidate;
import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands;
import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Command;
+import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.CompositionMode;
import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Input;
import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Input.TouchEvent;
import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.KeyEvent.ProbableKeyEvent;
@@ -68,12 +77,14 @@
import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Output;
import org.mozc.android.inputmethod.japanese.resources.R;
import org.mozc.android.inputmethod.japanese.testing.InstrumentationTestCaseWithMock;
+import org.mozc.android.inputmethod.japanese.testing.MockWindow;
import org.mozc.android.inputmethod.japanese.testing.Parameter;
import org.mozc.android.inputmethod.japanese.ui.MenuDialog;
import org.mozc.android.inputmethod.japanese.ui.MenuDialog.MenuDialogListener;
import org.mozc.android.inputmethod.japanese.util.ImeSwitcherFactory.ImeSwitcher;
import org.mozc.android.inputmethod.japanese.view.SkinType;
import com.google.common.base.Optional;
+import com.google.common.base.Preconditions;
import android.annotation.SuppressLint;
import android.content.Context;
@@ -94,6 +105,9 @@
import android.view.Window;
import android.view.inputmethod.EditorInfo;
+import org.easymock.Capture;
+import org.easymock.EasyMock;
+
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
@@ -133,7 +147,7 @@
keyboardFrame.setLayoutParams(layoutParams);
// Set the input frame fold button checked.
- mozcView.getCandidateView().getInputFrameFoldButton().setChecked(true);
+ mozcView.candidateViewManager.keyboardCandidateView.getInputFrameFoldButton().setChecked(true);
resetAllToDefault();
@@ -145,7 +159,8 @@
verifyAll();
MoreAsserts.assertNotEqual(0, keyboardFrame.getLayoutParams().height);
- assertFalse(mozcView.getCandidateView().getInputFrameFoldButton().isChecked());
+ assertFalse(
+ mozcView.candidateViewManager.keyboardCandidateView.getInputFrameFoldButton().isChecked());
}
@SmallTest
@@ -196,15 +211,15 @@
assertNotNull(mozcView);
// Keyboard instance is correctly registered.
- JapaneseKeyboardView japaneseKeyboardView = mozcView.getKeyboardView();
- assertNotNull(japaneseKeyboardView.getJapaneseKeyboard());
+ KeyboardView keyboardView = mozcView.getKeyboardView();
+ assertTrue(keyboardView.getKeyboard().isPresent());
// Make sure layout params.
- assertEquals(LayoutParams.MATCH_PARENT, japaneseKeyboardView.getLayoutParams().width);
- assertEquals(LayoutParams.MATCH_PARENT, japaneseKeyboardView.getLayoutParams().height);
+ assertEquals(LayoutParams.MATCH_PARENT, keyboardView.getLayoutParams().width);
+ assertEquals(LayoutParams.MATCH_PARENT, keyboardView.getLayoutParams().height);
// Check visibility
- assertEquals(View.GONE, mozcView.getCandidateView().getVisibility());
+ assertFalse(mozcView.candidateViewManager.isKeyboardCandidateViewVisible());
}
@SmallTest
@@ -266,7 +281,7 @@
// Render with CandidateView
MozcView mozcView = viewManager.createMozcView(context);
- CandidateView candidateView = mozcView.getCandidateView();
+ CandidateView candidateView = mozcView.candidateViewManager.keyboardCandidateView;
assertNotNull(candidateView);
CandidateView.ConversionCandidateWordView candidateWordView =
candidateView.getConversionCandidateWordView();
@@ -321,7 +336,7 @@
expect(mozcView.getInputFrameHeight()).andStubReturn(200);
mozcView.setEditorInfo(editorInfo);
mozcView.setPasswordField(false);
- mozcView.setJapaneseKeyboard(isA(JapaneseKeyboard.class));
+ mozcView.setKeyboard(isA(Keyboard.class));
replayAll();
viewManager.setEditorInfo(editorInfo);
@@ -331,6 +346,43 @@
}
@SmallTest
+ public void testNumberField() {
+ ViewManager viewManager = createViewManager(getInstrumentation().getTargetContext());
+ EditorInfo editorInfo = new EditorInfo();
+
+ editorInfo.inputType = EditorInfo.TYPE_CLASS_DATETIME;
+ viewManager.setEditorInfo(editorInfo);
+ assertEquals(
+ KeyboardMode.NUMBER, viewManager.getActiveSoftwareKeyboardModel().getKeyboardMode());
+ assertEquals(
+ KeyboardSpecification.HARDWARE_QWERTY_ALPHABET,
+ viewManager.hardwareKeyboard.getKeyboardSpecification());
+
+ editorInfo.inputType = EditorInfo.TYPE_CLASS_NUMBER;
+ viewManager.setEditorInfo(editorInfo);
+ assertEquals(
+ KeyboardMode.NUMBER, viewManager.getActiveSoftwareKeyboardModel().getKeyboardMode());
+ assertEquals(
+ KeyboardSpecification.HARDWARE_QWERTY_ALPHABET,
+ viewManager.hardwareKeyboard.getKeyboardSpecification());
+
+ editorInfo.inputType = EditorInfo.TYPE_CLASS_PHONE;
+ viewManager.setEditorInfo(editorInfo);
+ assertEquals(
+ KeyboardMode.NUMBER, viewManager.getActiveSoftwareKeyboardModel().getKeyboardMode());
+ assertEquals(
+ KeyboardSpecification.HARDWARE_QWERTY_ALPHABET,
+ viewManager.hardwareKeyboard.getKeyboardSpecification());
+
+ editorInfo.inputType = EditorInfo.TYPE_CLASS_TEXT;
+ viewManager.setEditorInfo(editorInfo);
+ assertEquals(KeyboardMode.KANA, viewManager.getActiveSoftwareKeyboardModel().getKeyboardMode());
+ assertEquals(
+ KeyboardSpecification.HARDWARE_QWERTY_KANA,
+ viewManager.hardwareKeyboard.getKeyboardSpecification());
+ }
+
+ @SmallTest
public void testHideSubInputView() {
Context context = getInstrumentation().getTargetContext();
ViewManager viewManager = createViewManager(context);
@@ -375,13 +427,13 @@
}
@SmallTest
- public void testJapaneseKeyboardSwitchEventCallback() {
+ public void testKeyboardSwitchEventCallback() {
Context context = getInstrumentation().getTargetContext();
ViewEventListener eventListener = createMock(ViewEventListener.class);
ViewManager viewManager = createViewManagerWithEventListener(context, eventListener);
assertEquals(KeyboardSpecification.TWELVE_KEY_TOGGLE_KANA,
- viewManager.getJapaneseKeyboardSpecification());
+ viewManager.getKeyboardSpecification());
// Make sure that whenever keyboard is changed, the callback should be invoked.
eventListener.onKeyEvent(null, null, KeyboardSpecification.QWERTY_KANA,
@@ -399,139 +451,157 @@
}
@SmallTest
- public void testJapaneseKeyboardSwitching() {
+ public void testKeyboardSwitching() {
Context context = getInstrumentation().getTargetContext();
Resources resources = context.getResources();
ViewManager viewManager = createViewManager(context);
replayAll();
MozcView mozcView = viewManager.createMozcView(context);
- JapaneseKeyboardView keyboardView = mozcView.getKeyboardView();
+ KeyboardView keyboardView = mozcView.getKeyboardView();
+ HardwareKeyboard hardwareKeyboard = viewManager.hardwareKeyboard;
List<TouchEvent> touchEventList = Collections.singletonList(TouchEvent.getDefaultInstance());
// The default keyboard is 12key's-"kana"-toggle mode.
assertEquals(KeyboardSpecification.TWELVE_KEY_TOGGLE_KANA,
- keyboardView.getJapaneseKeyboard().getSpecification());
+ keyboardView.getKeyboard().get().getSpecification());
+ assertEquals(KeyboardSpecification.HARDWARE_QWERTY_KANA,
+ hardwareKeyboard.getKeyboardSpecification());
viewManager.onKey(resources.getInteger(R.integer.key_chartype_to_abc), touchEventList);
assertEquals(KeyboardSpecification.TWELVE_KEY_TOGGLE_ALPHABET,
- keyboardView.getJapaneseKeyboard().getSpecification());
-
- viewManager.onKey(resources.getInteger(R.integer.key_chartype_to_123), touchEventList);
- assertEquals(KeyboardSpecification.TWELVE_KEY_TOGGLE_NUMBER,
- keyboardView.getJapaneseKeyboard().getSpecification());
+ keyboardView.getKeyboard().get().getSpecification());
+ assertEquals(KeyboardSpecification.HARDWARE_QWERTY_ALPHABET,
+ hardwareKeyboard.getKeyboardSpecification());
viewManager.onKey(resources.getInteger(R.integer.key_chartype_to_kana), touchEventList);
assertEquals(KeyboardSpecification.TWELVE_KEY_TOGGLE_KANA,
- keyboardView.getJapaneseKeyboard().getSpecification());
+ keyboardView.getKeyboard().get().getSpecification());
+ assertEquals(KeyboardSpecification.HARDWARE_QWERTY_KANA,
+ hardwareKeyboard.getKeyboardSpecification());
// The default mode is "kana".
viewManager.setKeyboardLayout(KeyboardLayout.QWERTY);
assertEquals(KeyboardSpecification.QWERTY_KANA,
- keyboardView.getJapaneseKeyboard().getSpecification());
+ keyboardView.getKeyboard().get().getSpecification());
+ assertEquals(KeyboardSpecification.HARDWARE_QWERTY_KANA,
+ hardwareKeyboard.getKeyboardSpecification());
- viewManager.onKey(resources.getInteger(R.integer.key_chartype_to_kana_123), touchEventList);
- assertEquals(KeyboardSpecification.QWERTY_KANA_NUMBER,
- keyboardView.getJapaneseKeyboard().getSpecification());
viewManager.onKey(resources.getInteger(R.integer.key_chartype_to_kana), touchEventList);
assertEquals(KeyboardSpecification.QWERTY_KANA,
- keyboardView.getJapaneseKeyboard().getSpecification());
+ keyboardView.getKeyboard().get().getSpecification());
+ assertEquals(KeyboardSpecification.HARDWARE_QWERTY_KANA,
+ hardwareKeyboard.getKeyboardSpecification());
viewManager.onKey(resources.getInteger(R.integer.key_chartype_to_abc), touchEventList);
assertEquals(KeyboardSpecification.QWERTY_ALPHABET,
- keyboardView.getJapaneseKeyboard().getSpecification());
-
- viewManager.onKey(resources.getInteger(R.integer.key_chartype_to_abc_123), touchEventList);
- assertEquals(KeyboardSpecification.QWERTY_ALPHABET_NUMBER,
- keyboardView.getJapaneseKeyboard().getSpecification());
+ keyboardView.getKeyboard().get().getSpecification());
+ assertEquals(KeyboardSpecification.HARDWARE_QWERTY_ALPHABET,
+ hardwareKeyboard.getKeyboardSpecification());
viewManager.onKey(resources.getInteger(R.integer.key_chartype_to_abc), touchEventList);
assertEquals(KeyboardSpecification.QWERTY_ALPHABET,
- keyboardView.getJapaneseKeyboard().getSpecification());
+ keyboardView.getKeyboard().get().getSpecification());
+ assertEquals(KeyboardSpecification.HARDWARE_QWERTY_ALPHABET,
+ hardwareKeyboard.getKeyboardSpecification());
viewManager.onKey(resources.getInteger(R.integer.key_chartype_to_kana), touchEventList);
assertEquals(KeyboardSpecification.QWERTY_KANA,
- keyboardView.getJapaneseKeyboard().getSpecification());
+ keyboardView.getKeyboard().get().getSpecification());
+ assertEquals(KeyboardSpecification.HARDWARE_QWERTY_KANA,
+ hardwareKeyboard.getKeyboardSpecification());
// Make sure we can return back to 12-keys keyboard.
viewManager.setKeyboardLayout(KeyboardLayout.TWELVE_KEYS);
assertEquals(KeyboardSpecification.TWELVE_KEY_TOGGLE_KANA,
- keyboardView.getJapaneseKeyboard().getSpecification());
+ keyboardView.getKeyboard().get().getSpecification());
+ assertEquals(KeyboardSpecification.HARDWARE_QWERTY_KANA,
+ hardwareKeyboard.getKeyboardSpecification());
// Then set to flick mode.
viewManager.setInputStyle(InputStyle.FLICK);
assertEquals(KeyboardSpecification.TWELVE_KEY_FLICK_KANA,
- keyboardView.getJapaneseKeyboard().getSpecification());
+ keyboardView.getKeyboard().get().getSpecification());
+ assertEquals(KeyboardSpecification.HARDWARE_QWERTY_KANA,
+ hardwareKeyboard.getKeyboardSpecification());
viewManager.onKey(resources.getInteger(R.integer.key_chartype_to_abc), touchEventList);
assertEquals(KeyboardSpecification.TWELVE_KEY_FLICK_ALPHABET,
- keyboardView.getJapaneseKeyboard().getSpecification());
-
- viewManager.onKey(resources.getInteger(R.integer.key_chartype_to_123), touchEventList);
- assertEquals(KeyboardSpecification.TWELVE_KEY_FLICK_NUMBER,
- keyboardView.getJapaneseKeyboard().getSpecification());
+ keyboardView.getKeyboard().get().getSpecification());
+ assertEquals(KeyboardSpecification.HARDWARE_QWERTY_ALPHABET,
+ hardwareKeyboard.getKeyboardSpecification());
// Return back to flick-kana mode.
viewManager.onKey(resources.getInteger(R.integer.key_chartype_to_kana), touchEventList);
assertEquals(KeyboardSpecification.TWELVE_KEY_FLICK_KANA,
- keyboardView.getJapaneseKeyboard().getSpecification());
+ keyboardView.getKeyboard().get().getSpecification());
+ assertEquals(KeyboardSpecification.HARDWARE_QWERTY_KANA,
+ hardwareKeyboard.getKeyboardSpecification());
// Then set to toggle-flick mode.
viewManager.setInputStyle(InputStyle.TOGGLE_FLICK);
assertEquals(KeyboardSpecification.TWELVE_KEY_TOGGLE_FLICK_KANA,
- keyboardView.getJapaneseKeyboard().getSpecification());
+ keyboardView.getKeyboard().get().getSpecification());
+ assertEquals(KeyboardSpecification.HARDWARE_QWERTY_KANA,
+ hardwareKeyboard.getKeyboardSpecification());
viewManager.onKey(resources.getInteger(R.integer.key_chartype_to_abc), touchEventList);
assertEquals(KeyboardSpecification.TWELVE_KEY_TOGGLE_FLICK_ALPHABET,
- keyboardView.getJapaneseKeyboard().getSpecification());
-
- viewManager.onKey(resources.getInteger(R.integer.key_chartype_to_123), touchEventList);
- assertEquals(KeyboardSpecification.TWELVE_KEY_TOGGLE_FLICK_NUMBER,
- keyboardView.getJapaneseKeyboard().getSpecification());
+ keyboardView.getKeyboard().get().getSpecification());
+ assertEquals(KeyboardSpecification.HARDWARE_QWERTY_ALPHABET,
+ hardwareKeyboard.getKeyboardSpecification());
// Return back to flick-kana mode.
viewManager.onKey(resources.getInteger(R.integer.key_chartype_to_kana), touchEventList);
assertEquals(KeyboardSpecification.TWELVE_KEY_TOGGLE_FLICK_KANA,
- keyboardView.getJapaneseKeyboard().getSpecification());
+ keyboardView.getKeyboard().get().getSpecification());
+ assertEquals(KeyboardSpecification.HARDWARE_QWERTY_KANA,
+ hardwareKeyboard.getKeyboardSpecification());
// Testing for qwerty layout for alphabet mode.
viewManager.setQwertyLayoutForAlphabet(true);
assertEquals(KeyboardSpecification.TWELVE_KEY_TOGGLE_FLICK_KANA,
- keyboardView.getJapaneseKeyboard().getSpecification());
+ keyboardView.getKeyboard().get().getSpecification());
+ assertEquals(KeyboardSpecification.HARDWARE_QWERTY_KANA,
+ hardwareKeyboard.getKeyboardSpecification());
viewManager.onKey(resources.getInteger(R.integer.key_chartype_to_abc), touchEventList);
assertEquals(KeyboardSpecification.TWELVE_KEY_TOGGLE_QWERTY_ALPHABET,
- keyboardView.getJapaneseKeyboard().getSpecification());
+ keyboardView.getKeyboard().get().getSpecification());
+ assertEquals(KeyboardSpecification.HARDWARE_QWERTY_ALPHABET,
+ hardwareKeyboard.getKeyboardSpecification());
// Switching the mode should trigger the alphabet keyboard view switching as well.
viewManager.setQwertyLayoutForAlphabet(false);
assertEquals(KeyboardSpecification.TWELVE_KEY_TOGGLE_FLICK_ALPHABET,
- keyboardView.getJapaneseKeyboard().getSpecification());
+ keyboardView.getKeyboard().get().getSpecification());
+ assertEquals(KeyboardSpecification.HARDWARE_QWERTY_ALPHABET,
+ hardwareKeyboard.getKeyboardSpecification());
viewManager.setQwertyLayoutForAlphabet(true);
assertEquals(KeyboardSpecification.TWELVE_KEY_TOGGLE_QWERTY_ALPHABET,
- keyboardView.getJapaneseKeyboard().getSpecification());
-
- viewManager.onKey(resources.getInteger(R.integer.key_chartype_to_abc_123), touchEventList);
- assertEquals(KeyboardSpecification.QWERTY_ALPHABET_NUMBER,
- keyboardView.getJapaneseKeyboard().getSpecification());
+ keyboardView.getKeyboard().get().getSpecification());
+ assertEquals(KeyboardSpecification.HARDWARE_QWERTY_ALPHABET,
+ hardwareKeyboard.getKeyboardSpecification());
viewManager.onKey(resources.getInteger(R.integer.key_chartype_to_abc), touchEventList);
assertEquals(KeyboardSpecification.TWELVE_KEY_TOGGLE_QWERTY_ALPHABET,
- keyboardView.getJapaneseKeyboard().getSpecification());
-
- viewManager.onKey(resources.getInteger(R.integer.key_chartype_to_123), touchEventList);
- assertEquals(KeyboardSpecification.TWELVE_KEY_TOGGLE_FLICK_NUMBER,
- keyboardView.getJapaneseKeyboard().getSpecification());
+ keyboardView.getKeyboard().get().getSpecification());
+ assertEquals(KeyboardSpecification.HARDWARE_QWERTY_ALPHABET,
+ hardwareKeyboard.getKeyboardSpecification());
viewManager.onKey(resources.getInteger(R.integer.key_chartype_to_kana), touchEventList);
assertEquals(KeyboardSpecification.TWELVE_KEY_TOGGLE_FLICK_KANA,
- keyboardView.getJapaneseKeyboard().getSpecification());
+ keyboardView.getKeyboard().get().getSpecification());
+ assertEquals(KeyboardSpecification.HARDWARE_QWERTY_KANA,
+ hardwareKeyboard.getKeyboardSpecification());
viewManager.setQwertyLayoutForAlphabet(false);
assertEquals(KeyboardSpecification.TWELVE_KEY_TOGGLE_FLICK_KANA,
- keyboardView.getJapaneseKeyboard().getSpecification());
+ keyboardView.getKeyboard().get().getSpecification());
+ assertEquals(KeyboardSpecification.HARDWARE_QWERTY_KANA,
+ hardwareKeyboard.getKeyboardSpecification());
}
@SmallTest
@@ -549,15 +619,15 @@
}
@SmallTest
- public void testSetJapaneseKeyboardStyleForUninitializedKeyboardViewDefault() {
+ public void testSetKeyboardStyleForUninitializedKeyboardViewDefault() {
Context context = getInstrumentation().getTargetContext();
ViewManager viewManager = createViewManager(context);
// Make sure keyboard by createInputView is 12keys-kana keyboard by default.
MozcView mozcView = viewManager.createMozcView(context);
- JapaneseKeyboardView keyboardView = mozcView.getKeyboardView();
+ KeyboardView keyboardView = mozcView.getKeyboardView();
assertEquals(KeyboardSpecification.TWELVE_KEY_TOGGLE_KANA,
- keyboardView.getJapaneseKeyboard().getSpecification());
+ keyboardView.getKeyboard().get().getSpecification());
}
@SmallTest
@@ -570,9 +640,9 @@
// Make sure the keyboard instance created via createInputView is not default keyboard.
MozcView mozcView = viewManager.createMozcView(context);
- JapaneseKeyboardView keyboardView = mozcView.getKeyboardView();
+ KeyboardView keyboardView = mozcView.getKeyboardView();
assertEquals(KeyboardSpecification.QWERTY_KANA,
- keyboardView.getJapaneseKeyboard().getSpecification());
+ keyboardView.getKeyboard().get().getSpecification());
}
@SmallTest
@@ -585,9 +655,9 @@
// Make sure the keyboard instance created via createInputView is not default keyboard.
MozcView mozcView = viewManager.createMozcView(context);
- JapaneseKeyboardView keyboardView = mozcView.getKeyboardView();
+ KeyboardView keyboardView = mozcView.getKeyboardView();
assertEquals(KeyboardSpecification.TWELVE_KEY_FLICK_KANA,
- keyboardView.getJapaneseKeyboard().getSpecification());
+ keyboardView.getKeyboard().get().getSpecification());
}
@SmallTest
@@ -612,12 +682,12 @@
.createMock();
ViewManager viewManager = new ViewManager(
context, listener, createNiceMock(SymbolHistoryStorage.class),
- createMock(ImeSwitcher.class), createNiceMock(MenuDialogListener.class), guesser);
+ createMock(ImeSwitcher.class), createNiceMock(MenuDialogListener.class), guesser,
+ new HardwareKeyboard());
viewManager.createMozcView(context);
KeyboardSpecification keyboardSpecification =
- JapaneseSoftwareKeyboardModel.class.cast(
- viewManager.japaneseSoftwareKeyboardModel)
- .getKeyboardSpecification();
+ JapaneseSoftwareKeyboardModel.class.cast(viewManager.getActiveSoftwareKeyboardModel())
+ .getKeyboardSpecification();
Resources resources = context.getResources();
List<TouchEvent> touchEventList = Collections.singletonList(TouchEvent.getDefaultInstance());
@@ -644,41 +714,41 @@
TestData[] testDataList = {
// White space.
new TestData(' ',
- null,
+ new ProbableKeyEvent[0],
false,
ProtoCommands.KeyEvent.newBuilder().setSpecialKey(SpecialKey.SPACE).build(),
KeyEvent.KEYCODE_SPACE),
// Enter.
new TestData(resources.getInteger(R.integer.key_enter),
- null,
+ new ProbableKeyEvent[0],
false,
ProtoCommands.KeyEvent.newBuilder()
.setSpecialKey(SpecialKey.VIRTUAL_ENTER).build(),
KeyEvent.KEYCODE_ENTER),
// Delete.
new TestData(resources.getInteger(R.integer.key_backspace),
- null,
+ new ProbableKeyEvent[0],
false,
ProtoCommands.KeyEvent.newBuilder().setSpecialKey(SpecialKey.BACKSPACE)
.build(),
KeyEvent.KEYCODE_DEL),
// Left.
new TestData(resources.getInteger(R.integer.key_left),
- null,
+ new ProbableKeyEvent[0],
false,
ProtoCommands.KeyEvent.newBuilder()
.setSpecialKey(SpecialKey.VIRTUAL_LEFT).build(),
KeyEvent.KEYCODE_DPAD_LEFT),
// Right.
new TestData(resources.getInteger(R.integer.key_right),
- null,
+ new ProbableKeyEvent[0],
false,
ProtoCommands.KeyEvent.newBuilder()
.setSpecialKey(SpecialKey.VIRTUAL_RIGHT).build(),
KeyEvent.KEYCODE_DPAD_RIGHT),
// Normal character with no correction stats.
new TestData('a',
- null,
+ new ProbableKeyEvent[0],
true,
ProtoCommands.KeyEvent.newBuilder().setKeyCode('a').build(),
KeyEvent.KEYCODE_A),
@@ -739,26 +809,44 @@
resetAll();
List<TouchEvent> touchEventList = Collections.singletonList(TouchEvent.getDefaultInstance());
listener.onKeyEvent(null, null,
- KeyboardSpecification.TWELVE_KEY_TOGGLE_NUMBER, touchEventList);
+ KeyboardSpecification.TWELVE_KEY_TOGGLE_ALPHABET, touchEventList);
replayAll();
// Make sure the current keyboard is 12keys-toggle-kana mode before sending a key.
- JapaneseKeyboardView keyboardView = mozcView.getKeyboardView();
+ KeyboardView keyboardView = mozcView.getKeyboardView();
assertEquals(KeyboardSpecification.TWELVE_KEY_TOGGLE_KANA,
- keyboardView.getJapaneseKeyboard().getSpecification());
+ keyboardView.getKeyboard().get().getSpecification());
// Send key code to switch number keyboard style.
- viewManager.onKey(resources.getInteger(R.integer.key_chartype_to_123), touchEventList);
+ viewManager.onKey(resources.getInteger(R.integer.key_chartype_to_abc), touchEventList);
// Make sure actually keyboard style has been changed.
- assertEquals(KeyboardSpecification.TWELVE_KEY_TOGGLE_NUMBER,
- keyboardView.getJapaneseKeyboard().getSpecification());
+ assertEquals(KeyboardSpecification.TWELVE_KEY_TOGGLE_ALPHABET,
+ keyboardView.getKeyboard().get().getSpecification());
// Make sure that the listener can catch the expected events.
verifyAll();
}
@SmallTest
+ public void testOnKeyForGlobeButton() {
+ Context context = getInstrumentation().getTargetContext();
+ ImeSwitcher imeSwitcher = createMock(ImeSwitcher.class);
+
+ ViewManager viewManager = new ViewManager(
+ context, createNiceMock(ViewEventListener.class),
+ createNiceMock(SymbolHistoryStorage.class),
+ imeSwitcher, createNiceMock(MenuDialogListener.class));
+
+ expect(imeSwitcher.switchToNextInputMethod(false)).andReturn(Boolean.TRUE);
+
+ replayAll();
+ viewManager.onKey(context.getResources().getInteger(R.integer.key_globe),
+ Collections.<TouchEvent>emptyList());
+ verifyAll();
+ }
+
+ @SmallTest
public void testKeyboardActionAdapter_onKey() {
Context context = getInstrumentation().getTargetContext();
List<TouchEvent> touchEventList = Collections.singletonList(TouchEvent.getDefaultInstance());
@@ -804,7 +892,7 @@
ViewManager viewManager = createViewManagerWithEventListener(context, listener);
viewManager.createMozcView(context);
KeyboardSpecification keyboardSpecification =
- JapaneseSoftwareKeyboardModel.class.cast(viewManager.japaneseSoftwareKeyboardModel)
+ JapaneseSoftwareKeyboardModel.class.cast(viewManager.getActiveSoftwareKeyboardModel())
.getKeyboardSpecification();
// Emulate toggling a key.
@@ -883,18 +971,19 @@
// Add dummy KeyEventContext.
KeyEventContext keyEventContext =
new KeyEventContext(
- new Key(0, 0, 0, 0, 0, 0, false, false, false,
- Stick.EVEN, Collections.<KeyState>emptyList()),
+ new Key(0, 0, 0, 0, 0, 0, false, false, Stick.EVEN,
+ DrawableType.TWELVEKEYS_REGULAR_KEY_BACKGROUND,
+ Collections.<KeyState>emptyList()),
0, 0, 0, 0, 0, 0, Collections.<MetaState>emptySet());
keyEventContextMap.put(0, keyEventContext);
}
- mozcView.getCandidateView().startInAnimation();
+ mozcView.softwareKeyboardHeightListener.onExpanded();
mozcView.getSymbolInputView().startInAnimation();
MenuDialog menuDialog = createMockBuilder(MenuDialog.class)
- .withConstructor(Context.class, Optional.class, boolean.class)
- .withArgs(context, Optional.of(createNiceMock(MenuDialogListener.class)), false)
+ .withConstructor(Context.class, Optional.class)
+ .withArgs(context, Optional.of(createNiceMock(MenuDialogListener.class)))
.createMock();
resetAll();
viewManager.menuDialog = menuDialog;
@@ -908,9 +997,9 @@
assertEquals(View.VISIBLE, mozcView.getKeyboardFrame().getVisibility());
assertEquals(context.getResources().getDimensionPixelSize(R.dimen.input_frame_height),
mozcView.getKeyboardFrame().getLayoutParams().height);
- assertEquals(View.GONE, mozcView.getCandidateView().getVisibility());
+ assertFalse(mozcView.candidateViewManager.isKeyboardCandidateViewVisible());
assertEquals(View.GONE, mozcView.getSymbolInputView().getVisibility());
- assertNull(mozcView.getCandidateView().getAnimation());
+ assertNull(mozcView.candidateViewManager.keyboardCandidateView.getAnimation());
assertNull(mozcView.getSymbolInputView().getAnimation());
assertTrue(keyEventContextMap.isEmpty());
}
@@ -938,7 +1027,7 @@
Context context = getInstrumentation().getTargetContext();
ViewManager viewManager = createViewManager(context);
- Window window = createMockBuilder(Window.class)
+ Window window = createMockBuilder(MockWindow.class)
.withConstructor(Context.class)
.withArgs(context)
.createMock();
@@ -1064,15 +1153,17 @@
@SmallTest
public void testSetSkinType() {
Context context = getInstrumentation().getTargetContext();
+ Resources resources = context.getResources();
ViewManager viewManager = createViewManager(context);
MozcView mozcView = viewManager.createMozcView(context);
- viewManager.setSkinType(SkinType.ORANGE_LIGHTGRAY);
- assertEquals(SkinType.ORANGE_LIGHTGRAY, mozcView.getSkinType());
- viewManager.setSkinType(SkinType.TEST);
- assertEquals(SkinType.TEST, mozcView.getSkinType());
+ viewManager.setSkin(SkinType.ORANGE_LIGHTGRAY.getSkin(resources));
+ assertEquals(SkinType.ORANGE_LIGHTGRAY.getSkin(resources), mozcView.getSkin());
+ viewManager.setSkin(SkinType.TEST.getSkin(resources));
+ assertEquals(SkinType.TEST.getSkin(resources), mozcView.getSkin());
}
+ @SmallTest
public void testMaybeTransitToNarrowMode() {
Context context = getInstrumentation().getTargetContext();
ViewManager viewManager = createViewManager(context);
@@ -1089,8 +1180,8 @@
}
KeyEventInterface softwareEvent = new KeyEventInterface() {
@Override
- public KeyEvent getNativeEvent() {
- return null;
+ public Optional<KeyEvent> getNativeEvent() {
+ return Optional.absent();
}
@Override
public int getKeyCode() {
@@ -1099,8 +1190,8 @@
};
KeyEventInterface hardwareEvent = new KeyEventInterface() {
@Override
- public KeyEvent getNativeEvent() {
- return new KeyEvent(0, 0);
+ public Optional<KeyEvent> getNativeEvent() {
+ return Optional.of(new KeyEvent(0, 0));
}
@Override
public int getKeyCode() {
@@ -1128,8 +1219,8 @@
.buildPartial();
TestData[] testDataList = new TestData[] {
new TestData(noKey, hardwareEvent, false),
- new TestData(noKeyCode, hardwareEvent, false),
- new TestData(withModifier, hardwareEvent, false),
+ new TestData(noKeyCode, hardwareEvent, true),
+ new TestData(withModifier, hardwareEvent, true),
new TestData(printable, null, false),
new TestData(printable, softwareEvent, false),
new TestData(printable, hardwareEvent, true),
@@ -1140,4 +1231,201 @@
assertEquals(testData.expectation, viewManager.isNarrowMode());
}
}
+
+ @SmallTest
+ public void testHandleEmojiKey() {
+ Context context = getInstrumentation().getTargetContext();
+ ViewManager viewManager = createViewManager(context);
+ MozcView mozcView = createViewMockBuilder(MozcView.class)
+ .addMockedMethods("showSymbolInputView", "setLayoutAdjustmentAndNarrowMode")
+ .createNiceMock();
+ viewManager.mozcView = mozcView;
+
+ // Disable input device check.
+ // Otherwise, this feature doesn't work except for keyboards which has Emoji key(s).
+ viewManager.viewLayerKeyEventHandler.disableDeviceCheck = true;
+
+ KeyEvent aDown = new KeyEvent(0L, 0L, KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_A, 0);
+ KeyEvent aUp = new KeyEvent(0L, 0L, KeyEvent.ACTION_UP, KeyEvent.KEYCODE_A, 0);
+ KeyEvent aDownWithAlt = new KeyEvent(
+ 0L, 0L, KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_A, 0, KeyEvent.META_ALT_ON);
+ KeyEvent aUpWithAlt = new KeyEvent(
+ 0L, 0L, KeyEvent.ACTION_UP, KeyEvent.KEYCODE_A, 0, KeyEvent.META_ALT_ON);
+ KeyEvent altDown = new KeyEvent(
+ 0L, 0L, KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_ALT_LEFT, 0, KeyEvent.META_ALT_ON);
+ KeyEvent altUp = new KeyEvent(0L, 0L, KeyEvent.ACTION_UP, KeyEvent.KEYCODE_ALT_LEFT, 0);
+ KeyEvent shiftDown = new KeyEvent(
+ 0L, 0L, KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_SHIFT_LEFT, 0, KeyEvent.META_SHIFT_ON);
+ KeyEvent shiftUp = new KeyEvent(0L, 0L, KeyEvent.ACTION_UP, KeyEvent.KEYCODE_SHIFT_LEFT, 0);
+ KeyEvent altDownWithShift = new KeyEvent(
+ 0L, 0L, KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_ALT_LEFT, 0, KeyEvent.META_SHIFT_ON);
+ KeyEvent altUpWithShift = new KeyEvent(
+ 0L, 0L, KeyEvent.ACTION_UP, KeyEvent.KEYCODE_ALT_LEFT, 0, KeyEvent.META_SHIFT_ON);
+ KeyEvent shiftDownWithAlt = new KeyEvent(
+ 0L, 0L, KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_SHIFT_LEFT, 0, KeyEvent.META_ALT_ON);
+ KeyEvent shiftUpWithAlt = new KeyEvent(
+ 0L, 0L, KeyEvent.ACTION_UP, KeyEvent.KEYCODE_SHIFT_LEFT, 0, KeyEvent.META_ALT_ON);
+ KeyEvent altDownWithAlt = new KeyEvent(
+ 0L, 0L, KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_ALT_LEFT, 0, KeyEvent.META_ALT_ON);
+ KeyEvent altUpWithAlt = new KeyEvent(
+ 0L, 0L, KeyEvent.ACTION_UP, KeyEvent.KEYCODE_ALT_LEFT, 0, KeyEvent.META_ALT_ON);
+
+
+ class TestData extends Parameter {
+ final KeyEvent[] keyEvents;
+ final boolean expectLaunchEmojiPalette;
+ TestData(KeyEvent[] keyEvents, boolean expectLaunchEmojiPalette) {
+ this.keyEvents = Preconditions.checkNotNull(keyEvents);
+ this.expectLaunchEmojiPalette = expectLaunchEmojiPalette;
+ }
+ }
+ TestData[] testDataArray = new TestData[] {
+ new TestData(new KeyEvent[] {altDown, altUp}, true),
+ new TestData(new KeyEvent[] {shiftDown, shiftUp}, false),
+ new TestData(new KeyEvent[] {aDown, aUp}, false),
+
+ new TestData(new KeyEvent[] {altDown, aDownWithAlt, aUpWithAlt, altUp}, false),
+ new TestData(new KeyEvent[] {aDown, altDown, altUp, aUp}, false),
+ new TestData(new KeyEvent[] {altDown, aDownWithAlt, altUp, aUpWithAlt}, false),
+ new TestData(new KeyEvent[] {aDown, altDown, aUpWithAlt, altUp}, false),
+
+ new TestData(new KeyEvent[] {altDown, shiftDownWithAlt, shiftUpWithAlt, altUp}, false),
+ new TestData(new KeyEvent[] {shiftDown, altDownWithShift, altUpWithShift, shiftUp}, false),
+ new TestData(new KeyEvent[] {altDown, shiftDownWithAlt, altUpWithShift, shiftUp}, false),
+ new TestData(new KeyEvent[] {shiftDown, altDownWithShift, shiftUpWithAlt, altUp}, false),
+
+ new TestData(new KeyEvent[] {altDown, altDownWithAlt, altUpWithAlt, altUp}, false),
+ };
+
+ for (TestData testData : testDataArray) {
+ // Key events except for last one should NOT be consumed by view layer.
+ for (int i = 0; i < testData.keyEvents.length - 1; ++i) {
+ assertFalse(viewManager.isKeyConsumedOnViewAsynchronously(testData.keyEvents[i]));
+ }
+
+ KeyEvent lastKeyEvent = testData.keyEvents[testData.keyEvents.length - 1];
+ if (testData.expectLaunchEmojiPalette) {
+ assertTrue(viewManager.isKeyConsumedOnViewAsynchronously(lastKeyEvent));
+ resetAll();
+ expect(mozcView.showSymbolInputView(Optional.of(SymbolMajorCategory.EMOJI)))
+ .andReturn(true);
+ replayAll();
+ viewManager.consumeKeyOnViewSynchronously(lastKeyEvent);
+ verifyAll();
+ } else {
+ assertFalse(viewManager.isKeyConsumedOnViewAsynchronously(lastKeyEvent));
+ resetAll();
+ replayAll();
+ viewManager.consumeKeyOnViewSynchronously(lastKeyEvent);
+ verifyAll();
+ }
+ }
+ }
+
+ @SmallTest
+ public void testOnKeyDownByHardwareKeyboard() {
+ Context context = getInstrumentation().getTargetContext();
+ HardwareKeyboard hardwareKeyboard = createNiceMock(HardwareKeyboard.class);
+ ViewEventListener listener = createMock(ViewEventListener.class);
+ ViewManager viewManager = new ViewManager(
+ context, listener, createNiceMock(SymbolHistoryStorage.class),
+ createNiceMock(ImeSwitcher.class), createNiceMock(MenuDialogListener.class),
+ new ProbableKeyEventGuesser(context.getAssets()), hardwareKeyboard);
+
+ MozcView mozcView = createViewMockBuilder(MozcView.class)
+ .addMockedMethods("setKeyboard")
+ .createNiceMock();
+ viewManager.mozcView = mozcView;
+
+ KeyEvent event = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_A);
+ ProtoCommands.KeyEvent mozcKeyEvent =
+ ProtoCommands.KeyEvent.newBuilder().setKeyCode('a').build();
+ KeyEventInterface keyEventInterface = KeycodeConverter.getKeyEventInterface(event);
+ KeyboardSpecification keyboardSpecification = KeyboardSpecification.HARDWARE_QWERTY_KANA;
+
+ resetAll();
+
+ expect(hardwareKeyboard.getCompositionMode()).andStubReturn(CompositionMode.HIRAGANA);
+ expect(hardwareKeyboard.setCompositionModeByKey(event)).andReturn(false);
+ expect(hardwareKeyboard.getMozcKeyEvent(event)).andReturn(mozcKeyEvent);
+ expect(hardwareKeyboard.getKeyEventInterface(event)).andReturn(keyEventInterface);
+ expect(hardwareKeyboard.getKeyboardSpecification()).andReturn(keyboardSpecification);
+ listener.onKeyEvent(
+ same(mozcKeyEvent), same(keyEventInterface), same(keyboardSpecification),
+ eq(Collections.<TouchEvent>emptyList()));
+
+ replayAll();
+ viewManager.onHardwareKeyEvent(event);
+ verifyAll();
+
+ resetAll();
+
+ keyboardSpecification = KeyboardSpecification.HARDWARE_QWERTY_ALPHABET;
+ expect(hardwareKeyboard.getCompositionMode()).andReturn(CompositionMode.HIRAGANA);
+ expect(hardwareKeyboard.setCompositionModeByKey(event)).andReturn(false);
+ expect(hardwareKeyboard.getCompositionMode()).andReturn(CompositionMode.HALF_ASCII);
+ expect(hardwareKeyboard.getMozcKeyEvent(event)).andReturn(mozcKeyEvent);
+ expect(hardwareKeyboard.getKeyEventInterface(event)).andReturn(keyEventInterface);
+ expect(hardwareKeyboard.getKeyboardSpecification()).andReturn(keyboardSpecification);
+ Capture<Keyboard> keyboardCapture = new Capture<Keyboard>();
+ mozcView.setKeyboard(capture(keyboardCapture));
+ listener.onKeyEvent(
+ same(mozcKeyEvent), same(keyEventInterface), same(keyboardSpecification),
+ eq(Collections.<TouchEvent>emptyList()));
+
+ replayAll();
+ viewManager.onHardwareKeyEvent(event);
+ verifyAll();
+ assertEquals(KeyboardSpecification.TWELVE_KEY_TOGGLE_ALPHABET,
+ keyboardCapture.getValue().getSpecification());
+ }
+
+ @SmallTest
+ public void testSwitchHardwareKeyboardCompositionMode() {
+ Context context = getInstrumentation().getTargetContext();
+ ViewEventListener listener = createMock(ViewEventListener.class);
+ ViewManager viewManager = createViewManagerWithEventListener(context, listener);
+
+ // Set KANA as a initial composition mode without MozcView.
+ viewManager.switchHardwareKeyboardCompositionMode(CompositionSwitchMode.KANA);
+
+ MozcView mozcView = createViewMockBuilder(MozcView.class)
+ .addMockedMethods("setKeyboard")
+ .createNiceMock();
+ viewManager.mozcView = mozcView;
+
+ Capture<Keyboard> keyboardCapture = new Capture<Keyboard>();
+
+ // HIRAGANA to HIRAGANA by CompositionSwitchMode.KANA.
+ resetAll();
+ replayAll();
+ viewManager.switchHardwareKeyboardCompositionMode(CompositionSwitchMode.KANA);
+ verifyAll();
+
+ // HIRAGANA to HALF_ASCII by CompositionSwitchMode.HALF_ASCII.
+ resetAll();
+ mozcView.setKeyboard(capture(keyboardCapture));
+ listener.onKeyEvent(EasyMock.<ProtoCommands.KeyEvent>isNull(),
+ EasyMock.<KeyEventInterface>isNull(),
+ same(KeyboardSpecification.HARDWARE_QWERTY_ALPHABET),
+ eq(Collections.<TouchEvent>emptyList()));
+ replayAll();
+ viewManager.switchHardwareKeyboardCompositionMode(CompositionSwitchMode.ALPHABET);
+ verifyAll();
+ assertEquals(KeyboardSpecification.TWELVE_KEY_TOGGLE_ALPHABET,
+ keyboardCapture.getValue().getSpecification());
+
+ // HALF_ASCII to HIRAGANA by CompositionSwitchMode.TOGGLE.
+ resetAll();
+ mozcView.setKeyboard(capture(keyboardCapture));
+ listener.onKeyEvent(EasyMock.<ProtoCommands.KeyEvent>isNull(),
+ EasyMock.<KeyEventInterface>isNull(),
+ same(KeyboardSpecification.HARDWARE_QWERTY_KANA),
+ eq(Collections.<TouchEvent>emptyList()));
+ replayAll();
+ viewManager.switchHardwareKeyboardCompositionMode(CompositionSwitchMode.TOGGLE);
+ verifyAll();
+ assertEquals(KeyboardSpecification.TWELVE_KEY_TOGGLE_KANA,
+ keyboardCapture.getValue().getSpecification());
+ }
}
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/accessibility/KeyboardAccessibilityDelegateTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/accessibility/KeyboardAccessibilityDelegateTest.java
index 87d8357..fc3eb38 100644
--- a/src/android/tests/src/com/google/android/inputmethod/japanese/accessibility/KeyboardAccessibilityDelegateTest.java
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/accessibility/KeyboardAccessibilityDelegateTest.java
@@ -34,23 +34,21 @@
import static org.easymock.EasyMock.eq;
import static org.easymock.EasyMock.expect;
+import org.mozc.android.inputmethod.japanese.accessibility.KeyboardAccessibilityDelegate.TouchEventEmulator;
import org.mozc.android.inputmethod.japanese.keyboard.BackgroundDrawableFactory.DrawableType;
import org.mozc.android.inputmethod.japanese.keyboard.Flick;
import org.mozc.android.inputmethod.japanese.keyboard.Flick.Direction;
import org.mozc.android.inputmethod.japanese.keyboard.Key;
import org.mozc.android.inputmethod.japanese.keyboard.Key.Stick;
import org.mozc.android.inputmethod.japanese.keyboard.KeyEntity;
-import org.mozc.android.inputmethod.japanese.keyboard.KeyEventHandler;
import org.mozc.android.inputmethod.japanese.keyboard.KeyState;
import org.mozc.android.inputmethod.japanese.keyboard.KeyState.MetaState;
-import org.mozc.android.inputmethod.japanese.keyboard.KeyboardActionListener;
-import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Input.TouchEvent;
+import org.mozc.android.inputmethod.japanese.keyboard.PopUp;
import org.mozc.android.inputmethod.japanese.testing.ApiLevel;
import org.mozc.android.inputmethod.japanese.testing.InstrumentationTestCaseWithMock;
import com.google.common.base.Optional;
import android.content.Context;
-import android.os.Looper;
import android.support.v4.view.accessibility.AccessibilityEventCompat;
import android.support.v4.view.accessibility.AccessibilityNodeInfoCompat;
import android.test.suitebuilder.annotation.SmallTest;
@@ -88,8 +86,8 @@
private static Optional<Key> createOptionalKey() {
// Currently following values are not used.
KeyEntity keyEntity =
- new KeyEntity(SOURCE_ID, KEY_CODE, LONGPRESS_KEY_CODE, 0,
- DrawableType.TWELVEKEYS_CENTER_FLICK, false, null);
+ new KeyEntity(SOURCE_ID, KEY_CODE, LONGPRESS_KEY_CODE, true, 0,
+ Optional.<String>absent(), false, Optional.<PopUp>absent(), 0, 0, 0, 0);
Flick flick = new Flick(Direction.CENTER, keyEntity);
List<KeyState> keyStates =
Collections.singletonList(
@@ -98,8 +96,8 @@
Collections.<MetaState>emptySet(),
Collections.<MetaState>emptySet(),
Collections.singletonList(flick)));
- return Optional.of(new Key(0, 0, 10, 10, 0, 0, false, false, false,
- Stick.EVEN, keyStates));
+ return Optional.of(new Key(0, 0, 10, 10, 0, 0, false, false, Stick.EVEN,
+ DrawableType.TWELVEKEYS_REGULAR_KEY_BACKGROUND, keyStates));
}
private KeyboardAccessibilityNodeProvider createMockProvider(View view) {
@@ -107,15 +105,6 @@
.withConstructor(View.class).withArgs(view).createMock();
}
- private KeyEventHandler createMockKeyEventHandler() {
- return createMockBuilder(KeyEventHandler.class)
- .withConstructor(Looper.class, KeyboardActionListener.class,
- Integer.TYPE, Integer.TYPE, Integer.TYPE)
- .withArgs(Looper.getMainLooper(), createNiceMock(KeyboardActionListener.class), 0, 0, 0)
- .addMockedMethod("sendKey")
- .createMock();
- }
-
@SmallTest
public void testDispatchHoverEvent_NoCorrespondingAction() {
// Action: No corresponding action
@@ -127,7 +116,15 @@
KeyboardAccessibilityNodeProvider provider = createMockProvider(view);
expect(provider.getKey(anyInt(), anyInt())).andReturn(Optional.<Key>absent());
replayAll();
- KeyboardAccessibilityDelegate delegate = new KeyboardAccessibilityDelegate(view, provider, 0);
+ KeyboardAccessibilityDelegate delegate =
+ new KeyboardAccessibilityDelegate(view, provider, 0, new TouchEventEmulator() {
+ @Override
+ public void emulateLongPress(Key key) {
+ }
+ @Override
+ public void emulateKeyInput(Key key) {
+ }
+ });
assertFalse(delegate.dispatchHoverEvent(createMotionEvent(MotionEvent.ACTION_CANCEL)));
verifyAll();
}
@@ -145,13 +142,12 @@
MotionEvent.ACTION_HOVER_EXIT}) {
resetAll();
View view = createViewMock(View.class);
- KeyEventHandler keyEventHandler = createMockKeyEventHandler();
+ TouchEventEmulator emulator = createMock(TouchEventEmulator.class);
KeyboardAccessibilityNodeProvider provider = createMockProvider(view);
expect(provider.getKey(anyInt(), anyInt())).andReturn(Optional.<Key>absent());
replayAll();
KeyboardAccessibilityDelegate delegate =
- new KeyboardAccessibilityDelegate(view, provider, 0);
- delegate.setKeyEventHandler(Optional.of(keyEventHandler));
+ new KeyboardAccessibilityDelegate(view, provider, 0, emulator);
assertFalse(delegate.dispatchHoverEvent(createMotionEvent(action)));
verifyAll();
}
@@ -170,7 +166,7 @@
MotionEvent.ACTION_HOVER_MOVE}) {
resetAll();
View view = createViewMock(View.class);
- KeyEventHandler keyEventHandler = createMockKeyEventHandler();
+ TouchEventEmulator emulator = createMock(TouchEventEmulator.class);
KeyboardAccessibilityNodeProvider provider = createMockProvider(view);
expect(provider.getKey(anyInt(), anyInt())).andReturn(createOptionalKey());
provider.sendAccessibilityEventForKeyIfAccessibilityEnabled(
@@ -180,8 +176,7 @@
.andReturn(true);
replayAll();
KeyboardAccessibilityDelegate delegate =
- new KeyboardAccessibilityDelegate(view, provider, 0);
- delegate.setKeyEventHandler(Optional.of(keyEventHandler));
+ new KeyboardAccessibilityDelegate(view, provider, 0, emulator);
assertTrue(delegate.dispatchHoverEvent(createMotionEvent(action)));
verifyAll();
}
@@ -196,12 +191,12 @@
// - KeyEventHandler#onKey is invoked.
// - MotionEvent is consumed.
View view = createViewMock(View.class);
- KeyEventHandler keyEventHandler = createMockKeyEventHandler();
+ TouchEventEmulator emulator = createMock(TouchEventEmulator.class);
KeyboardAccessibilityNodeProvider provider = createMockProvider(view);
Optional<Key> optionalKey = createOptionalKey();
expect(provider.getKey(anyInt(), anyInt())).andReturn(optionalKey);
- keyEventHandler.sendKey(KEY_CODE, Collections.<TouchEvent>emptyList());
+ emulator.emulateKeyInput(anyObject(Key.class));
provider.sendAccessibilityEventForKeyIfAccessibilityEnabled(
anyObject(Key.class), eq(AccessibilityEventCompat.TYPE_VIEW_HOVER_EXIT));
expect(provider.performActionForKey(
@@ -209,8 +204,7 @@
.andReturn(true);
replayAll();
KeyboardAccessibilityDelegate delegate =
- new KeyboardAccessibilityDelegate(view, provider, 0);
- delegate.setKeyEventHandler(Optional.of(keyEventHandler));
+ new KeyboardAccessibilityDelegate(view, provider, 0, emulator);
assertTrue(delegate.dispatchHoverEvent(createMotionEvent(MotionEvent.ACTION_HOVER_EXIT)));
verifyAll();
}
@@ -225,11 +219,10 @@
// - No methods in the KeyEventHandler are called back.
// - MotionEvent is consumed.
View view = createViewMock(View.class);
- KeyEventHandler keyEventHandler = createMockKeyEventHandler();
+ TouchEventEmulator emulator = createMock(TouchEventEmulator.class);
KeyboardAccessibilityNodeProvider provider = createMockProvider(view);
KeyboardAccessibilityDelegate delegate =
- new KeyboardAccessibilityDelegate(view, provider, 0);
- delegate.setKeyEventHandler(Optional.of(keyEventHandler));
+ new KeyboardAccessibilityDelegate(view, provider, 0, emulator);
// Preparing precondition.
expect(provider.getKey(anyInt(), anyInt())).andReturn(createOptionalKey());
provider.sendAccessibilityEventForKeyIfAccessibilityEnabled(
@@ -266,11 +259,10 @@
// - No methods in the KeyEventHandler are called back.
// - MotionEvent is consumed.
View view = createViewMock(View.class);
- KeyEventHandler keyEventHandler = createMockKeyEventHandler();
+ TouchEventEmulator emulator = createMock(TouchEventEmulator.class);
KeyboardAccessibilityNodeProvider provider = createMockProvider(view);
KeyboardAccessibilityDelegate delegate =
- new KeyboardAccessibilityDelegate(view, provider, 0);
- delegate.setKeyEventHandler(Optional.of(keyEventHandler));
+ new KeyboardAccessibilityDelegate(view, provider, 0, emulator);
// Preparing precondition.
expect(provider.getKey(anyInt(), anyInt())).andReturn(createOptionalKey());
provider.sendAccessibilityEventForKeyIfAccessibilityEnabled(
@@ -303,9 +295,10 @@
.addMockedMethods("isWiredHeadsetOn", "isBluetoothA2dpOn")
.createMock();
AccessibilityUtil.setAudioManagerForTesting(Optional.of(audioManager));
+ TouchEventEmulator emulator = createMock(TouchEventEmulator.class);
KeyboardAccessibilityNodeProvider provider = createMockProvider(view);
KeyboardAccessibilityDelegate delegate =
- new KeyboardAccessibilityDelegate(view, provider, 0);
+ new KeyboardAccessibilityDelegate(view, provider, 0, emulator);
for (boolean isPasswordField : new boolean[] {true, false}) {
for (boolean isAccessibilityEnabled : new boolean[] {true, false}) {
AccessibilityUtil.setAccessibilityEnabled(Optional.of(isAccessibilityEnabled));
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/accessibility/KeyboardAccessibilityNodeProviderTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/accessibility/KeyboardAccessibilityNodeProviderTest.java
index 2638023..bcadad3 100644
--- a/src/android/tests/src/com/google/android/inputmethod/japanese/accessibility/KeyboardAccessibilityNodeProviderTest.java
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/accessibility/KeyboardAccessibilityNodeProviderTest.java
@@ -33,6 +33,7 @@
import static org.easymock.EasyMock.capture;
import static org.easymock.EasyMock.expect;
+import org.mozc.android.inputmethod.japanese.keyboard.BackgroundDrawableFactory.DrawableType;
import org.mozc.android.inputmethod.japanese.keyboard.Flick;
import org.mozc.android.inputmethod.japanese.keyboard.Flick.Direction;
import org.mozc.android.inputmethod.japanese.keyboard.Key;
@@ -41,6 +42,8 @@
import org.mozc.android.inputmethod.japanese.keyboard.KeyState;
import org.mozc.android.inputmethod.japanese.keyboard.KeyState.MetaState;
import org.mozc.android.inputmethod.japanese.keyboard.Keyboard;
+import org.mozc.android.inputmethod.japanese.keyboard.Keyboard.KeyboardSpecification;
+import org.mozc.android.inputmethod.japanese.keyboard.PopUp;
import org.mozc.android.inputmethod.japanese.keyboard.Row;
import org.mozc.android.inputmethod.japanese.testing.ApiLevel;
import org.mozc.android.inputmethod.japanese.testing.InstrumentationTestCaseWithMock;
@@ -90,7 +93,8 @@
private Keyboard createMockKeyboard() {
List<Row> rowList = Collections.singletonList(
new Row(Arrays.asList(
- new Key(0, 0, 10, 10, 0, 0, true, false, false, Stick.EVEN, Arrays.asList(
+ new Key(0, 0, 10, 10, 0, 0, true, false, Stick.EVEN,
+ DrawableType.TWELVEKEYS_REGULAR_KEY_BACKGROUND, Arrays.asList(
new KeyState(
"meta:unmodified",
Collections.<MetaState>emptySet(),
@@ -98,8 +102,9 @@
Collections.<MetaState>emptySet(),
Collections.singletonList(
new Flick(Direction.CENTER,
- new KeyEntity(SOURCE_ID_UNMODIFIED, KEYCODE_UNMODIFIED,
- 0, 0, null, false, null)))),
+ new KeyEntity(SOURCE_ID_UNMODIFIED, KEYCODE_UNMODIFIED, 0, true, 0,
+ Optional.<String>absent(), false, Optional.<PopUp>absent(),
+ 0, 0, 0, 0)))),
new KeyState(
"meta:shift",
EnumSet.of(MetaState.SHIFT),
@@ -107,9 +112,11 @@
Collections.<MetaState>emptySet(),
Collections.singletonList(
new Flick(Direction.CENTER,
- new KeyEntity(SOURCE_ID_SHIFTED, KEYCODE_SHIFTED,
- 0, 0, null, false, null)))))),
- new Key(10, 0, 10, 10, 0, 0, true, false, false, Stick.EVEN, Collections.singletonList(
+ new KeyEntity(SOURCE_ID_SHIFTED, KEYCODE_SHIFTED, 0, true, 0,
+ Optional.<String>absent(), false, Optional.<PopUp>absent(),
+ 0, 0, 0, 0)))))),
+ new Key(10, 0, 10, 10, 0, 0, true, false, Stick.EVEN,
+ DrawableType.TWELVEKEYS_REGULAR_KEY_BACKGROUND, Collections.singletonList(
new KeyState(
"backspace",
Collections.<MetaState>emptySet(),
@@ -117,10 +124,12 @@
Collections.<MetaState>emptySet(),
Collections.singletonList(
new Flick(Direction.CENTER,
- new KeyEntity(SOURCE_ID_BACKSPACE, KEYCODE_BACKSPACE,
- 0, 0, null, false, null))))))),
+ new KeyEntity(SOURCE_ID_BACKSPACE, KEYCODE_BACKSPACE, 0, true, 0,
+ Optional.<String>absent(), false,
+ Optional.<PopUp>absent(), 0, 0, 0, 0))))))),
10, 0));
- return new Keyboard(Optional.of("testkeyboard"), rowList, 0);
+ return new Keyboard(Optional.of("testkeyboard"), rowList, 0,
+ KeyboardSpecification.TWELVE_KEY_TOGGLE_FLICK_KANA);
}
private View createMockView() {
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/hardwarekeyboard/HardwareKeyboardSpecificationTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/hardwarekeyboard/HardwareKeyboardSpecificationTest.java
index 1821d9c..d3600e9 100644
--- a/src/android/tests/src/com/google/android/inputmethod/japanese/hardwarekeyboard/HardwareKeyboardSpecificationTest.java
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/hardwarekeyboard/HardwareKeyboardSpecificationTest.java
@@ -29,9 +29,9 @@
package org.mozc.android.inputmethod.japanese.hardwarekeyboard;
-import org.mozc.android.inputmethod.japanese.JapaneseKeyboard.KeyboardSpecification;
import org.mozc.android.inputmethod.japanese.KeycodeConverter.KeyEventInterface;
import org.mozc.android.inputmethod.japanese.hardwarekeyboard.HardwareKeyboard.CompositionSwitchMode;
+import org.mozc.android.inputmethod.japanese.keyboard.Keyboard.KeyboardSpecification;
import org.mozc.android.inputmethod.japanese.preference.ClientSidePreference.HardwareKeyMap;
import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands;
import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.KeyEvent.ModifierKey;
@@ -80,7 +80,7 @@
HardwareKeyboardSpecification.DEFAULT;
class KeyEventMock extends KeyEvent {
- private int unicode;
+ private final int unicode;
KeyEventMock(int action, int keycode, int meta, int unicode) {
super(0, 0, action, keycode, 0, meta);
this.unicode = unicode;
@@ -99,7 +99,7 @@
assertEquals(keyEvent.getUnicodeChar(), mozcKeyEvent.getKeyCode());
KeyEventInterface keyEventInterface = keyboardSpecification.getKeyEventInterface(keyEvent);
- assertEquals(keyEvent, keyEventInterface.getNativeEvent());
+ assertEquals(keyEvent, keyEventInterface.getNativeEvent().orNull());
}
{
@@ -123,7 +123,7 @@
assertEquals(SpecialKey.SPACE, mozcKeyEvent.getSpecialKey());
KeyEventInterface keyEventInterface = keyboardSpecification.getKeyEventInterface(keyEvent);
- assertEquals(keyEvent, keyEventInterface.getNativeEvent());
+ assertEquals(keyEvent, keyEventInterface.getNativeEvent().orNull());
}
{
@@ -135,7 +135,7 @@
assertEquals(SpecialKey.ENTER, mozcKeyEvent.getSpecialKey());
KeyEventInterface keyEventInterface = keyboardSpecification.getKeyEventInterface(keyEvent);
- assertEquals(keyEvent, keyEventInterface.getNativeEvent());
+ assertEquals(keyEvent, keyEventInterface.getNativeEvent().orNull());
}
{
@@ -149,7 +149,7 @@
assertEquals(0, mozcKeyEvent.getModifierKeysCount());
KeyEventInterface keyEventInterface = keyboardSpecification.getKeyEventInterface(keyEvent);
- assertEquals(keyEvent, keyEventInterface.getNativeEvent());
+ assertEquals(keyEvent, keyEventInterface.getNativeEvent().orNull());
}
{
@@ -167,7 +167,7 @@
new HashSet<ModifierKey>(mozcKeyEvent.getModifierKeysList()));
KeyEventInterface keyEventInterface = keyboardSpecification.getKeyEventInterface(keyEvent);
- assertEquals(keyEvent, keyEventInterface.getNativeEvent());
+ assertEquals(keyEvent, keyEventInterface.getNativeEvent().orNull());
}
{
@@ -187,7 +187,7 @@
new HashSet<ModifierKey>(mozcKeyEvent.getModifierKeysList()));
KeyEventInterface keyEventInterface = keyboardSpecification.getKeyEventInterface(keyEvent);
- assertEquals(keyEvent, keyEventInterface.getNativeEvent());
+ assertEquals(keyEvent, keyEventInterface.getNativeEvent().orNull());
}
{
@@ -915,7 +915,7 @@
}
assertEquals(testData.toString(), keyEvent,
- keyboardSpecification.getKeyEventInterface(keyEvent).getNativeEvent());
+ keyboardSpecification.getKeyEventInterface(keyEvent).getNativeEvent().orNull());
assertEquals(testData.toString(), testData.expectCompositionSwitchMode,
keyboardSpecification.getCompositionSwitchMode(keyEvent));
@@ -928,81 +928,6 @@
}
@SmallTest
- public void testTweleveKeyConverter() {
- HardwareKeyboardSpecification keyboardSpecification =
- HardwareKeyboardSpecification.TWELVEKEY;
-
- KeyEvent keyEventA = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_A);
- keyEventA.setSource(InputDevice.SOURCE_KEYBOARD);
- assertEquals(keyEventA.getUnicodeChar(),
- keyboardSpecification.getMozcKeyEvent(keyEventA).getKeyCode());
-
- class TestData extends Parameter {
- final int keyCode;
- final int expectMozcKeyCode;
-
- TestData(int keyCode, int expectMozcKeyCode) {
- this.keyCode = keyCode;
- this.expectMozcKeyCode = expectMozcKeyCode;
- }
- }
-
- TestData[] testDataList = {
- new TestData(KeyEvent.KEYCODE_0, '0'),
- new TestData(KeyEvent.KEYCODE_1, '1'),
- new TestData(KeyEvent.KEYCODE_2, '2'),
- new TestData(KeyEvent.KEYCODE_3, '3'),
- new TestData(KeyEvent.KEYCODE_4, '4'),
- new TestData(KeyEvent.KEYCODE_5, '5'),
- new TestData(KeyEvent.KEYCODE_6, '6'),
- new TestData(KeyEvent.KEYCODE_7, '7'),
- new TestData(KeyEvent.KEYCODE_8, '8'),
- new TestData(KeyEvent.KEYCODE_9, '9'),
- new TestData(KeyEvent.KEYCODE_STAR, '*'),
- };
-
- for (TestData testData : testDataList) {
- KeyEvent keyEvent = new KeyEvent(KeyEvent.ACTION_DOWN, testData.keyCode);
- keyEvent.setSource(InputDevice.SOURCE_KEYBOARD);
- assertEquals(testData.toString(), testData.expectMozcKeyCode,
- keyboardSpecification.getMozcKeyEvent(keyEvent).getKeyCode());
- KeyEventInterface keyEventInterface = keyboardSpecification.getKeyEventInterface(keyEvent);
- assertNotNull(testData.toString(), keyEventInterface.getNativeEvent());
- assertEquals(testData.toString(), keyEvent.getKeyCode(), keyEventInterface.getKeyCode());
- }
-
- {
- KeyEvent keyEvent = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_POUND);
- keyEvent.setSource(InputDevice.SOURCE_KEYBOARD);
- assertEquals(SpecialKey.ENTER,
- keyboardSpecification.getMozcKeyEvent(keyEvent).getSpecialKey());
- KeyEventInterface keyEventInterface = keyboardSpecification.getKeyEventInterface(keyEvent);
- assertNotNull(keyEventInterface.getNativeEvent());
- assertEquals(KeyEvent.KEYCODE_ENTER, keyEventInterface.getKeyCode());
- }
-
- {
- KeyEvent keyEvent = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DPAD_CENTER);
- keyEvent.setSource(InputDevice.SOURCE_KEYBOARD);
- assertEquals(SpecialKey.ENTER,
- keyboardSpecification.getMozcKeyEvent(keyEvent).getSpecialKey());
- KeyEventInterface keyEventInterface = keyboardSpecification.getKeyEventInterface(keyEvent);
- assertNotNull(keyEventInterface.getNativeEvent());
- assertEquals(KeyEvent.KEYCODE_ENTER, keyEventInterface.getKeyCode());
- }
-
- // No corresponding entry.
- KeyEvent keyEvent = new KeyEvent(0, 0);
- keyEvent.setSource(InputDevice.SOURCE_KEYBOARD);
- assertFalse(keyboardSpecification.getCompositionSwitchMode(keyEvent).isPresent());
-
- assertEquals(KeyboardSpecification.TWELVE_KEY_TOGGLE_KANA,
- keyboardSpecification.getKanaKeyboardSpecification());
- assertEquals(KeyboardSpecification.TWELVE_KEY_TOGGLE_ALPHABET,
- keyboardSpecification.getAlphabetKeyboardSpecification());
- }
-
- @SmallTest
public void testMaybeSetDetectedHardwareKeyMap() {
class TestData extends Parameter {
final HardwareKeyMap presetHardwareKeyMap;
@@ -1024,8 +949,8 @@
TestData[] testDataList = {
new TestData(HardwareKeyMap.JAPANESE109A, Configuration.KEYBOARD_12KEY, false,
HardwareKeyMap.JAPANESE109A),
- new TestData(null, Configuration.KEYBOARD_12KEY, false, HardwareKeyMap.TWELVEKEY),
- new TestData(null, Configuration.KEYBOARD_QWERTY, false, HardwareKeyMap.JAPANESE109A),
+ new TestData(null, Configuration.KEYBOARD_12KEY, false, HardwareKeyMap.DEFAULT),
+ new TestData(null, Configuration.KEYBOARD_QWERTY, false, HardwareKeyMap.DEFAULT),
new TestData(null, Configuration.KEYBOARD_NOKEYS, false, null),
new TestData(null, Configuration.KEYBOARD_UNDEFINED, false, null),
new TestData(null, Configuration.KEYBOARD_NOKEYS, true, HardwareKeyMap.DEFAULT),
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/hardwarekeyboard/HardwareKeyboardTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/hardwarekeyboard/HardwareKeyboardTest.java
index 961adce..280bcd6 100644
--- a/src/android/tests/src/com/google/android/inputmethod/japanese/hardwarekeyboard/HardwareKeyboardTest.java
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/hardwarekeyboard/HardwareKeyboardTest.java
@@ -29,7 +29,7 @@
package org.mozc.android.inputmethod.japanese.hardwarekeyboard;
-import org.mozc.android.inputmethod.japanese.JapaneseKeyboard.KeyboardSpecification;
+import org.mozc.android.inputmethod.japanese.keyboard.Keyboard.KeyboardSpecification;
import org.mozc.android.inputmethod.japanese.preference.ClientSidePreference.HardwareKeyMap;
import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.CompositionMode;
import org.mozc.android.inputmethod.japanese.testing.InstrumentationTestCaseWithMock;
@@ -86,27 +86,4 @@
assertEquals(KeyboardSpecification.HARDWARE_QWERTY_KANA,
hardwareKeyboard.getKeyboardSpecification());
}
-
- @SmallTest
- public void test12KeysKeyboard() {
- HardwareKeyboard hardwareKeyboard = new HardwareKeyboard();
- hardwareKeyboard.setHardwareKeyMap(HardwareKeyMap.TWELVEKEY);
- assertEquals(HardwareKeyMap.TWELVEKEY, hardwareKeyboard.getHardwareKeyMap());
-
- KeyEvent zenhan = new KeyEvent(0, 0, 0, KeyEvent.KEYCODE_ZENKAKU_HANKAKU, 0);
-
- assertEquals(CompositionMode.HIRAGANA, hardwareKeyboard.getCompositionMode());
- assertEquals(KeyboardSpecification.TWELVE_KEY_TOGGLE_KANA,
- hardwareKeyboard.getKeyboardSpecification());
-
- hardwareKeyboard.setCompositionModeByKey(zenhan);
- assertEquals(CompositionMode.HALF_ASCII, hardwareKeyboard.getCompositionMode());
- assertEquals(KeyboardSpecification.TWELVE_KEY_TOGGLE_ALPHABET,
- hardwareKeyboard.getKeyboardSpecification());
-
- hardwareKeyboard.setCompositionModeByKey(zenhan);
- assertEquals(CompositionMode.HIRAGANA, hardwareKeyboard.getCompositionMode());
- assertEquals(KeyboardSpecification.TWELVE_KEY_TOGGLE_KANA,
- hardwareKeyboard.getKeyboardSpecification());
- }
}
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/keyboard/BackgroundDrawableFactoryTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/keyboard/BackgroundDrawableFactoryTest.java
index d4be0e7..678a783 100644
--- a/src/android/tests/src/com/google/android/inputmethod/japanese/keyboard/BackgroundDrawableFactoryTest.java
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/keyboard/BackgroundDrawableFactoryTest.java
@@ -39,6 +39,7 @@
import org.mozc.android.inputmethod.japanese.testing.MozcMatcher.DeepCopyPaintCapture;
import org.mozc.android.inputmethod.japanese.view.SkinType;
+import android.content.res.Resources;
import android.graphics.Canvas;
import android.graphics.ComposeShader;
import android.graphics.LinearGradient;
@@ -60,7 +61,9 @@
@Override
public void setUp() throws Exception {
super.setUp();
- factory = new BackgroundDrawableFactory(1f);
+ Resources resources = getInstrumentation().getTargetContext().getResources();
+ factory = new BackgroundDrawableFactory(resources);
+ factory.setSkin(SkinType.TEST.getSkin(resources));
}
@Override
@@ -151,6 +154,9 @@
DrawableType.TWELVEKEYS_REGULAR_KEY_BACKGROUND,
DrawableType.TWELVEKEYS_FUNCTION_KEY_BACKGROUND,
};
+ // Expectations depend on ORANGE_LIGHTGRAY skin.
+ factory.setSkin(
+ SkinType.ORANGE_LIGHTGRAY.getSkin(getInstrumentation().getTargetContext().getResources()));
for (DrawableType drawableType : drawableTypeList) {
Capture<Paint> paintCapture = new DeepCopyPaintCapture();
@@ -238,8 +244,6 @@
DrawableType[] drawableTypeList = {
DrawableType.QWERTY_REGULAR_KEY_BACKGROUND,
DrawableType.QWERTY_FUNCTION_KEY_BACKGROUND,
- DrawableType.QWERTY_FUNCTION_KEY_LIGHT_ON_BACKGROUND,
- DrawableType.QWERTY_FUNCTION_KEY_LIGHT_OFF_BACKGROUND,
};
int[][] stateList = {
@@ -254,13 +258,6 @@
canvas.drawRoundRect(isA(RectF.class), gt(0f), gt(0f), isA(Paint.class)); // Shadow.
canvas.drawRoundRect(isA(RectF.class), gt(0f), gt(0f), capture(paintCapture)); // Base.
- if (drawableType == DrawableType.QWERTY_FUNCTION_KEY_LIGHT_ON_BACKGROUND ||
- drawableType == DrawableType.QWERTY_FUNCTION_KEY_LIGHT_OFF_BACKGROUND) {
- // Light mark should be drawn.
- canvas.drawCircle(gt(0f), gt(0f), gt(0f), isA(Paint.class)); // Base.
- canvas.drawCircle(gt(0f), gt(0f), gt(0f), isA(Paint.class)); // Shade.
- }
-
replayAll();
Drawable drawable = factory.getDrawable(drawableType);
@@ -278,12 +275,6 @@
canvas.drawRoundRect(isA(RectF.class), gt(0f), gt(0f), isA(Paint.class)); // Shadow.
canvas.drawRoundRect(isA(RectF.class), gt(0f), gt(0f), capture(paintCapture)); // Base.
- if (drawableType == DrawableType.QWERTY_FUNCTION_KEY_LIGHT_ON_BACKGROUND ||
- drawableType == DrawableType.QWERTY_FUNCTION_KEY_LIGHT_OFF_BACKGROUND) {
- // Light mark should be drawn.
- canvas.drawCircle(gt(0f), gt(0f), gt(0f), isA(Paint.class)); // Base.
- canvas.drawCircle(gt(0f), gt(0f), gt(0f), isA(Paint.class)); // Shade.
- }
replayAll();
drawable.setBounds(0, 0, 200, 200);
drawable.draw(canvas);
@@ -299,6 +290,9 @@
@SmallTest
public void testSetSkinType() {
+ Resources resources = getInstrumentation().getTargetContext().getResources();
+ // With skin, getDrawable method returns concrete drawable.
+ factory.setSkin(SkinType.ORANGE_LIGHTGRAY.getSkin(resources));
Drawable drawable = factory.getDrawable(DrawableType.TWELVEKEYS_REGULAR_KEY_BACKGROUND);
assertNotNull(drawable);
@@ -307,12 +301,12 @@
// If setSkinType is invoked, but actually skin is not changed,
// the same instance should be used.
- factory.setSkinType(SkinType.ORANGE_LIGHTGRAY);
+ factory.setSkin(SkinType.ORANGE_LIGHTGRAY.getSkin(resources));
assertSame(drawable, factory.getDrawable(DrawableType.TWELVEKEYS_REGULAR_KEY_BACKGROUND));
// If setSkinType is invoked, and actually the skin is changed,
// the difference instance should be created.
- factory.setSkinType(SkinType.TEST);
+ factory.setSkin(SkinType.TEST.getSkin(resources));
assertNotSame(drawable, factory.getDrawable(DrawableType.TWELVEKEYS_REGULAR_KEY_BACKGROUND));
}
}
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/keyboard/KeyEventContextTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/keyboard/KeyEventContextTest.java
index c5de5af..9af8ce7 100644
--- a/src/android/tests/src/com/google/android/inputmethod/japanese/keyboard/KeyEventContextTest.java
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/keyboard/KeyEventContextTest.java
@@ -29,10 +29,12 @@
package org.mozc.android.inputmethod.japanese.keyboard;
+import org.mozc.android.inputmethod.japanese.keyboard.BackgroundDrawableFactory.DrawableType;
import org.mozc.android.inputmethod.japanese.keyboard.Key.Stick;
import org.mozc.android.inputmethod.japanese.keyboard.KeyState.MetaState;
import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Input.TouchAction;
import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Input.TouchEvent;
+import com.google.common.base.Optional;
import android.test.suitebuilder.annotation.SmallTest;
@@ -45,6 +47,7 @@
/**
*/
public class KeyEventContextTest extends TestCase {
+
private PopUp defaultPopUp;
private PopUp leftPopUp;
private KeyEntity defaultEntity;
@@ -54,18 +57,30 @@
private KeyState defaultState;
private KeyState modifiedState;
private Key modifiableKey;
+ private Key longpressableKeyWithTimeoutTrigger;
+ private Key longpressableKeyWithoutTimeoutTrigger;
@Override
public void setUp() throws Exception {
super.setUp();
- defaultPopUp = new PopUp(0, 0, 0, 0, 0);
- leftPopUp = new PopUp(0, 0, 0, 0, 0);
+ defaultPopUp = new PopUp(0, 0, 0, 0, 0, 0, 0);
+ leftPopUp = new PopUp(0, 0, 0, 0, 0, 0, 0);
- defaultEntity = new KeyEntity(1, 'a', 'A', 0, null, false, defaultPopUp);
- leftFlickEntity = new KeyEntity(2, 'b', 'B', 0, null, false, leftPopUp);
- modifiedCenterEntity = new KeyEntity(3, 'c', 'C', 0, null, false, null);
- modifiedLeftEntity = new KeyEntity(4, 'd', 'D', 0, null, false, null);
+ defaultEntity = new KeyEntity(
+ 1, 'a', 'A', true, 0, Optional.<String>absent(), false, Optional.of(defaultPopUp),
+ 0, 0, 0, 0);
+ leftFlickEntity = new KeyEntity(
+ 2, 'b', 'B', true, 0, Optional.<String>absent(), false, Optional.of(leftPopUp), 0, 0, 0, 0);
+ modifiedCenterEntity = createKeyEntity(3, 'c', 'C');
+ modifiedLeftEntity = createKeyEntity(4, 'd', 'D');
+
+ KeyEntity longpressableEntityWithTimeoutTrigger = new KeyEntity(
+ 5, 'e', 'E', true, 0, Optional.<String>absent(), false, Optional.of(defaultPopUp),
+ 0, 0, 0, 0);
+ KeyEntity longpressableEntityWithoutTimeoutTrigger = new KeyEntity(
+ 6, 'f', 'F', false, 0, Optional.<String>absent(), false, Optional.of(defaultPopUp),
+ 0, 0, 0, 0);
defaultState = new KeyState(
"", Collections.<MetaState>emptySet(),
@@ -78,8 +93,25 @@
Arrays.asList(new Flick(Flick.Direction.CENTER, modifiedCenterEntity),
new Flick(Flick.Direction.LEFT, modifiedLeftEntity)));
- modifiableKey = new Key(0, 0, 16, 16, 0, 0, false, false, false, Stick.EVEN,
+ modifiableKey = new Key(0, 0, 16, 16, 0, 0, false, false, Stick.EVEN,
+ DrawableType.TWELVEKEYS_REGULAR_KEY_BACKGROUND,
Arrays.asList(defaultState, modifiedState));
+ longpressableKeyWithTimeoutTrigger = new Key(0, 0, 16, 16, 0, 0, false, false, Stick.EVEN,
+ DrawableType.TWELVEKEYS_REGULAR_KEY_BACKGROUND,
+ Collections.singletonList(
+ new KeyState("", Collections.<MetaState>emptySet(),
+ Collections.<MetaState>emptySet(), Collections.<MetaState>emptySet(),
+ Collections.singletonList(
+ new Flick(Flick.Direction.CENTER,
+ longpressableEntityWithTimeoutTrigger)))));
+ longpressableKeyWithoutTimeoutTrigger = new Key(0, 0, 16, 16, 0, 0, false, false, Stick.EVEN,
+ DrawableType.TWELVEKEYS_REGULAR_KEY_BACKGROUND,
+ Collections.singletonList(
+ new KeyState("", Collections.<MetaState>emptySet(),
+ Collections.<MetaState>emptySet(), Collections.<MetaState>emptySet(),
+ Collections.singletonList(
+ new Flick(Flick.Direction.CENTER,
+ longpressableEntityWithoutTimeoutTrigger)))));
}
@Override
@@ -97,10 +129,17 @@
super.tearDown();
}
+ private static KeyEntity createKeyEntity(int sourceId, int keyCode, int longPressKeyCode) {
+ return new KeyEntity(
+ sourceId, keyCode, longPressKeyCode, true, 0,
+ Optional.<String>absent(), false, Optional.<PopUp>absent(), 0, 0, 0, 0);
+ }
+
@SmallTest
public void testIsContained() {
Key key = new Key(
- 0, 0, 30, 50, 0, 0, false, false, false, Stick.EVEN, Collections.<KeyState>emptyList());
+ 0, 0, 30, 50, 0, 0, false, false, Stick.EVEN,
+ DrawableType.TWELVEKEYS_REGULAR_KEY_BACKGROUND, Collections.<KeyState>emptyList());
assertTrue(KeyEventContext.isContained(15, 25, key));
assertTrue(KeyEventContext.isContained(10, 5, key));
assertTrue(KeyEventContext.isContained(29, 45, key));
@@ -114,16 +153,16 @@
public void testIsFlickable() {
// If the key doesn't return KeyState, isFlickable should return false.
assertFalse(KeyEventContext.isFlickable(
- new Key(0, 0, 30, 50, 0, 0, false, false, false, Stick.EVEN,
- Collections.<KeyState>emptyList()),
+ new Key(0, 0, 30, 50, 0, 0, false, false, Stick.EVEN,
+ DrawableType.TWELVEKEYS_REGULAR_KEY_BACKGROUND, Collections.<KeyState>emptyList()),
Collections.<MetaState>emptySet()));
// If the key doesn't have flick related data other than CENTER, it is not flickable.
- KeyEntity dummyKeyEntity =
- new KeyEntity(1, 'a', KeyEntity.INVALID_KEY_CODE, 0, null, false, null);
+ KeyEntity dummyKeyEntity = createKeyEntity(1, 'a', KeyEntity.INVALID_KEY_CODE);
Flick center = new Flick(Flick.Direction.CENTER, dummyKeyEntity);
assertFalse(KeyEventContext.isFlickable(
- new Key(0, 0, 30, 50, 0, 0, false, false, false, Stick.EVEN,
+ new Key(0, 0, 30, 50, 0, 0, false, false, Stick.EVEN,
+ DrawableType.TWELVEKEYS_REGULAR_KEY_BACKGROUND,
Collections.singletonList(
new KeyState("",
Collections.<MetaState>emptySet(),
@@ -135,7 +174,8 @@
// If the key has flick related data other than CENTER, it is flickable.
Flick left = new Flick(Flick.Direction.LEFT, dummyKeyEntity);
assertTrue(KeyEventContext.isFlickable(
- new Key(0, 0, 30, 50, 0, 0, false, false, false, Stick.EVEN,
+ new Key(0, 0, 30, 50, 0, 0, false, false, Stick.EVEN,
+ DrawableType.TWELVEKEYS_REGULAR_KEY_BACKGROUND,
Collections.singletonList(
new KeyState("",
Collections.<MetaState>emptySet(),
@@ -149,48 +189,60 @@
public void testGetKeyEntity() {
assertSame(defaultEntity,
KeyEventContext.getKeyEntity(
- modifiableKey, Collections.<MetaState>emptySet(), Flick.Direction.CENTER));
+ modifiableKey, Collections.<MetaState>emptySet(),
+ Optional.of(Flick.Direction.CENTER)).get());
assertSame(leftFlickEntity,
KeyEventContext.getKeyEntity(
- modifiableKey, Collections.<MetaState>emptySet(), Flick.Direction.LEFT));
+ modifiableKey, Collections.<MetaState>emptySet(),
+ Optional.of(Flick.Direction.LEFT)).get());
assertSame(modifiedCenterEntity,
KeyEventContext.getKeyEntity(
- modifiableKey, EnumSet.of(MetaState.CAPS_LOCK), Flick.Direction.CENTER));
+ modifiableKey, EnumSet.of(MetaState.CAPS_LOCK),
+ Optional.of(Flick.Direction.CENTER)).get());
assertSame(modifiedLeftEntity,
KeyEventContext.getKeyEntity(
- modifiableKey, EnumSet.of(MetaState.CAPS_LOCK), Flick.Direction.LEFT));
+ modifiableKey, EnumSet.of(MetaState.CAPS_LOCK),
+ Optional.of(Flick.Direction.LEFT)).get());
// If a key entity for the flick direction is not specified,
- // null should be returned.
- assertNull(KeyEventContext.getKeyEntity(
- modifiableKey, Collections.<MetaState>emptySet(), Flick.Direction.RIGHT));
- assertNull(KeyEventContext.getKeyEntity(
- modifiableKey, EnumSet.of(MetaState.CAPS_LOCK), Flick.Direction.RIGHT));
+ // Optional.absent() should be returned.
+ assertFalse(KeyEventContext.getKeyEntity(
+ modifiableKey, Collections.<MetaState>emptySet(),
+ Optional.of(Flick.Direction.RIGHT)).isPresent());
+ assertFalse(KeyEventContext.getKeyEntity(
+ modifiableKey, EnumSet.of(MetaState.CAPS_LOCK),
+ Optional.of(Flick.Direction.RIGHT)).isPresent());
- Key unmodifiableKey = new Key(0, 0, 0, 0, 0, 0, false, false, false, Stick.EVEN,
+ Key unmodifiableKey = new Key(0, 0, 0, 0, 0, 0, false, false, Stick.EVEN,
+ DrawableType.TWELVEKEYS_REGULAR_KEY_BACKGROUND,
Collections.singletonList(defaultState));
// If a key doesn't have modified state, default state should be used as its fall back.
assertSame(defaultEntity,
KeyEventContext.getKeyEntity(
- unmodifiableKey, Collections.<MetaState>emptySet(), Flick.Direction.CENTER));
+ unmodifiableKey, Collections.<MetaState>emptySet(),
+ Optional.of(Flick.Direction.CENTER)).get());
assertSame(leftFlickEntity,
KeyEventContext.getKeyEntity(
- unmodifiableKey, Collections.<MetaState>emptySet(), Flick.Direction.LEFT));
+ unmodifiableKey, Collections.<MetaState>emptySet(),
+ Optional.of(Flick.Direction.LEFT)).get());
assertSame(defaultEntity,
KeyEventContext.getKeyEntity(
- unmodifiableKey, EnumSet.of(MetaState.CAPS_LOCK), Flick.Direction.CENTER));
+ unmodifiableKey, EnumSet.of(MetaState.CAPS_LOCK),
+ Optional.of(Flick.Direction.CENTER)).get());
assertSame(leftFlickEntity,
KeyEventContext.getKeyEntity(
- unmodifiableKey, EnumSet.of(MetaState.CAPS_LOCK), Flick.Direction.LEFT));
+ unmodifiableKey, EnumSet.of(MetaState.CAPS_LOCK),
+ Optional.of(Flick.Direction.LEFT)).get());
- // If both state is not specified, null should be returned.
- Key spacer = new Key(0, 0, 0, 0, 0, 0, false, false, false, Stick.EVEN,
+ // If both state is not specified, Optional.absent() should be returned.
+ Key spacer = new Key(0, 0, 0, 0, 0, 0, false, false, Stick.EVEN,
+ DrawableType.TWELVEKEYS_REGULAR_KEY_BACKGROUND,
Collections.<KeyState>emptyList());
- assertNull(KeyEventContext.getKeyEntity(spacer, Collections.<MetaState>emptySet(),
- Flick.Direction.CENTER));
- assertNull(KeyEventContext.getKeyEntity(spacer, EnumSet.of(MetaState.CAPS_LOCK),
- Flick.Direction.CENTER));
+ assertFalse(KeyEventContext.getKeyEntity(spacer, Collections.<MetaState>emptySet(),
+ Optional.of(Flick.Direction.CENTER)).isPresent());
+ assertFalse(KeyEventContext.getKeyEntity(spacer, EnumSet.of(MetaState.CAPS_LOCK),
+ Optional.of(Flick.Direction.CENTER)).isPresent());
}
@SmallTest
@@ -202,18 +254,40 @@
assertEquals('b', keyEventContext.getKeyCode());
keyEventContext.flickDirection = Flick.Direction.RIGHT;
assertEquals(KeyEntity.INVALID_KEY_CODE, keyEventContext.getKeyCode());
- keyEventContext.longPressSent = true;
+ keyEventContext.pastLongPressSentTimeout = true;
keyEventContext.flickDirection = Flick.Direction.CENTER;
assertEquals(KeyEntity.INVALID_KEY_CODE, keyEventContext.getKeyCode());
}
@SmallTest
+ public void testGetKeyCodeForLongPressWithTimeoutTrigger() {
+ KeyEventContext keyEventContext =
+ new KeyEventContext(longpressableKeyWithTimeoutTrigger, 0, 0, 0, 100, 100, 1,
+ Collections.<MetaState>emptySet());
+ keyEventContext.pastLongPressSentTimeout = false;
+ assertEquals('e', keyEventContext.getKeyCode());
+ keyEventContext.pastLongPressSentTimeout = true;
+ assertEquals(KeyEntity.INVALID_KEY_CODE, keyEventContext.getKeyCode());
+ }
+
+ @SmallTest
+ public void testGetKeyCodeForLongPressWithoutTimeoutTrigger() {
+ KeyEventContext keyEventContext =
+ new KeyEventContext(longpressableKeyWithoutTimeoutTrigger, 0, 0, 0, 100, 100, 1,
+ Collections.<MetaState>emptySet());
+ keyEventContext.pastLongPressSentTimeout = false;
+ assertEquals('f', keyEventContext.getKeyCode());
+ keyEventContext.pastLongPressSentTimeout = true;
+ assertEquals('F', keyEventContext.getKeyCode());
+ }
+
+ @SmallTest
public void testGetLongPressKeyCode() {
KeyEventContext keyEventContext =
new KeyEventContext(modifiableKey, 0, 0, 0, 100, 100, 1,
Collections.<MetaState>emptySet());
assertEquals('A', keyEventContext.getLongPressKeyCode());
- keyEventContext.longPressSent = true;
+ keyEventContext.pastLongPressSentTimeout = true;
assertEquals(KeyEntity.INVALID_KEY_CODE, keyEventContext.getLongPressKeyCode());
}
@@ -227,7 +301,7 @@
assertEquals('a', keyEventContext.getPressedKeyCode());
keyEventContext.flickDirection = Flick.Direction.RIGHT;
assertEquals('a', keyEventContext.getPressedKeyCode());
- keyEventContext.longPressSent = true;
+ keyEventContext.pastLongPressSentTimeout = true;
keyEventContext.flickDirection = Flick.Direction.CENTER;
assertEquals('a', keyEventContext.getPressedKeyCode());
}
@@ -252,7 +326,8 @@
Collections.<MetaState>emptySet(),
EnumSet.of(MetaState.CAPS_LOCK),
Collections.singletonList(new Flick(Flick.Direction.CENTER, defaultEntity)));
- Key capsLockKey = new Key(0, 0, 10, 10, 0, 0, false, true, false, Stick.EVEN,
+ Key capsLockKey = new Key(0, 0, 10, 10, 0, 0, false, true, Stick.EVEN,
+ DrawableType.TWELVEKEYS_REGULAR_KEY_BACKGROUND,
Arrays.asList(onUnmodified, onShift, onCapsLock));
assertEquals(
EnumSet.of(MetaState.SHIFT),
@@ -270,19 +345,21 @@
@SmallTest
public void testIsMetaStateToggleEvent() {
- Key key = new Key(0, 0, 30, 50, 0, 0, false, false, false, Stick.EVEN,
+ Key key = new Key(0, 0, 30, 50, 0, 0, false, false, Stick.EVEN,
+ DrawableType.TWELVEKEYS_REGULAR_KEY_BACKGROUND,
Collections.<KeyState>emptyList());
KeyEventContext keyEventContext =
new KeyEventContext(key, 0, 0, 0, 100, 100, 1, Collections.<MetaState>emptySet());
assertFalse(keyEventContext.isMetaStateToggleEvent());
- Key modifierKey = new Key(0, 0, 30, 50, 0, 0, false, true, false, Stick.EVEN,
+ Key modifierKey = new Key(0, 0, 30, 50, 0, 0, false, true, Stick.EVEN,
+ DrawableType.TWELVEKEYS_REGULAR_KEY_BACKGROUND,
Collections.<KeyState>emptyList());
KeyEventContext modifierKeyEventContext =
new KeyEventContext(modifierKey, 0, 0, 0, 100, 100, 1, Collections.<MetaState>emptySet());
assertTrue(modifierKeyEventContext.isMetaStateToggleEvent());
- modifierKeyEventContext.longPressSent = true;
+ modifierKeyEventContext.pastLongPressSentTimeout = true;
assertFalse(modifierKeyEventContext.isMetaStateToggleEvent());
- modifierKeyEventContext.longPressSent = false;
+ modifierKeyEventContext.pastLongPressSentTimeout = false;
modifierKeyEventContext.flickDirection = Flick.Direction.LEFT;
assertFalse(modifierKeyEventContext.isMetaStateToggleEvent());
}
@@ -292,23 +369,23 @@
KeyEventContext keyEventContext =
new KeyEventContext(modifiableKey, 0, 0, 0, 100, 100, 1,
Collections.<MetaState>emptySet());
- assertSame(defaultPopUp, keyEventContext.getCurrentPopUp());
+ assertSame(defaultPopUp, keyEventContext.getCurrentPopUp().get());
keyEventContext.flickDirection = Flick.Direction.LEFT;
- assertSame(leftPopUp, keyEventContext.getCurrentPopUp());
+ assertSame(leftPopUp, keyEventContext.getCurrentPopUp().get());
keyEventContext.flickDirection = Flick.Direction.RIGHT;
- assertNull(keyEventContext.getCurrentPopUp());
- keyEventContext.longPressSent = true;
+ assertFalse(keyEventContext.getCurrentPopUp().isPresent());
+ keyEventContext.pastLongPressSentTimeout = true;
keyEventContext.flickDirection = Flick.Direction.CENTER;
- assertNull(keyEventContext.getCurrentPopUp());
+ assertFalse(keyEventContext.getCurrentPopUp().isPresent());
}
@SmallTest
public void testUpdate() {
- KeyEntity centerEntity = new KeyEntity(1, 'a', 'A', 0, null, false, null);
- KeyEntity leftEntity = new KeyEntity(2, 'b', 'B', 0, null, false, null);
- KeyEntity upEntity = new KeyEntity(3, 'c', 'C', 0, null, false, null);
- KeyEntity rightEntity = new KeyEntity(4, 'd', 'D', 0, null, false, null);
- KeyEntity downEntity = new KeyEntity(5, 'e', 'E', 0, null, false, null);
+ KeyEntity centerEntity = createKeyEntity(1, 'a', 'A');
+ KeyEntity leftEntity = createKeyEntity(2, 'b', 'B');
+ KeyEntity upEntity = createKeyEntity(3, 'c', 'C');
+ KeyEntity rightEntity = createKeyEntity(4, 'd', 'D');
+ KeyEntity downEntity = createKeyEntity(5, 'e', 'E');
KeyState keyState = new KeyState(
"",
@@ -321,7 +398,8 @@
new Flick(Flick.Direction.RIGHT, rightEntity),
new Flick(Flick.Direction.DOWN, downEntity)));
- Key key = new Key(0, 0, 16, 16, 0, 0, false, false, false, Stick.EVEN,
+ Key key = new Key(0, 0, 16, 16, 0, 0, false, false, Stick.EVEN,
+ DrawableType.TWELVEKEYS_REGULAR_KEY_BACKGROUND,
Collections.singletonList(keyState));
KeyEventContext keyEventContext =
new KeyEventContext(key, 0, 8, 8, 64, 64, 50, Collections.<MetaState>emptySet());
@@ -333,58 +411,65 @@
.addStroke(
KeyEventContext.createTouchPosition(TouchAction.TOUCH_DOWN, 8, 8, 64, 64, 0))
.build(),
- keyEventContext.getTouchEvent());
+ keyEventContext.getTouchEvent().get());
class TestData {
final int x;
final int y;
final long timestamp;
+ final boolean pastLongPressSentTimeout;
final boolean expectedUpdateResult;
final Flick.Direction expectedDirection;
final int expectedSourceId;
+ final boolean expectedPastLongPressSentTimeout;
- TestData(int x, int y, long timestamp,
+ TestData(int x, int y, long timestamp, boolean pastLongPressSentTimeout,
boolean expectedUpdateResult, Flick.Direction expectedDirection,
- int expectedSourceId) {
+ int expectedSourceId, boolean expectedPastLongPressSentTimeout) {
this.x = x;
this.y = y;
this.timestamp = timestamp;
+ this.pastLongPressSentTimeout = pastLongPressSentTimeout;
this.expectedUpdateResult = expectedUpdateResult;
this.expectedDirection = expectedDirection;
this.expectedSourceId = expectedSourceId;
+ this.expectedPastLongPressSentTimeout = expectedPastLongPressSentTimeout;
}
}
TestData[] testDataList = {
// Center
- new TestData(4, 4, 10, false, Flick.Direction.CENTER, 1),
+ new TestData(4, 4, 10, false, false, Flick.Direction.CENTER, 1, false),
// Up
- new TestData(8, -16, 20, true, Flick.Direction.UP, 3),
- new TestData(8, -32, 30, false, Flick.Direction.UP, 3),
+ new TestData(8, -16, 20, false, true, Flick.Direction.UP, 3, false),
+ new TestData(8, -32, 30, false, false, Flick.Direction.UP, 3, false),
// Left
- new TestData(-16, 8, 40, true, Flick.Direction.LEFT, 2),
- new TestData(-32, 8, 50, false, Flick.Direction.LEFT, 2),
+ new TestData(-16, 8, 40, false, true, Flick.Direction.LEFT, 2, false),
+ new TestData(-32, 8, 50, false, false, Flick.Direction.LEFT, 2, false),
// Down
- new TestData(8, 32, 60, true, Flick.Direction.DOWN, 5),
- new TestData(8, 48, 70, false, Flick.Direction.DOWN, 5),
+ new TestData(8, 32, 60, true, true, Flick.Direction.DOWN, 5, false),
+ new TestData(8, 48, 70, true, false, Flick.Direction.DOWN, 5, true),
// Right
- new TestData(32, 8, 80, true, Flick.Direction.RIGHT, 4),
- new TestData(48, 8, 90, false, Flick.Direction.RIGHT, 4),
+ new TestData(32, 8, 80, true, true, Flick.Direction.RIGHT, 4, false),
+ new TestData(48, 8, 90, true, false, Flick.Direction.RIGHT, 4, true),
// Back to center
- new TestData(8, 8, 100, true, Flick.Direction.CENTER, 1),
- new TestData(4, 4, 110, false, Flick.Direction.CENTER, 1),
+ new TestData(8, 8, 100, true, true, Flick.Direction.CENTER, 1, false),
+ new TestData(4, 4, 110, true, false, Flick.Direction.CENTER, 1, true),
};
for (TestData testData : testDataList) {
+ keyEventContext.pastLongPressSentTimeout = testData.pastLongPressSentTimeout;
assertEquals(testData.expectedUpdateResult,
keyEventContext.update(testData.x, testData.y,
TouchAction.TOUCH_MOVE, testData.timestamp));
assertEquals(testData.expectedDirection, keyEventContext.flickDirection);
+ assertEquals(testData.expectedPastLongPressSentTimeout,
+ keyEventContext.pastLongPressSentTimeout);
assertEquals(
TouchEvent.newBuilder()
.setSourceId(testData.expectedSourceId)
@@ -393,7 +478,7 @@
.addStroke(KeyEventContext.createTouchPosition(
TouchAction.TOUCH_MOVE, testData.x, testData.y, 64, 64, testData.timestamp))
.build(),
- keyEventContext.getTouchEvent());
+ keyEventContext.getTouchEvent().get());
}
// Release the key.
@@ -404,19 +489,20 @@
.addStroke(KeyEventContext.createTouchPosition(TouchAction.TOUCH_DOWN, 8, 8, 64, 64, 0))
.addStroke(KeyEventContext.createTouchPosition(TouchAction.TOUCH_UP, 4, 4, 64, 64, 120))
.build();
- assertEquals(expectedEvent, keyEventContext.getTouchEvent());
+ assertEquals(expectedEvent, keyEventContext.getTouchEvent().get());
}
@SmallTest
public void testUpdateNonFlickable() {
- KeyEntity keyEntity = new KeyEntity(256, 'a', 'A', 0, null, false, null);
+ KeyEntity keyEntity = createKeyEntity(256, 'a', 'A');
KeyState keyState = new KeyState(
"",
Collections.<MetaState>emptySet(),
Collections.<MetaState>emptySet(),
Collections.<MetaState>emptySet(),
Collections.singletonList(new Flick(Flick.Direction.CENTER, keyEntity)));
- Key key = new Key(0, 0, 10, 10, 0, 0, false, false, false, Stick.EVEN,
+ Key key = new Key(0, 0, 10, 10, 0, 0, false, false, Stick.EVEN,
+ DrawableType.TWELVEKEYS_REGULAR_KEY_BACKGROUND,
Collections.singletonList(keyState));
// For unflickable keys, moving inside the key's region is NOT a flick action
@@ -438,6 +524,6 @@
assertTrue(keyEventContext.update(-10, 5, TouchAction.TOUCH_MOVE, 40));
assertEquals(Flick.Direction.LEFT, keyEventContext.flickDirection);
- assertNull(keyEventContext.getTouchEvent());
+ assertFalse(keyEventContext.getTouchEvent().isPresent());
}
}
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/keyboard/KeyEventHandlerTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/keyboard/KeyEventHandlerTest.java
index c5365fc..cfda1dd 100644
--- a/src/android/tests/src/com/google/android/inputmethod/japanese/keyboard/KeyEventHandlerTest.java
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/keyboard/KeyEventHandlerTest.java
@@ -29,12 +29,14 @@
package org.mozc.android.inputmethod.japanese.keyboard;
+import org.mozc.android.inputmethod.japanese.keyboard.BackgroundDrawableFactory.DrawableType;
import org.mozc.android.inputmethod.japanese.keyboard.Flick.Direction;
import org.mozc.android.inputmethod.japanese.keyboard.Key.Stick;
import org.mozc.android.inputmethod.japanese.keyboard.KeyState.MetaState;
import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Input.TouchAction;
import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Input.TouchEvent;
import org.mozc.android.inputmethod.japanese.testing.InstrumentationTestCaseWithMock;
+import com.google.common.base.Optional;
import android.os.Handler;
import android.os.Looper;
@@ -46,8 +48,11 @@
/**
*/
public class KeyEventHandlerTest extends InstrumentationTestCaseWithMock {
+
private static Key createDummyKey(int keyCode, int longPressKeyCode, boolean isRepeatable) {
- KeyEntity keyEntity = new KeyEntity(1, keyCode, longPressKeyCode, 0, null, false, null);
+ KeyEntity keyEntity = new KeyEntity(
+ 1, keyCode, longPressKeyCode, true, 0,
+ Optional.<String>absent(), false, Optional.<PopUp>absent(), 0, 0, 0, 0);
Flick flick = new Flick(Direction.CENTER, keyEntity);
KeyState keyState =
new KeyState("",
@@ -55,7 +60,8 @@
Collections.<MetaState>emptySet(),
Collections.<MetaState>emptySet(),
Collections.singletonList(flick));
- return new Key(0, 0, 0, 0, 0, 0, isRepeatable, false, false, Stick.EVEN,
+ return new Key(0, 0, 0, 0, 0, 0, isRepeatable, false, Stick.EVEN,
+ DrawableType.TWELVEKEYS_REGULAR_KEY_BACKGROUND,
Collections.singletonList(keyState));
}
@@ -94,8 +100,16 @@
}
@SmallTest
- public void testHandlerMessage_longPressKey() {
+ public void testHandlerMessage_longPressKey_withoutCallback() {
KeyboardActionListener keyboardActionListener = createMock(KeyboardActionListener.class);
+ Key key = createDummyKey('a', 'A', false);
+ KeyEventContext keyEventContext = createDummyKeyEventContext(key);
+ KeyEventHandler keyEventHandler =
+ new KeyEventHandler(Looper.myLooper(), keyboardActionListener, 0, 0, 0);
+ Handler handler = keyEventHandler.handler;
+ Message message = handler.obtainMessage(
+ KeyEventHandler.LONG_PRESS_KEY, 0, 0, keyEventContext);
+
keyboardActionListener.onKey(
'A',
Collections.singletonList(TouchEvent.newBuilder()
@@ -105,18 +119,40 @@
.build()));
replayAll();
+ keyEventHandler.handleMessage(message);
+
+ verifyAll();
+ assertTrue(keyEventContext.pastLongPressSentTimeout);
+ assertFalse(handler.hasMessages(KeyEventHandler.LONG_PRESS_KEY, keyEventContext));
+ }
+
+ @SmallTest
+ public void testHandlerMessage_longPressKey_withCallback() {
+ KeyboardActionListener keyboardActionListener = createMock(KeyboardActionListener.class);
Key key = createDummyKey('a', 'A', false);
KeyEventContext keyEventContext = createDummyKeyEventContext(key);
-
KeyEventHandler keyEventHandler =
new KeyEventHandler(Looper.myLooper(), keyboardActionListener, 0, 0, 0);
Handler handler = keyEventHandler.handler;
Message message = handler.obtainMessage(
- KeyEventHandler.LONG_PRESS_KEY, 'A', 0, keyEventContext);
+ KeyEventHandler.LONG_PRESS_KEY, 0, 0, keyEventContext);
+ Runnable callback = createMock(Runnable.class);
+ keyEventContext.longPressCallback = Optional.of(callback);
+
+ keyboardActionListener.onKey(
+ 'A',
+ Collections.singletonList(TouchEvent.newBuilder()
+ .setSourceId(1)
+ .addStroke(KeyEventContext.createTouchPosition(
+ TouchAction.TOUCH_DOWN, 0, 0, 100, 60, 0))
+ .build()));
+ callback.run();
+ replayAll();
+
keyEventHandler.handleMessage(message);
verifyAll();
- assertTrue(keyEventContext.longPressSent);
+ assertTrue(keyEventContext.pastLongPressSentTimeout);
assertFalse(handler.hasMessages(KeyEventHandler.LONG_PRESS_KEY, keyEventContext));
}
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/keyboard/KeyTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/keyboard/KeyTest.java
index 74ecc90..b39e9a7 100644
--- a/src/android/tests/src/com/google/android/inputmethod/japanese/keyboard/KeyTest.java
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/keyboard/KeyTest.java
@@ -29,6 +29,7 @@
package org.mozc.android.inputmethod.japanese.keyboard;
+import org.mozc.android.inputmethod.japanese.keyboard.BackgroundDrawableFactory.DrawableType;
import org.mozc.android.inputmethod.japanese.keyboard.Key.Stick;
import org.mozc.android.inputmethod.japanese.keyboard.KeyState.MetaState;
@@ -53,18 +54,55 @@
KeyState defaultState = new KeyState("", Collections.<MetaState>emptySet(),
Collections.<MetaState>emptySet(), Collections.<MetaState>emptySet(),
Collections.<Flick>emptySet());
+ KeyState fallbackState = new KeyState("", EnumSet.of(MetaState.FALLBACK, MetaState.COMPOSING),
+ Collections.<MetaState>emptySet(), Collections.<MetaState>emptySet(),
+ Collections.<Flick>emptySet());
EnumSet<MetaState> givenMetaStates =
EnumSet.of(MetaState.SHIFT, MetaState.CAPS_LOCK);
- Key key12 = new Key(0, 0, 0, 0, 0, 0, false, false, false, Stick.EVEN,
- Arrays.asList(defaultState, state1, state2));
+ Key default12 = new Key(0, 0, 0, 0, 0, 0, false, false, Stick.EVEN,
+ DrawableType.TWELVEKEYS_REGULAR_KEY_BACKGROUND,
+ Arrays.asList(defaultState, state1, state2));
// Both state1 and state2 are eligible to givenMetaStates but state1 is expected as
// it is registered earlier.
- assertSame(state1, key12.getKeyState(givenMetaStates).get());
+ assertSame(state1, default12.getKeyState(givenMetaStates).get());
- Key key21 = new Key(0, 0, 0, 0, 0, 0, false, false, false, Stick.EVEN,
- Arrays.asList(defaultState, state2, state1));
- assertSame(state2, key21.getKeyState(givenMetaStates).get());
+ Key default21 = new Key(0, 0, 0, 0, 0, 0, false, false, Stick.EVEN,
+ DrawableType.TWELVEKEYS_REGULAR_KEY_BACKGROUND,
+ Arrays.asList(defaultState, state2, state1));
+ assertSame(state2, default21.getKeyState(givenMetaStates).get());
+
+ Key fallback12 = new Key(0, 0, 0, 0, 0, 0, false, false, Stick.EVEN,
+ DrawableType.TWELVEKEYS_REGULAR_KEY_BACKGROUND,
+ Arrays.asList(fallbackState, state1, state2));
+ assertSame(state1, fallback12.getKeyState(givenMetaStates).get());
+ assertSame(fallbackState, fallback12.getKeyState(EnumSet.of(MetaState.GLOBE)).get());
+ assertSame(fallbackState, fallback12.getKeyState(EnumSet.of(MetaState.COMPOSING)).get());
+
+ Key fallback21 = new Key(0, 0, 0, 0, 0, 0, false, false, Stick.EVEN,
+ DrawableType.TWELVEKEYS_REGULAR_KEY_BACKGROUND,
+ Arrays.asList(fallbackState, state2, state1));
+ assertSame(state2, fallback21.getKeyState(givenMetaStates).get());
+ assertSame(fallbackState, fallback12.getKeyState(EnumSet.of(MetaState.GLOBE)).get());
+ assertSame(fallbackState, fallback12.getKeyState(EnumSet.of(MetaState.COMPOSING)).get());
+ }
+
+ public void testKey_fallbackAndDefault() {
+ KeyState defaultState = new KeyState("", Collections.<MetaState>emptySet(),
+ Collections.<MetaState>emptySet(), Collections.<MetaState>emptySet(),
+ Collections.<Flick>emptySet());
+ KeyState fallbackState = new KeyState("", EnumSet.of(MetaState.FALLBACK, MetaState.SHIFT),
+ Collections.<MetaState>emptySet(), Collections.<MetaState>emptySet(),
+ Collections.<Flick>emptySet());
+ try {
+ new Key(0, 0, 0, 0, 0, 0, false, false, Stick.EVEN,
+ DrawableType.TWELVEKEYS_REGULAR_KEY_BACKGROUND,
+ Arrays.asList(defaultState, fallbackState));
+ } catch (IllegalArgumentException e) {
+ // Expected.
+ return;
+ }
+ fail("Duplicate default/fallback keys should be denied.");
}
}
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/keyboard/KeyboardFactoryTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/keyboard/KeyboardFactoryTest.java
new file mode 100644
index 0000000..ee42924
--- /dev/null
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/keyboard/KeyboardFactoryTest.java
@@ -0,0 +1,106 @@
+// Copyright 2010-2014, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package org.mozc.android.inputmethod.japanese.keyboard;
+
+import org.mozc.android.inputmethod.japanese.keyboard.Keyboard.KeyboardSpecification;
+
+import android.content.res.Resources;
+import android.graphics.Rect;
+import android.test.InstrumentationTestCase;
+
+/**
+ */
+public class KeyboardFactoryTest extends InstrumentationTestCase {
+
+ public void testGet() {
+ Resources resources = getInstrumentation().getTargetContext().getResources();
+ // With portrait/landscape keyboard size for HVGA display;
+ Rect portrait = new Rect(0, 0, 320, 480);
+ Rect landscape = new Rect(0, 0, 480, 320);
+
+ KeyboardFactory factory = new KeyboardFactory();
+
+ // Tests for portrait ones.
+ Keyboard portraitTwelveKeyKeyboard =
+ factory.get(resources, KeyboardSpecification.TWELVE_KEY_TOGGLE_KANA, portrait.width(),
+ portrait.height());
+ assertNotNull(portraitTwelveKeyKeyboard);
+
+ Keyboard portraitQwertyKeyboard =
+ factory.get(resources, KeyboardSpecification.QWERTY_KANA, portrait.width(),
+ portrait.height());
+ assertNotNull(portraitQwertyKeyboard);
+
+ // Those instances should be different.
+ assertNotSame(portraitTwelveKeyKeyboard, portraitQwertyKeyboard);
+
+ // The same instance should be returned for same resource and specification.
+ assertSame(portraitTwelveKeyKeyboard,
+ factory.get(resources, KeyboardSpecification.TWELVE_KEY_TOGGLE_KANA,
+ portrait.width(), portrait.height()));
+ assertSame(portraitQwertyKeyboard,
+ factory.get(resources, KeyboardSpecification.QWERTY_KANA, portrait.width(),
+ portrait.height()));
+
+ // Then tests for landscape ones. The keyboards for landscape should be different from portrait
+ // ones.
+ Keyboard landscapeTwelveKeyKeyboard =
+ factory.get(resources, KeyboardSpecification.TWELVE_KEY_TOGGLE_KANA, landscape.width(),
+ landscape.height());
+ assertNotNull(landscapeTwelveKeyKeyboard);
+ assertNotSame(portraitTwelveKeyKeyboard, landscapeTwelveKeyKeyboard);
+
+ Keyboard landscapeQwertyKeyboard =
+ factory.get(resources, KeyboardSpecification.QWERTY_KANA, landscape.width(),
+ landscape.height());
+ assertNotNull(landscapeQwertyKeyboard);
+ assertNotSame(portraitQwertyKeyboard, landscapeQwertyKeyboard);
+
+ // Those instances should be different.
+ assertNotSame(landscapeTwelveKeyKeyboard, landscapeQwertyKeyboard);
+
+ // The same instance should be returned for same resource and specification.
+ assertSame(landscapeTwelveKeyKeyboard,
+ factory.get(resources, KeyboardSpecification.TWELVE_KEY_TOGGLE_KANA,
+ landscape.width(), landscape.height()));
+ assertSame(landscapeQwertyKeyboard,
+ factory.get(resources, KeyboardSpecification.QWERTY_KANA, landscape.width(),
+ landscape.height()));
+
+ // Assuming the cache is large enough, the same instance should be used for portrait even after
+ // we load ones for landscape.
+ assertSame(portraitTwelveKeyKeyboard,
+ factory.get(resources, KeyboardSpecification.TWELVE_KEY_TOGGLE_KANA,
+ portrait.width(), portrait.height()));
+ assertSame(portraitQwertyKeyboard,
+ factory.get(resources, KeyboardSpecification.QWERTY_KANA, portrait.width(),
+ portrait.height()));
+ }
+}
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/keyboard/KeyboardParserTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/keyboard/KeyboardParserTest.java
index cd33ffb..750ba2c 100644
--- a/src/android/tests/src/com/google/android/inputmethod/japanese/keyboard/KeyboardParserTest.java
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/keyboard/KeyboardParserTest.java
@@ -29,14 +29,12 @@
package org.mozc.android.inputmethod.japanese.keyboard;
-import org.mozc.android.inputmethod.japanese.keyboard.Flick.Direction;
-import org.mozc.android.inputmethod.japanese.keyboard.KeyState.MetaState;
-import org.mozc.android.inputmethod.japanese.resources.R;
+import org.mozc.android.inputmethod.japanese.keyboard.Keyboard.KeyboardSpecification;
+import org.mozc.android.inputmethod.japanese.keyboard.KeyboardParser.KeyAttributes;
+import com.google.common.base.Optional;
import android.content.res.Resources;
-import android.content.res.Resources.NotFoundException;
import android.test.InstrumentationTestCase;
-import android.test.MoreAsserts;
import android.test.suitebuilder.annotation.SmallTest;
import android.util.DisplayMetrics;
import android.util.TypedValue;
@@ -44,20 +42,13 @@
import org.xmlpull.v1.XmlPullParserException;
import java.io.IOException;
-import java.util.Collections;
+import java.util.Arrays;
+import java.util.List;
/**
*/
public class KeyboardParserTest extends InstrumentationTestCase {
- private static int getDefaultKeyCode(Keyboard keyboard, int rowIndex, int colIndex) {
- Row row = keyboard.getRowList().get(rowIndex);
- Key key = row.getKeyList().get(colIndex);
- // Expecting corresponding KeyState is always found.
- KeyState keyState = key.getKeyState(Collections.<MetaState>emptySet()).get();
- return keyState.getFlick(Flick.Direction.CENTER).getKeyEntity().getKeyCode();
- }
-
private static int intToComplex(int value) {
if (value != value << TypedValue.COMPLEX_MANTISSA_SHIFT >> TypedValue.COMPLEX_MANTISSA_SHIFT) {
throw new IllegalArgumentException("Complex doesn't support: " + value);
@@ -72,26 +63,28 @@
TypedValue value = new TypedValue();
// If the value is null, default value should be returned.
- assertEquals(10, KeyboardParser.getDimensionOrFraction(null, 500, 10, metrics));
- assertEquals(30, KeyboardParser.getDimensionOrFraction(null, 500, 30, metrics));
+ assertEquals(10, KeyboardParser.getDimensionOrFraction(
+ Optional.<TypedValue>absent(), 500, 10, metrics));
+ assertEquals(30, KeyboardParser.getDimensionOrFraction(
+ Optional.<TypedValue>absent(), 500, 30, metrics));
// If the type is dimension, the pixel should be calculated based on metrics.
value.type = TypedValue.TYPE_DIMENSION;
value.data = intToComplex(100) | (TypedValue.COMPLEX_UNIT_DIP << TypedValue.COMPLEX_UNIT_SHIFT);
metrics.density = 10;
- assertEquals(1000, KeyboardParser.getDimensionOrFraction(value, 500, 30, metrics));
+ assertEquals(1000, KeyboardParser.getDimensionOrFraction(Optional.of(value), 500, 30, metrics));
// If the type is fraction, the result is calculated based on given 'base' parameter.
value.type = TypedValue.TYPE_FRACTION;
value.data = intToComplex(10) |
(TypedValue.COMPLEX_UNIT_FRACTION << TypedValue.COMPLEX_UNIT_SHIFT);
- assertEquals(5000, KeyboardParser.getDimensionOrFraction(value, 500, 30, metrics));
+ assertEquals(5000, KeyboardParser.getDimensionOrFraction(Optional.of(value), 500, 30, metrics));
// Otherwise exception should be thrown.
value.type = TypedValue.TYPE_STRING;
value.data = 0;
try {
- KeyboardParser.getDimensionOrFraction(value, 500, 30, metrics);
+ KeyboardParser.getDimensionOrFraction(Optional.of(value), 500, 30, metrics);
fail("IllegalArgumentException is expected.");
} catch (IllegalArgumentException e) {
// Pass.
@@ -102,28 +95,28 @@
public void testGetCode() {
TypedValue value = new TypedValue();
- // If the value is null, default value should be returned.
- assertEquals(10, KeyboardParser.getCode(null, 10));
- assertEquals(0x61, KeyboardParser.getCode(null, 0x61));
+ // If the value is Optional.absent(), default value should be returned.
+ assertEquals(10, KeyboardParser.getCode(Optional.<TypedValue>absent(), 10));
+ assertEquals(0x61, KeyboardParser.getCode(Optional.<TypedValue>absent(), 0x61));
// If the value is decimal or hexadecimal integer, the value should be returned.
value.type = TypedValue.TYPE_INT_DEC;
value.data = 30;
- assertEquals(30, KeyboardParser.getCode(value, 10));
+ assertEquals(30, KeyboardParser.getCode(Optional.of(value), 10));
value.type = TypedValue.TYPE_INT_HEX;
value.data = 30;
- assertEquals(30, KeyboardParser.getCode(value, 10));
+ assertEquals(30, KeyboardParser.getCode(Optional.of(value), 10));
// If type is string, the whole string will be parsed.
value.type = TypedValue.TYPE_STRING;
value.data = 0;
value.string = "12345";
- assertEquals(12345, KeyboardParser.getCode(value, 10));
+ assertEquals(12345, KeyboardParser.getCode(Optional.of(value), 10));
value.string = "123asd";
try {
- KeyboardParser.getCode(value, 10);
+ KeyboardParser.getCode(Optional.of(value), 10);
fail("An exception is expected.");
} catch (NumberFormatException e) {
// pass
@@ -131,138 +124,96 @@
}
@SmallTest
- public void testToStringOrNull() {
- // Null should be returned when null is a given argument.
- assertNull(KeyboardParser.toStringOrNull(null));
-
- // Otherwise, the toString'ed value is returned.
- assertEquals("abcde", KeyboardParser.toStringOrNull("abcde"));
- }
-
- @SmallTest
- public void testParseKeyboard()
- throws NotFoundException, XmlPullParserException, IOException {
- Resources resources = getInstrumentation().getTargetContext().getResources();
- int keyboardWidth = 480;
- int keyboardHeight = 200;
- // Adding a mock resource on testing package causes a compile error for now,
- // So, we'll use product resource for testing purpose.
- // TODO(hidehiko): Figure out how to create a mock resource and replace this by it.
- KeyboardParser parser = new KeyboardParser(
- resources, resources.getXml(R.xml.kbd_12keys_flick_kana), keyboardWidth, keyboardHeight);
-
- // Note: put test XML file under tests/res directory doesn't work,
- // so, instead, read actual 12keys keyboard layout and check its properties.
- Keyboard keyboard = parser.parseKeyboard();
-
- // Make sure (x,y)-coords are expectedly annotated.
- {
- int y = 0;
- for (Row row : keyboard.getRowList()) {
- int x = 0;
- for (Key key : row.getKeyList()) {
- assertEquals(x, key.getX());
- assertEquals(y, key.getY());
- x += key.getWidth();
- }
- y += row.getHeight() + row.getVerticalGap();
- }
- }
-
- // The keyboard should have 5 rows, and each row should contain 5 keys.
- // The top row is a dummy row in order to make a space at top of the keyboard.
- // We'll skip it in the assertions below.
- assertEquals(5, keyboard.getRowList().size());
- for (Row row : keyboard.getRowList().subList(1, 5)) {
- assertEquals(5, row.getKeyList().size());
- }
-
- // Make sure main 12 keys' keycodes.
- assertEquals('1', getDefaultKeyCode(keyboard, 1, 1));
- assertEquals('2', getDefaultKeyCode(keyboard, 1, 2));
- assertEquals('3', getDefaultKeyCode(keyboard, 1, 3));
-
- assertEquals('4', getDefaultKeyCode(keyboard, 2, 1));
- assertEquals('5', getDefaultKeyCode(keyboard, 2, 2));
- assertEquals('6', getDefaultKeyCode(keyboard, 2, 3));
-
- assertEquals('7', getDefaultKeyCode(keyboard, 3, 1));
- assertEquals('8', getDefaultKeyCode(keyboard, 3, 2));
- assertEquals('9', getDefaultKeyCode(keyboard, 3, 3));
-
- assertEquals('*', getDefaultKeyCode(keyboard, 4, 1));
- assertEquals('0', getDefaultKeyCode(keyboard, 4, 2));
- assertEquals('#', getDefaultKeyCode(keyboard, 4, 3));
-
- // A key to change keyboard-layout should have longPressKeycode.
- MoreAsserts.assertNotEqual(
- KeyEntity.INVALID_KEY_CODE,
- keyboard.getRowList().get(4).getKeyList().get(0)
- .getKeyState(Collections.<MetaState>emptySet()).get()
- .getFlick(Flick.Direction.CENTER).getKeyEntity().getLongPressKeyCode());
-
- // Heights of rows are inherited from Keyboard element.
- for (Row row : keyboard.getRowList().subList(1, 5)) {
- assertTrue(row.getHeight() > 0);
- }
-
- // Following hard-coded parameters come from kbd_12keys_flick_kana.xml.
- // TODO(hidehiko): Use a layout resource only for testing purpose, or create a mock xml data.
- int keyWidth = (int) Math.round(keyboardWidth * 21.8 / 100);
- int functionKeyWidth = (int) Math.round(keyboardWidth * 17.3 / 100);
-
- // Width of keys are inherited from Keyboard element, but can be overwritten.
- for (Row row : keyboard.getRowList().subList(1, 5)) {
- // Left/Right side key.
- assertEquals(functionKeyWidth, row.getKeyList().get(0).getWidth());
- assertEquals(functionKeyWidth, row.getKeyList().get(4).getWidth());
-
- // Other keys.
- assertEquals(keyWidth, row.getKeyList().get(1).getWidth());
- assertEquals(keyWidth, row.getKeyList().get(2).getWidth());
- assertEquals(keyWidth, row.getKeyList().get(3).getWidth());
- }
-
- // All right side keys (except for space key) have isRepeatable attribute.
- for (Row row : keyboard.getRowList().subList(1, 5)) {
- Key key = row.getKeyList().get(4);
- boolean isSpace = key.getKeyState(Collections.<MetaState>emptySet()).get()
- .getFlick(Direction.CENTER).getKeyEntity().getKeyCode() == ' ';
- assertEquals(!isSpace, key.isRepeatable());
- }
-
- // All keys should have popup.
- for (Row row : keyboard.getRowList().subList(1, 5)) {
- for (Key key : row.getKeyList()) {
- Flick flick = key.getKeyState(Collections.<MetaState>emptySet()).get()
- .getFlick(Flick.Direction.CENTER);
- assertNotNull(flick.getKeyEntity().getPopUp());
- }
- }
- }
-
- @SmallTest
public void testKeyboardParserBlackBoxTest() throws XmlPullParserException, IOException {
// Just in order to test all keyboard xml files can be parsed without exception,
// we'll try to just parse them.
// TODO(hidehiko): Move this test to somewhere, when we support regression test framework
// for MechaMozc.
- int[] resourceIds = {
- R.xml.kbd_12keys_kana,
- R.xml.kbd_12keys_flick_kana,
- R.xml.kbd_12keys_abc,
- R.xml.kbd_12keys_123,
- R.xml.kbd_12keys_qwerty_abc,
- R.xml.kbd_qwerty_kana,
- R.xml.kbd_qwerty_kana_123,
- R.xml.kbd_qwerty_abc,
- R.xml.kbd_qwerty_abc_123,
- };
-
Resources resources = getInstrumentation().getTargetContext().getResources();
- for (int resourceId : resourceIds) {
- KeyboardParser parser = new KeyboardParser(resources, resources.getXml(resourceId), 480, 200);
+ for (KeyboardSpecification specification : KeyboardSpecification.values()) {
+ if (specification.getXmlLayoutResourceId() == 0) {
+ continue;
+ }
+ KeyboardParser parser = new KeyboardParser(resources, 480, 200, specification);
assertNotNull(parser.parseKeyboard());
}
}
+
+ @SmallTest
+ public void testBuildKeyList_simpleCase() {
+ List<Key> keys = KeyboardParser.buildKeyList(Arrays.asList(
+ KeyAttributes.newBuilder().setWidth(50).build(),
+ KeyAttributes.newBuilder().setHorizontalLayoutWeight(4).build(),
+ KeyAttributes.newBuilder().setHorizontalLayoutWeight(1).build()),
+ 0, 100);
+ assertEquals(0, keys.get(0).getX());
+ assertEquals(50, keys.get(0).getWidth());
+ assertEquals(50, keys.get(1).getX());
+ assertEquals(40, keys.get(1).getWidth());
+ assertEquals(90, keys.get(2).getX());
+ assertEquals(10, keys.get(2).getWidth());
+ }
+
+ @SmallTest
+ public void testBuildKeyList_widthAndWeight1() {
+ List<Key> keys = KeyboardParser.buildKeyList(Arrays.asList(
+ KeyAttributes.newBuilder().setWidth(50).build(),
+ KeyAttributes.newBuilder().setWidth(10).setHorizontalLayoutWeight(2).build(),
+ KeyAttributes.newBuilder().setWidth(10).setHorizontalLayoutWeight(1).build()),
+ 0, 100);
+ assertEquals(0, keys.get(0).getX());
+ assertEquals(50, keys.get(0).getWidth());
+ assertEquals(50, keys.get(1).getX());
+ assertEquals(30, keys.get(1).getWidth());
+ assertEquals(80, keys.get(2).getX());
+ assertEquals(20, keys.get(2).getWidth());
+ }
+
+ @SmallTest
+ public void testBuildKeyList_widthAndWeight2() {
+ List<Key> keys = KeyboardParser.buildKeyList(Arrays.asList(
+ KeyAttributes.newBuilder().setWidth(10).setHorizontalLayoutWeight(1).build(),
+ KeyAttributes.newBuilder().setWidth(50).build(),
+ KeyAttributes.newBuilder().setWidth(10).setHorizontalLayoutWeight(2).build()),
+ 0, 100);
+ assertEquals(0, keys.get(0).getX());
+ assertEquals(20, keys.get(0).getWidth());
+ assertEquals(20, keys.get(1).getX());
+ assertEquals(50, keys.get(1).getWidth());
+ assertEquals(70, keys.get(2).getX());
+ assertEquals(30, keys.get(2).getWidth());
+ }
+
+ @SmallTest
+ public void testBuildKeyList_widthAndWeight3() {
+ List<Key> keys = KeyboardParser.buildKeyList(Arrays.asList(
+ KeyAttributes.newBuilder().setWidth(10).setHorizontalLayoutWeight(1).build(),
+ KeyAttributes.newBuilder().setWidth(10).setHorizontalLayoutWeight(2).build(),
+ KeyAttributes.newBuilder().setWidth(50).build()),
+ 0, 100);
+ assertEquals(0, keys.get(0).getX());
+ assertEquals(20, keys.get(0).getWidth());
+ assertEquals(20, keys.get(1).getX());
+ assertEquals(30, keys.get(1).getWidth());
+ assertEquals(50, keys.get(2).getX());
+ assertEquals(50, keys.get(2).getWidth());
+ }
+
+ @SmallTest
+ public void testBuildKeyList_widthAndWeight4() {
+ List<Key> keys = KeyboardParser.buildKeyList(Arrays.asList(
+ KeyAttributes.newBuilder().setWidth(20).build(),
+ KeyAttributes.newBuilder().setHorizontalLayoutWeight(1).build(),
+ KeyAttributes.newBuilder().setHorizontalLayoutWeight(1).build(),
+ KeyAttributes.newBuilder().setHorizontalLayoutWeight(1).build()),
+ 0, 100);
+ assertEquals(0, keys.get(0).getX());
+ assertEquals(20, keys.get(0).getWidth());
+ assertEquals(20, keys.get(1).getX());
+ assertEquals(27, keys.get(1).getWidth());
+ assertEquals(47, keys.get(2).getX());
+ assertEquals(26, keys.get(2).getWidth());
+ assertEquals(73, keys.get(3).getX());
+ assertEquals(27, keys.get(3).getWidth());
+ }
}
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/keyboard/KeyboardTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/keyboard/KeyboardTest.java
new file mode 100644
index 0000000..0faf27a
--- /dev/null
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/keyboard/KeyboardTest.java
@@ -0,0 +1,124 @@
+// Copyright 2010-2014, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package org.mozc.android.inputmethod.japanese.keyboard;
+
+import org.mozc.android.inputmethod.japanese.KeyboardSpecificationName;
+import org.mozc.android.inputmethod.japanese.keyboard.Keyboard.KeyboardSpecification;
+import org.mozc.android.inputmethod.japanese.resources.R;
+import com.google.common.base.Optional;
+
+import android.app.Instrumentation;
+import android.content.res.Configuration;
+import android.content.res.Resources;
+import android.content.res.Resources.NotFoundException;
+import android.test.InstrumentationTestCase;
+import android.test.suitebuilder.annotation.SmallTest;
+
+import org.xmlpull.v1.XmlPullParserException;
+
+import java.io.IOException;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+
+/**
+ * Test for {@code Keyboard}.
+ */
+public class KeyboardTest extends InstrumentationTestCase {
+
+ public static Keyboard createKeyboard(KeyboardSpecification spec,
+ Instrumentation instrumentation) {
+ Resources resources = instrumentation.getTargetContext().getResources();
+ KeyboardParser parser = new KeyboardParser(resources, 480, 200, spec);
+ try {
+ return parser.parseKeyboard();
+ } catch (NotFoundException e) {
+ fail(e.getMessage());
+ } catch (XmlPullParserException e) {
+ fail(e.getMessage());
+ } catch (IOException e) {
+ fail(e.getMessage());
+ }
+
+ throw new AssertionError("Should never reach here");
+ }
+
+ @SmallTest
+ public void testConstructor() {
+ for (KeyboardSpecification specification : KeyboardSpecification.values()) {
+ // when ResourceId is 0, it means this specification has no Keyboard
+ if (specification.getXmlLayoutResourceId() == 0) {
+ continue;
+ }
+ // Make sure that all specification has corresponding JapaneseKeyboard instance,
+ // and it has the given specification.
+ Keyboard keyboard = createKeyboard(specification, getInstrumentation());
+ assertEquals(specification.toString(), specification,
+ keyboard.getSpecification());
+ }
+ }
+
+ @SmallTest
+ public void testGetKeyboardName() {
+ Pattern pattern = Pattern.compile("^(\\w+)-(\\d+)\\.(\\d+)\\.(\\d+)-(\\w+)$");
+ Configuration configuration = new Configuration();
+ for (KeyboardSpecification specification : KeyboardSpecification.values()) {
+ for (int orientation : new int[] {Configuration.ORIENTATION_PORTRAIT,
+ Configuration.ORIENTATION_LANDSCAPE}) {
+ configuration.orientation = orientation;
+ KeyboardSpecificationName keyboardSpecificationName =
+ specification.getKeyboardSpecificationName();
+ String name = keyboardSpecificationName.formattedKeyboardName(configuration);
+ Matcher matcher = pattern.matcher(name);
+ assertTrue(matcher.matches());
+ assertEquals(keyboardSpecificationName.baseName, matcher.group(1));
+ assertEquals(Integer.toString(keyboardSpecificationName.major), matcher.group(2));
+ assertEquals(Integer.toString(keyboardSpecificationName.minor), matcher.group(3));
+ assertEquals(Integer.toString(keyboardSpecificationName.revision), matcher.group(4));
+ assertEquals(KeyboardSpecificationName.getDeviceOrientationString(configuration),
+ matcher.group(5));
+ }
+ }
+ }
+
+ @SmallTest
+ public void testGetKeycodeMapper() {
+ ProbableKeyEventGuesser guesser = new ProbableKeyEventGuesser(
+ getInstrumentation().getTargetContext().getAssets());
+ Configuration configuration = new Configuration();
+ configuration.orientation = Configuration.ORIENTATION_LANDSCAPE;
+ guesser.setConfiguration(Optional.of(configuration));
+ Resources resources = getInstrumentation().getTargetContext().getResources();
+
+ Keyboard godanKana = createKeyboard(KeyboardSpecification.GODAN_KANA, getInstrumentation());
+ assertEquals(resources.getInteger(R.integer.uchar_digit_two), godanKana.getKeyCode(10));
+ assertEquals(Integer.MIN_VALUE, godanKana.getKeyCode(123456)); // No corresponding key
+ }
+}
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/keyboard/KeyboardViewBackgroundSurfaceTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/keyboard/KeyboardViewBackgroundSurfaceTest.java
index af883dc..aaa63fd 100644
--- a/src/android/tests/src/com/google/android/inputmethod/japanese/keyboard/KeyboardViewBackgroundSurfaceTest.java
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/keyboard/KeyboardViewBackgroundSurfaceTest.java
@@ -35,55 +35,75 @@
import org.mozc.android.inputmethod.japanese.keyboard.Flick.Direction;
import org.mozc.android.inputmethod.japanese.keyboard.Key.Stick;
import org.mozc.android.inputmethod.japanese.keyboard.KeyState.MetaState;
+import org.mozc.android.inputmethod.japanese.keyboard.Keyboard.KeyboardSpecification;
import org.mozc.android.inputmethod.japanese.keyboard.KeyboardViewBackgroundSurface.SurfaceCanvas;
import org.mozc.android.inputmethod.japanese.testing.InstrumentationTestCaseWithMock;
+import org.mozc.android.inputmethod.japanese.testing.MockResourcesWithDisplayMetrics;
import org.mozc.android.inputmethod.japanese.view.DrawableCache;
-import org.mozc.android.inputmethod.japanese.view.MozcDrawableFactory;
import com.google.common.base.Optional;
+import android.content.res.Resources;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.test.MoreAsserts;
-import android.test.mock.MockResources;
import android.test.suitebuilder.annotation.MediumTest;
import android.test.suitebuilder.annotation.SmallTest;
import org.easymock.IMocksControl;
import java.util.Arrays;
+import java.util.Collection;
import java.util.Collections;
import java.util.EnumSet;
+import java.util.Set;
/**
*/
public class KeyboardViewBackgroundSurfaceTest extends InstrumentationTestCaseWithMock {
+
private static final int WIDTH = 50;
private static final int HEIGHT = 30;
private static final int HORIZONTAL_GAP = 4;
private DrawableCache createDrawableCacheMock() {
return createMockBuilder(DrawableCache.class)
- .withConstructor(MozcDrawableFactory.class)
- .withArgs(new MozcDrawableFactory(new MockResources()))
+ .withConstructor(Resources.class)
+ .withArgs(new MockResourcesWithDisplayMetrics())
.createMock();
}
private static Key createDummyKey(int x, int y, int iconResourceId, DrawableType drawableType) {
KeyEntity keyEntity = new KeyEntity(
- 1, 'a', KeyEntity.INVALID_KEY_CODE, iconResourceId, drawableType, false, null);
+ 1, 'a', KeyEntity.INVALID_KEY_CODE, true, iconResourceId, Optional.<String>absent(),
+ false, Optional.<PopUp>absent(), 0, 0, Integer.MAX_VALUE, Integer.MAX_VALUE);
Flick centerFlick = new Flick(Direction.CENTER, keyEntity);
KeyState keyState = new KeyState("",
Collections.<MetaState>emptySet(),
Collections.<MetaState>emptySet(),
Collections.<MetaState>emptySet(),
Collections.singletonList(centerFlick));
- return new Key(x, y, WIDTH, HEIGHT, HORIZONTAL_GAP, 0, false, false, false,
- Stick.EVEN, Collections.singletonList(keyState));
+ return new Key(x, y, WIDTH, HEIGHT, HORIZONTAL_GAP, 0, false, false,
+ Stick.EVEN, drawableType, Collections.singletonList(keyState));
+ }
+
+ private static KeyEntity createInvalidKeyEntity(
+ int sourceId, int keyCode, int keyIconResourceId) {
+ return new KeyEntity(
+ sourceId, keyCode, KeyEntity.INVALID_KEY_CODE, true, keyIconResourceId,
+ Optional.<String>absent(), false, Optional.<PopUp>absent(),
+ 0, 0, Integer.MAX_VALUE, Integer.MAX_VALUE);
+ }
+
+ private static KeyEntity createInvalidKeyEntity() {
+ return createInvalidKeyEntity(1, 'a', 0);
}
@SmallTest
public void testInitialize() {
- KeyboardViewBackgroundSurface surface = new KeyboardViewBackgroundSurface(null, null);
+ Resources resources = createNiceMock(MockResourcesWithDisplayMetrics.class);
+ KeyboardViewBackgroundSurface surface = new KeyboardViewBackgroundSurface(
+ new BackgroundDrawableFactory(resources),
+ new DrawableCache(resources));
// If the surface is an instance constructed right now, initialization is needed later.
surface.requestUpdateSize(100, 100);
@@ -106,17 +126,14 @@
@SmallTest
public void testGetKeyEntityForRendering() {
- KeyEntity centerEntity =
- new KeyEntity(1, 'a', KeyEntity.INVALID_KEY_CODE, 0,
- DrawableType.TWELVEKEYS_REGULAR_KEY_BACKGROUND, false, null);
- KeyEntity leftEntity =
- new KeyEntity(2, 'b', KeyEntity.INVALID_KEY_CODE, 0,
- DrawableType.TWELVEKEYS_REGULAR_KEY_BACKGROUND, false, null);
+ KeyEntity centerEntity = createInvalidKeyEntity(1, 'a', 0);
+ KeyEntity leftEntity = createInvalidKeyEntity(2, 'b', 0);
Flick centerFlick = new Flick(Direction.CENTER, centerEntity);
Flick leftFlick = new Flick(Direction.LEFT, leftEntity);
Key key = new Key(
- 0, 0, WIDTH, HEIGHT, HORIZONTAL_GAP, 0, false, false, false, Stick.EVEN,
+ 0, 0, WIDTH, HEIGHT, HORIZONTAL_GAP, 0, false, false, Stick.EVEN,
+ DrawableType.TWELVEKEYS_REGULAR_KEY_BACKGROUND,
Collections.singletonList(
new KeyState("",
Collections.<MetaState>emptySet(),
@@ -128,84 +145,72 @@
assertSame(
centerEntity,
KeyboardViewBackgroundSurface.getKeyEntityForRendering(
- key, Collections.<MetaState>emptySet(), null));
+ key, Collections.<MetaState>emptySet(), Optional.<Direction>absent()).get());
// If this is the pressed key without flick, the center key entity should be returned.
assertSame(
centerEntity,
KeyboardViewBackgroundSurface.getKeyEntityForRendering(
- key, Collections.<MetaState>emptySet(), Direction.CENTER));
+ key, Collections.<MetaState>emptySet(), Optional.of(Direction.CENTER)).get());
// If the flick state is set to the pressedKey, it should be returned.
assertSame(
leftEntity,
KeyboardViewBackgroundSurface.getKeyEntityForRendering(
- key, Collections.<MetaState>emptySet(), Direction.LEFT));
+ key, Collections.<MetaState>emptySet(), Optional.of(Direction.LEFT)).get());
// If the key doesn't have a KeyEntity for the current state, the default key entity
// should be returned.
assertSame(
centerEntity,
KeyboardViewBackgroundSurface.getKeyEntityForRendering(
- key, EnumSet.of(MetaState.CAPS_LOCK), Direction.RIGHT));
+ key, EnumSet.of(MetaState.CAPS_LOCK), Optional.of(Direction.RIGHT)).get());
assertSame(
centerEntity,
KeyboardViewBackgroundSurface.getKeyEntityForRendering(
- key, EnumSet.of(MetaState.CAPS_LOCK), null));
+ key, EnumSet.of(MetaState.CAPS_LOCK), Optional.<Direction>absent()).get());
assertSame(
centerEntity,
KeyboardViewBackgroundSurface.getKeyEntityForRendering(
- key, EnumSet.of(MetaState.CAPS_LOCK), Direction.CENTER));
- }
-
- @SmallTest
- public void testGetKeyBackground_withoutBackground() {
- KeyboardViewBackgroundSurface surface =
- new KeyboardViewBackgroundSurface(new BackgroundDrawableFactory(1f), null);
-
- // Null should be returned for null KeyEntity.
- assertNull(surface.getKeyBackground(null, true));
- assertNull(surface.getKeyBackground(null, false));
-
- // Null should be returned for a KeyEntity without background.
- KeyEntity keyEntity = new KeyEntity(1, 'a', KeyEntity.INVALID_KEY_CODE, 0, null, false, null);
- assertNull(surface.getKeyBackground(keyEntity, true));
- assertNull(surface.getKeyBackground(keyEntity, false));
+ key, EnumSet.of(MetaState.CAPS_LOCK), Optional.of(Direction.CENTER)).get());
}
@SmallTest
public void testGetKeyBackground_withBackground() {
- BackgroundDrawableFactory factory = new BackgroundDrawableFactory(1f);
+ BackgroundDrawableFactory factory =
+ new BackgroundDrawableFactory(createNiceMock(MockResourcesWithDisplayMetrics.class));
Drawable background = factory.getDrawable(DrawableType.TWELVEKEYS_REGULAR_KEY_BACKGROUND);
replayAll();
- KeyEntity keyEntity =
- new KeyEntity(1, 'a', KeyEntity.INVALID_KEY_CODE, 0,
- DrawableType.TWELVEKEYS_REGULAR_KEY_BACKGROUND, false, null);
-
- KeyboardViewBackgroundSurface surface = new KeyboardViewBackgroundSurface(factory, null);
+ Key key = createDummyKey(0, 0, 0, DrawableType.TWELVEKEYS_REGULAR_KEY_BACKGROUND);
+ KeyboardViewBackgroundSurface surface = new KeyboardViewBackgroundSurface(
+ factory, new DrawableCache(new MockResourcesWithDisplayMetrics()));
// The icon should be returned with appropriate state.
- assertSame(background, surface.getKeyBackground(keyEntity, false));
+ assertSame(background, surface.getKeyBackground(key, false).get());
MoreAsserts.assertEquals(new int[]{}, background.getState());
- assertSame(background, surface.getKeyBackground(keyEntity, true));
+ assertSame(background, surface.getKeyBackground(key, true).get());
MoreAsserts.assertEquals(new int[]{ android.R.attr.state_pressed }, background.getState());
}
@SmallTest
public void testGetKeyIcon_withoutIcon() {
- DrawableCache drawableCache = new DrawableCache(new MozcDrawableFactory(new MockResources()));
+ DrawableCache drawableCache = new DrawableCache(new MockResourcesWithDisplayMetrics());
- // Null should be returned for null KeyEntity.
- assertNull(KeyboardViewBackgroundSurface.getKeyIcon(drawableCache, null, true));
- assertNull(KeyboardViewBackgroundSurface.getKeyIcon(drawableCache, null, false));
+ // Optional.absent() should be returned for Optional.absent() KeyEntity.
+ assertFalse(KeyboardViewBackgroundSurface.getKeyIcon(
+ drawableCache, Optional.<KeyEntity>absent(), true).isPresent());
+ assertFalse(KeyboardViewBackgroundSurface.getKeyIcon(
+ drawableCache, Optional.<KeyEntity>absent(), false).isPresent());
- // Null should be returned for a KeyEntity without icon.
- KeyEntity keyEntity = new KeyEntity(1, 'a', KeyEntity.INVALID_KEY_CODE, 0, null, false, null);
- assertNull(KeyboardViewBackgroundSurface.getKeyIcon(drawableCache, keyEntity, true));
- assertNull(KeyboardViewBackgroundSurface.getKeyIcon(drawableCache, keyEntity, false));
+ // Optional.absent() should be returned for a KeyEntity without icon.
+ KeyEntity keyEntity = createInvalidKeyEntity();
+ assertFalse(KeyboardViewBackgroundSurface.getKeyIcon(
+ drawableCache, Optional.of(keyEntity), true).isPresent());
+ assertFalse(KeyboardViewBackgroundSurface.getKeyIcon(
+ drawableCache, Optional.of(keyEntity), false).isPresent());
}
@SmallTest
@@ -215,14 +220,15 @@
DrawableCache drawableCache = createDrawableCacheMock();
expect(drawableCache.getDrawable(iconResourceId)).andStubReturn(Optional.of(icon));
replayAll();
- KeyEntity keyEntity =
- new KeyEntity(1, 'a', KeyEntity.INVALID_KEY_CODE, iconResourceId, null, false, null);
+ KeyEntity keyEntity = createInvalidKeyEntity(1, 'a', iconResourceId);
// The icon should be returned with appropriate state.
- assertSame(icon, KeyboardViewBackgroundSurface.getKeyIcon(drawableCache, keyEntity, false));
+ assertSame(icon, KeyboardViewBackgroundSurface.getKeyIcon(
+ drawableCache, Optional.of(keyEntity), false).get());
MoreAsserts.assertEquals(new int[]{}, icon.getState());
- assertSame(icon, KeyboardViewBackgroundSurface.getKeyIcon(drawableCache, keyEntity, true));
+ assertSame(icon, KeyboardViewBackgroundSurface.getKeyIcon(
+ drawableCache, Optional.of(keyEntity), true).get());
MoreAsserts.assertEquals(new int[]{ android.R.attr.state_pressed }, icon.getState());
}
@@ -230,8 +236,8 @@
public void testSenarioTest() {
IMocksControl drawableCacheControl = createControl();
DrawableCache drawableCache = createMockBuilder(DrawableCache.class)
- .withConstructor(MozcDrawableFactory.class)
- .withArgs(new MozcDrawableFactory(new MockResources()))
+ .withConstructor(Resources.class)
+ .withArgs(new MockResourcesWithDisplayMetrics())
.createMock(drawableCacheControl);
Drawable icon1 = new ColorDrawable();
@@ -274,21 +280,18 @@
Drawable leftIcon7 = new ColorDrawable();
int icon7ResourceId = 13;
int leftIcon7ResourceId = 15;
- Flick centerFlick7 = new Flick(
- Direction.CENTER,
- new KeyEntity(1, 'a', KeyEntity.INVALID_KEY_CODE, icon7ResourceId,
- DrawableType.TWELVEKEYS_REGULAR_KEY_BACKGROUND, false, null));
- Flick leftFlick7 = new Flick(
- Direction.LEFT,
- new KeyEntity(2, 'a', KeyEntity.INVALID_KEY_CODE, leftIcon7ResourceId,
- DrawableType.TWELVEKEYS_REGULAR_KEY_BACKGROUND, false, null));
+ Flick centerFlick7 =
+ new Flick(Direction.CENTER, createInvalidKeyEntity(1, 'a', icon7ResourceId));
+ Flick leftFlick7 =
+ new Flick(Direction.LEFT, createInvalidKeyEntity(2, 'a', leftIcon7ResourceId));
KeyState keyState = new KeyState("",
Collections.<MetaState>emptySet(),
Collections.<MetaState>emptySet(),
Collections.<MetaState>emptySet(),
Arrays.asList(centerFlick7, leftFlick7));
- Key key7 = new Key(0, HEIGHT * 2, WIDTH, HEIGHT, HORIZONTAL_GAP, 0, false, false, false,
- Stick.EVEN, Collections.singletonList(keyState));
+ Key key7 = new Key(0, HEIGHT * 2, WIDTH, HEIGHT, HORIZONTAL_GAP, 0, false, false,
+ Stick.EVEN, DrawableType.TWELVEKEYS_REGULAR_KEY_BACKGROUND,
+ Collections.singletonList(keyState));
expect(drawableCache.getDrawable(icon7ResourceId)).andStubReturn(Optional.of(icon7));
expect(drawableCache.getDrawable(leftIcon7ResourceId)).andStubReturn(Optional.of(leftIcon7));
@@ -311,7 +314,8 @@
new Row(Arrays.asList(key1, key2, key3), HEIGHT, 0),
new Row(Arrays.asList(key4, key5, key6), HEIGHT, 0),
new Row(Arrays.asList(key7, key8, key9), HEIGHT, 0)),
- 1);
+ 1,
+ KeyboardSpecification.TWELVE_KEY_TOGGLE_FLICK_KANA);
IMocksControl canvasControl = createControl();
final SurfaceCanvas canvas = canvasControl.createMock(SurfaceCanvas.class);
@@ -320,7 +324,8 @@
int expectedKeyWidth = WIDTH - HORIZONTAL_GAP;
int expectedKeyHeight = HEIGHT;
- BackgroundDrawableFactory factory = new BackgroundDrawableFactory(1f);
+ BackgroundDrawableFactory factory =
+ new BackgroundDrawableFactory(createNiceMock(MockResourcesWithDisplayMetrics.class));
Drawable background = factory.getDrawable(DrawableType.TWELVEKEYS_REGULAR_KEY_BACKGROUND);
// The first case is just a simple senario, just setting a new keyboard.
@@ -362,7 +367,7 @@
@Override
void initialize() {
super.initialize();
- this.surfaceCanvas = canvas;
+ this.surfaceCanvas = Optional.of(canvas);
}
};
@@ -385,8 +390,8 @@
leftIcon7, 2, HEIGHT * 2, expectedKeyWidth, expectedKeyHeight);
canvasControl.replay();
- surface.requestUpdateKey(key5, Direction.CENTER);
- surface.requestUpdateKey(key7, Direction.LEFT);
+ surface.requestUpdateKey(key5, Optional.of(Direction.CENTER));
+ surface.requestUpdateKey(key7, Optional.of(Direction.LEFT));
surface.update();
canvasControl.verify();
@@ -405,18 +410,18 @@
canvasControl.replay();
- surface.requestUpdateKey(key8, Direction.CENTER);
- surface.requestUpdateKey(key8, Direction.LEFT);
- surface.requestUpdateKey(key8, Direction.RIGHT);
- surface.requestUpdateKey(key8, Direction.CENTER);
- surface.requestUpdateKey(key8, Direction.UP);
- surface.requestUpdateKey(key8, Direction.DOWN);
- surface.requestUpdateKey(key8, null);
+ surface.requestUpdateKey(key8, Optional.of(Direction.CENTER));
+ surface.requestUpdateKey(key8, Optional.of(Direction.LEFT));
+ surface.requestUpdateKey(key8, Optional.of(Direction.RIGHT));
+ surface.requestUpdateKey(key8, Optional.of(Direction.CENTER));
+ surface.requestUpdateKey(key8, Optional.of(Direction.UP));
+ surface.requestUpdateKey(key8, Optional.of(Direction.DOWN));
+ surface.requestUpdateKey(key8, Optional.<Direction>absent());
- surface.requestUpdateKey(key1, Direction.CENTER);
- surface.requestUpdateKey(key1, Direction.UP);
- surface.requestUpdateKey(key1, Direction.DOWN);
- surface.requestUpdateKey(key1, Direction.CENTER);
+ surface.requestUpdateKey(key1, Optional.of(Direction.CENTER));
+ surface.requestUpdateKey(key1, Optional.of(Direction.UP));
+ surface.requestUpdateKey(key1, Optional.of(Direction.DOWN));
+ surface.requestUpdateKey(key1, Optional.of(Direction.CENTER));
surface.update();
@@ -457,8 +462,8 @@
icon9, WIDTH * 2 + 2, HEIGHT * 2, expectedKeyWidth, expectedKeyHeight);
canvasControl.replay();
- surface.requestUpdateKey(key5, Direction.CENTER);
- surface.requestUpdateKey(key7, Direction.LEFT);
+ surface.requestUpdateKey(key5, Optional.of(Direction.CENTER));
+ surface.requestUpdateKey(key7, Optional.of(Direction.LEFT));
surface.requestUpdateKeyboard(keyboard, Collections.<MetaState>emptySet());
surface.update();
@@ -500,28 +505,75 @@
icon9, WIDTH * 2 + 2, HEIGHT * 2, expectedKeyWidth, expectedKeyHeight);
canvasControl.replay();
- surface.requestUpdateKey(key5, Direction.CENTER);
- surface.requestUpdateKey(key2, Direction.LEFT);
+ surface.requestUpdateKey(key5, Optional.of(Direction.CENTER));
+ surface.requestUpdateKey(key2, Optional.of(Direction.LEFT));
surface.requestUpdateKeyboard(keyboard, Collections.<MetaState>emptySet());
- surface.requestUpdateKey(key8, Direction.CENTER);
- surface.requestUpdateKey(key8, Direction.LEFT);
- surface.requestUpdateKey(key8, Direction.RIGHT);
- surface.requestUpdateKey(key8, Direction.CENTER);
- surface.requestUpdateKey(key8, Direction.UP);
- surface.requestUpdateKey(key8, Direction.DOWN);
- surface.requestUpdateKey(key8, null);
+ surface.requestUpdateKey(key8, Optional.of(Direction.CENTER));
+ surface.requestUpdateKey(key8, Optional.of(Direction.LEFT));
+ surface.requestUpdateKey(key8, Optional.of(Direction.RIGHT));
+ surface.requestUpdateKey(key8, Optional.of(Direction.CENTER));
+ surface.requestUpdateKey(key8, Optional.of(Direction.UP));
+ surface.requestUpdateKey(key8, Optional.of(Direction.DOWN));
+ surface.requestUpdateKey(key8, Optional.<Direction>absent());
- surface.requestUpdateKey(key1, Direction.CENTER);
- surface.requestUpdateKey(key1, Direction.UP);
- surface.requestUpdateKey(key1, Direction.DOWN);
- surface.requestUpdateKey(key1, Direction.CENTER);
+ surface.requestUpdateKey(key1, Optional.of(Direction.CENTER));
+ surface.requestUpdateKey(key1, Optional.of(Direction.UP));
+ surface.requestUpdateKey(key1, Optional.of(Direction.DOWN));
+ surface.requestUpdateKey(key1, Optional.of(Direction.CENTER));
- surface.requestUpdateKey(key7, Direction.LEFT);
+ surface.requestUpdateKey(key7, Optional.of(Direction.LEFT));
surface.update();
canvasControl.verify();
}
+
+ @SmallTest
+ public void testRequestMetaState() {
+ Set<MetaState> empty = EnumSet.noneOf(MetaState.class);
+ Collection<Flick> center = Collections.singleton(
+ new Flick(Direction.CENTER,
+ new KeyEntity(0, 0, 0, true, 0,
+ Optional.<String>absent(), false, Optional.<PopUp>absent(),
+ 0, 0, 0, 0)));
+ Key keyWithNoMetaStates = new Key(
+ 0, 0, 0, 0, 0, 0, false, false,
+ Stick.EVEN, DrawableType.TWELVEKEYS_REGULAR_KEY_BACKGROUND,
+ Arrays.asList(
+ new KeyState("", empty, empty, empty, center)));
+ Key keyWithCapsLock = new Key(
+ 0, 0, 0, 0, 0, 0, false, false,
+ Stick.EVEN, DrawableType.TWELVEKEYS_REGULAR_KEY_BACKGROUND,
+ Arrays.asList(
+ new KeyState("", empty, empty, empty, center),
+ new KeyState("", EnumSet.of(MetaState.CAPS_LOCK), empty, empty, center)));
+ Keyboard keyboard = new Keyboard(Optional.of(""), Arrays.asList(
+ new Row(Arrays.asList(keyWithNoMetaStates, keyWithCapsLock), 0, 0)), 0,
+ KeyboardSpecification.TWELVE_KEY_TOGGLE_FLICK_KANA);
+
+ KeyboardViewBackgroundSurface surface = new KeyboardViewBackgroundSurface(
+ new BackgroundDrawableFactory(createNiceMock(MockResourcesWithDisplayMetrics.class)),
+ createDrawableCacheMock());
+
+ surface.requestUpdateKeyboard(keyboard, EnumSet.noneOf(MetaState.class));
+
+ assertTrue(surface.pendingKeys.isEmpty());
+
+ // keyWithCapsLock is requested to be redrawn.
+ surface.requestMetaState(EnumSet.of(MetaState.CAPS_LOCK));
+ assertEquals(1, surface.pendingKeys.size());
+ assertSame(keyWithCapsLock, surface.pendingKeys.keySet().toArray()[0]);
+
+ // Same metastates. No update.
+ surface.pendingKeys.clear();
+ surface.requestMetaState(EnumSet.of(MetaState.CAPS_LOCK));
+ assertTrue(surface.pendingKeys.isEmpty());
+
+ // No metastete -> keyWithGlobe and keyWithCapsLock are redrawn.
+ surface.pendingKeys.clear();
+ surface.requestMetaState(EnumSet.noneOf(MetaState.class));
+ assertEquals(1, surface.pendingKeys.size());
+ }
}
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/keyboard/KeyboardViewTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/keyboard/KeyboardViewTest.java
index ac879c8..a6c8d8e 100644
--- a/src/android/tests/src/com/google/android/inputmethod/japanese/keyboard/KeyboardViewTest.java
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/keyboard/KeyboardViewTest.java
@@ -29,24 +29,25 @@
package org.mozc.android.inputmethod.japanese.keyboard;
+import static org.easymock.EasyMock.capture;
import static org.easymock.EasyMock.eq;
-import static org.easymock.EasyMock.expect;
import static org.easymock.EasyMock.expectLastCall;
import static org.easymock.EasyMock.isA;
import static org.easymock.EasyMock.same;
import org.mozc.android.inputmethod.japanese.MozcUtil;
+import org.mozc.android.inputmethod.japanese.keyboard.BackgroundDrawableFactory.DrawableType;
import org.mozc.android.inputmethod.japanese.keyboard.Flick.Direction;
import org.mozc.android.inputmethod.japanese.keyboard.Key.Stick;
import org.mozc.android.inputmethod.japanese.keyboard.KeyState.MetaState;
+import org.mozc.android.inputmethod.japanese.keyboard.Keyboard.KeyboardSpecification;
import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Input.TouchAction;
import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Input.TouchEvent;
-import org.mozc.android.inputmethod.japanese.resources.R;
import org.mozc.android.inputmethod.japanese.testing.InstrumentationTestCaseWithMock;
+import org.mozc.android.inputmethod.japanese.testing.MockResourcesWithDisplayMetrics;
import org.mozc.android.inputmethod.japanese.testing.Parameter;
import org.mozc.android.inputmethod.japanese.testing.VisibilityProxy;
import org.mozc.android.inputmethod.japanese.view.DrawableCache;
-import org.mozc.android.inputmethod.japanese.view.MozcDrawableFactory;
import org.mozc.android.inputmethod.japanese.view.SkinType;
import com.google.common.base.Optional;
@@ -58,10 +59,12 @@
import android.test.mock.MockResources;
import android.test.suitebuilder.annotation.SmallTest;
import android.text.InputType;
+import android.util.DisplayMetrics;
import android.view.MotionEvent;
import android.view.View;
import android.view.inputmethod.EditorInfo;
+import org.easymock.Capture;
import org.easymock.EasyMock;
import org.easymock.IAnswer;
@@ -82,7 +85,7 @@
*/
private static final int STEP_COUNT = 20;
- // Followings are parameters of a dummy key.
+ // The following are parameters of a dummy key.
private static final int WIDTH = 50;
private static final int HEIGHT = 30;
private static final int HORIZONTAL_GAP = 0;
@@ -124,9 +127,15 @@
return result;
}
- static KeyState createKeyState(Set<MetaState> metaState, int keyCode) {
- KeyEntity entity = new KeyEntity(1, keyCode, KeyEntity.INVALID_KEY_CODE, 0, null, false, null);
- Flick flick = new Flick(Flick.Direction.CENTER, entity);
+ private static KeyEntity createInvalidKeyEntity(int sourceId, int keyCode) {
+ return new KeyEntity(
+ sourceId, keyCode, KeyEntity.INVALID_KEY_CODE, true, 0,
+ Optional.<String>absent(), false, Optional.<PopUp>absent(), 0, 0, 0, 0);
+ }
+
+ private static KeyState createKeyStateWithKeyEntity(
+ Set<MetaState> metaState, KeyEntity keyEntity) {
+ Flick flick = new Flick(Flick.Direction.CENTER, keyEntity);
return new KeyState(
"",
metaState,
@@ -135,21 +144,36 @@
Collections.singletonList(flick));
}
- static Key createKey(int x, int y, int keyCode) {
+ private static KeyState createKeyState(Set<MetaState> metaState, int keyCode) {
+ return createKeyStateWithKeyEntity(metaState, createInvalidKeyEntity(1, keyCode));
+ }
+
+ private static Key createKey(int x, int y, int keyCode) {
return new Key(
- x, y, WIDTH, HEIGHT, HORIZONTAL_GAP, 0, false, false, false, Stick.EVEN,
+ x, y, WIDTH, HEIGHT, HORIZONTAL_GAP, 0, false, false, Stick.EVEN,
+ DrawableType.TWELVEKEYS_REGULAR_KEY_BACKGROUND,
Collections.singletonList(createKeyState(Collections.<MetaState>emptySet(), keyCode)));
}
+ private static Key createKeyWithKeyEntity(int x, int y, KeyEntity keyEntity) {
+ return new Key(
+ x, y, WIDTH, HEIGHT, HORIZONTAL_GAP, 0, false, false, Stick.EVEN,
+ DrawableType.TWELVEKEYS_REGULAR_KEY_BACKGROUND,
+ Collections.singletonList(
+ createKeyStateWithKeyEntity(Collections.<MetaState>emptySet(), keyEntity)));
+ }
+
private static Key createSpacer(int x, int y, Stick stick) {
return new Key(
- x, y, WIDTH, HEIGHT, HORIZONTAL_GAP, 0, false, false, false, stick,
+ x, y, WIDTH, HEIGHT, HORIZONTAL_GAP, 0, false, false, stick,
+ DrawableType.TWELVEKEYS_REGULAR_KEY_BACKGROUND,
Collections.<KeyState>emptyList());
}
private static Key createKeyWithModifiedState(int x, int y, int keyCode, int modifiedKeyCode) {
return new Key(
- x, y, WIDTH, HEIGHT, HORIZONTAL_GAP, 0, false, false, false, Stick.EVEN,
+ x, y, WIDTH, HEIGHT, HORIZONTAL_GAP, 0, false, false, Stick.EVEN,
+ DrawableType.TWELVEKEYS_REGULAR_KEY_BACKGROUND,
Arrays.asList(createKeyState(Collections.<MetaState>emptySet(), keyCode),
createKeyState(EnumSet.of(MetaState.CAPS_LOCK), modifiedKeyCode)));
}
@@ -157,34 +181,25 @@
private static Key createFlickKey(
int x, int y,
int centerKeyCode, int leftKeyCode, int rightKeyCode, int upKeyCode, int downKeyCode) {
- Flick center = new Flick(
- Flick.Direction.CENTER,
- new KeyEntity(1, centerKeyCode, KeyEntity.INVALID_KEY_CODE, 0, null, false, null));
- Flick left = new Flick(
- Flick.Direction.LEFT,
- new KeyEntity(1, leftKeyCode, KeyEntity.INVALID_KEY_CODE, 0, null, false, null));
- Flick right = new Flick(
- Flick.Direction.RIGHT,
- new KeyEntity(1, rightKeyCode, KeyEntity.INVALID_KEY_CODE, 0, null, false, null));
- Flick up = new Flick(
- Flick.Direction.UP,
- new KeyEntity(1, upKeyCode, KeyEntity.INVALID_KEY_CODE, 0, null, false, null));
- Flick down = new Flick(
- Flick.Direction.DOWN,
- new KeyEntity(1, downKeyCode, KeyEntity.INVALID_KEY_CODE, 0, null, false, null));
+ Flick center = new Flick(Flick.Direction.CENTER, createInvalidKeyEntity(1, centerKeyCode));
+ Flick left = new Flick(Flick.Direction.LEFT, createInvalidKeyEntity(1, leftKeyCode));
+ Flick right = new Flick(Flick.Direction.RIGHT, createInvalidKeyEntity(1, rightKeyCode));
+ Flick up = new Flick(Flick.Direction.UP, createInvalidKeyEntity(1, upKeyCode));
+ Flick down = new Flick(Flick.Direction.DOWN, createInvalidKeyEntity(1, downKeyCode));
KeyState keyState = new KeyState(
"",
Collections.<MetaState>emptySet(),
Collections.<MetaState>emptySet(),
Collections.<MetaState>emptySet(),
Arrays.asList(center, left, right, up, down));
- return new Key(x, y, WIDTH, HEIGHT, HORIZONTAL_GAP, 0, false, false, false, Stick.EVEN,
+ return new Key(x, y, WIDTH, HEIGHT, HORIZONTAL_GAP, 0, false, false, Stick.EVEN,
+ DrawableType.TWELVEKEYS_REGULAR_KEY_BACKGROUND,
Collections.singletonList(keyState));
}
private static Key createModifierKey(int x, int y, int keyCode, Set<MetaState> nextAddMetaStates,
Set<MetaState> nextRemoveMetaStates) {
- KeyEntity entity = new KeyEntity(1, keyCode, KeyEntity.INVALID_KEY_CODE, 0, null, false, null);
+ KeyEntity entity = createInvalidKeyEntity(1, keyCode);
Flick flick = new Flick(Flick.Direction.CENTER, entity);
KeyState keyState = new KeyState(
"",
@@ -192,7 +207,8 @@
nextAddMetaStates,
nextRemoveMetaStates,
Collections.singletonList(flick));
- return new Key(x, y, WIDTH, HEIGHT, HORIZONTAL_GAP, 0, false, true, false, Stick.EVEN,
+ return new Key(x, y, WIDTH, HEIGHT, HORIZONTAL_GAP, 0, false, true, Stick.EVEN,
+ DrawableType.TWELVEKEYS_REGULAR_KEY_BACKGROUND,
Collections.singletonList(keyState));
}
@@ -202,7 +218,8 @@
*/
private static Keyboard createDummyKeyboard(Key key) {
Row row = new Row(Collections.singletonList(key), HEIGHT, VERTICAL_GAP);
- return new Keyboard(Optional.<String>absent(), Collections.singletonList(row), 1);
+ return new Keyboard(Optional.<String>absent(), Collections.singletonList(row), 1,
+ KeyboardSpecification.TWELVE_KEY_TOGGLE_FLICK_KANA);
}
private KeyEventHandler createKeyEventHandlerMock() {
@@ -217,9 +234,8 @@
private KeyboardViewBackgroundSurface createKeyboardViewBackgroundSurfaceMock() {
return createMockBuilder(KeyboardViewBackgroundSurface.class)
.withConstructor(BackgroundDrawableFactory.class, DrawableCache.class)
- .withArgs(new BackgroundDrawableFactory(1f),
- new DrawableCache(
- new MozcDrawableFactory(getInstrumentation().getContext().getResources())))
+ .withArgs(new BackgroundDrawableFactory(new MockResourcesWithDisplayMetrics()),
+ new DrawableCache(getInstrumentation().getContext().getResources()))
.createMock();
}
@@ -240,7 +256,7 @@
@SmallTest
public void testFlushPendingKeyEventRecursiveCall() {
- Key targetKey = view.getKeyboard().getRowList().get(0).getKeyList().get(0);
+ Key targetKey = view.getKeyboard().get().getRowList().get(0).getKeyList().get(0);
KeyEventContext keyEventContext =
new KeyEventContext(targetKey, 0, 0, 0, 100, 60, 1, Collections.<MetaState>emptySet());
@@ -248,7 +264,7 @@
keyEventHandler.cancelDelayedKeyEvent(keyEventContext);
keyEventHandler.sendKey(
keyEventContext.getKeyCode(),
- Collections.singletonList(keyEventContext.getTouchEvent()));
+ Collections.singletonList(keyEventContext.getTouchEvent().get()));
expectLastCall().andAnswer(new IAnswer<Void>() {
@Override
public Void answer() throws Throwable {
@@ -369,7 +385,7 @@
verifyAll();
assertEquals(1, keyEventContextMap.size());
- assertEquals(EnumSet.of(MetaState.CAPS_LOCK), view.metaState);
+ assertEquals(EnumSet.of(MetaState.CAPS_LOCK, MetaState.HANDLING_TOUCH_EVENT), view.metaState);
}
@SmallTest
@@ -410,7 +426,7 @@
@SmallTest
public void testOnTouchEvent_release() {
- Key targetKey = view.getKeyboard().getRowList().get(0).getKeyList().get(0);
+ Key targetKey = view.getKeyboard().get().getRowList().get(0).getKeyList().get(0);
KeyEventContext keyEventContext =
new KeyEventContext(targetKey, 0, 0, 0, 100, 60, 1, Collections.<MetaState>emptySet());
@@ -483,7 +499,7 @@
view.setKeyboard(createDummyKeyboard(testData.key));
view.layout(0, 0, 100, 60);
- Key targetKey = view.getKeyboard().getRowList().get(0).getKeyList().get(0);
+ Key targetKey = view.getKeyboard().get().getRowList().get(0).getKeyList().get(0);
KeyEventContext keyEventContext =
new KeyEventContext(targetKey, 0, 0, 0, 100, 60, 1, Collections.<MetaState>emptySet());
@@ -516,7 +532,7 @@
public void testOnTouchEvent_releaseModified() {
Key key = createKeyWithModifiedState(0, 0, 'a', 'A');
view.setKeyboard(createDummyKeyboard(key));
- Key targetKey = view.getKeyboard().getRowList().get(0).getKeyList().get(0);
+ Key targetKey = view.getKeyboard().get().getRowList().get(0).getKeyList().get(0);
KeyEventContext keyEventContext =
new KeyEventContext(targetKey, 0, 0, 0, 100, 60, 1, EnumSet.of(MetaState.CAPS_LOCK));
@@ -658,7 +674,7 @@
@SmallTest
public void testOnTouchEvent_releaseModifierOneTime() {
- Key targetKey = view.getKeyboard().getRowList().get(0).getKeyList().get(0);
+ Key targetKey = view.getKeyboard().get().getRowList().get(0).getKeyList().get(0);
KeyEventContext keyEventContext =
new KeyEventContext(targetKey, 0, 0, 0, 100, 60, 1, Collections.<MetaState>emptySet());
@@ -735,6 +751,15 @@
assertEquals(Flick.Direction.RIGHT,
keyEventContextMap.values().iterator().next().flickDirection);
+ verifyAll();
+
+ resetAll();
+ keyEventHandler.cancelDelayedKeyEvent(isA(KeyEventContext.class));
+ expectLastCall().anyTimes();
+ // Delayed key event is invoked since the next flick direction is CENTER.
+ keyEventHandler.maybeStartDelayedKeyEvent(isA(KeyEventContext.class));
+ replayAll();
+
assertTrue(touchEvent(view, MotionEvent.ACTION_MOVE, 25, 15));
assertEquals(1, keyEventContextMap.size());
assertEquals(Flick.Direction.CENTER,
@@ -745,7 +770,7 @@
@SmallTest
public void testOnTouchEvent_cancel() {
- Key targetKey = view.getKeyboard().getRowList().get(0).getKeyList().get(0);
+ Key targetKey = view.getKeyboard().get().getRowList().get(0).getKeyList().get(0);
KeyEventContext eventContext =
new KeyEventContext(targetKey, 0, 0, 0, 100, 60, 1, Collections.<MetaState>emptySet());
@@ -797,7 +822,7 @@
resetAll();
keyboardActionListener.onPress('a');
keyboardActionListener.onKey(
- eq(testCase.expectedCode), EasyMock.<List<? extends TouchEvent>>notNull());
+ eq(testCase.expectedCode), EasyMock.<List<TouchEvent>>notNull());
keyboardActionListener.onRelease('a');
replayAll();
@@ -810,7 +835,6 @@
assertTrue(drag(view, fromX, testCase.toX, fromY, testCase.toY));
assertTrue(view.keyEventContextMap.isEmpty());
- view.setKeyEventHandler(null);
verifyAll();
}
}
@@ -848,14 +872,15 @@
public void testPopUp() {
final Drawable icon = new ColorDrawable();
final Drawable flickIcon = new ColorDrawable();
+ final int invalidResourceId = 0;
final int iconResourceId = 1;
final int flickIconResourceId = 3;
- PopUp popup = new PopUp(iconResourceId, 40, 40, 0, -30);
- PopUp flickPopup = new PopUp(flickIconResourceId, 40, 40, 0, -30);
+ PopUp popup = new PopUp(iconResourceId, invalidResourceId, 40, 0, -30, 10, 10);
+ PopUp flickPopup = new PopUp(flickIconResourceId, invalidResourceId, 40, 0, -30, 10, 10);
// Inject drawables as resources.
- Resources mockResources = new MockResources() {
+ Resources mockResources = new MockResourcesWithDisplayMetrics() {
@Override
public Drawable getDrawable(int resourceId) {
if (resourceId == iconResourceId) {
@@ -867,7 +892,7 @@
return null;
}
};
- DrawableCache drawableCache = new DrawableCache(new MozcDrawableFactory(mockResources));
+ DrawableCache drawableCache = new DrawableCache(mockResources);
VisibilityProxy.setField(view, "drawableCache", drawableCache);
int x1 = 0;
@@ -879,7 +904,8 @@
Key popupKey = new Key(
x2, y2,
- WIDTH, HEIGHT, HORIZONTAL_GAP, 0, false, false, false, Stick.EVEN,
+ WIDTH, HEIGHT, HORIZONTAL_GAP, 0, false, false, Stick.EVEN,
+ DrawableType.TWELVEKEYS_REGULAR_KEY_BACKGROUND,
Collections.singletonList(new KeyState(
"",
Collections.<MetaState>emptySet(),
@@ -888,11 +914,14 @@
Arrays.asList(
new Flick(
Direction.CENTER,
- new KeyEntity(1, 'a', KeyEntity.INVALID_KEY_CODE, 0, null, false, popup)),
+ new KeyEntity(
+ 1, 'a', KeyEntity.INVALID_KEY_CODE, true, 0,
+ Optional.<String>absent(), false, Optional.of(popup), 0, 0, 0, 0)),
new Flick(
Direction.LEFT,
- new KeyEntity(2, 'b', KeyEntity.INVALID_KEY_CODE, 0, null, false,
- flickPopup))))));
+ new KeyEntity(
+ 2, 'b', KeyEntity.INVALID_KEY_CODE, true, 0,
+ Optional.<String>absent(), false, Optional.of(flickPopup), 0, 0, 0, 0))))));
Row row1 = new Row(
Arrays.asList(createKey(x1, y1, 'c'), createKey(x2, y1, 'd'), createKey(x3, y1, 'e')),
@@ -904,13 +933,15 @@
Arrays.asList(createKey(x1, y3, 'h'), createKey(x2, y3, 'i'), createKey(x3, y3, 'j')),
HEIGHT, VERTICAL_GAP);
Keyboard keyboard = new Keyboard(Optional.<String>absent(),
- Arrays.asList(row1, row2, row3), 1);
+ Arrays.asList(row1, row2, row3), 1,
+ KeyboardSpecification.TWELVE_KEY_TOGGLE_FLICK_KANA);
view.setKeyboard(keyboard);
// Set mock preview.
PopUpPreview mockPopUpPreview = createMockBuilder(PopUpPreview.class)
.withConstructor(View.class, BackgroundDrawableFactory.class, DrawableCache.class)
- .withArgs(view, new BackgroundDrawableFactory(1f), drawableCache)
+ .withArgs(view, new BackgroundDrawableFactory(new MockResourcesWithDisplayMetrics()),
+ drawableCache)
.createMock();
PopUpPreview.Pool popupPreviewPool = VisibilityProxy.getField(view, "popupPreviewPool");
VisibilityProxy.<List<PopUpPreview>>getField(
@@ -919,7 +950,7 @@
VisibilityProxy.setField(popupPreviewPool, "dismissHandler", dismissHandler);
// At first, emulate press event.
- mockPopUpPreview.showIfNecessary(popupKey, popup);
+ mockPopUpPreview.showIfNecessary(popupKey, Optional.of(popup), false);
replayAll();
assertTrue(touchEvent(view, MotionEvent.ACTION_DOWN, 75, 45));
@@ -927,7 +958,7 @@
// Then, moving to left.
resetAll();
- mockPopUpPreview.showIfNecessary(popupKey, flickPopup);
+ mockPopUpPreview.showIfNecessary(popupKey, Optional.of(flickPopup), false);
replayAll();
assertTrue(touchEvent(view, MotionEvent.ACTION_MOVE, 25, 45));
@@ -935,7 +966,7 @@
// Moving to top.
resetAll();
- mockPopUpPreview.showIfNecessary(popupKey, null);
+ mockPopUpPreview.showIfNecessary(popupKey, Optional.<PopUp>absent(), false);
replayAll();
assertTrue(touchEvent(view, MotionEvent.ACTION_MOVE, 75, 15));
@@ -943,7 +974,7 @@
// Moving to center again.
resetAll();
- mockPopUpPreview.showIfNecessary(popupKey, popup);
+ mockPopUpPreview.showIfNecessary(popupKey, Optional.of(popup), false);
replayAll();
assertTrue(touchEvent(view, MotionEvent.ACTION_MOVE, 75, 45));
@@ -973,6 +1004,109 @@
verifyAll();
}
+ private void delayedPopupTestImpl(
+ boolean popupEnabled, boolean longPressTimeoutTrigger, boolean popupPresent,
+ boolean expectShowIfNecessaryIsCalled, boolean expectLongPressCallbackIsSet) {
+ // Set up mock drawable cache.
+ MockResources mockResources = new MockResources() {
+ @Override
+ public Drawable getDrawable(int resourceId) {
+ return new ColorDrawable();
+ }
+
+ @Override
+ public DisplayMetrics getDisplayMetrics() {
+ return new DisplayMetrics();
+ }
+ };
+ DrawableCache drawableCache = new DrawableCache(mockResources);
+ VisibilityProxy.setField(view, "drawableCache", drawableCache);
+
+ // Set up a dummy keyboard with one key entity and mock key event handler.
+ view.setPopupEnabled(popupEnabled);
+ Optional<PopUp> popup = Optional.absent();
+ if (popupPresent) {
+ popup = Optional.of(new PopUp(0, 0, 40, 0, -30, 10, 10));
+ }
+ KeyEntity keyEntity = new KeyEntity(
+ 1, 'a', 'A', longPressTimeoutTrigger, 0, Optional.<String>absent(), false, popup,
+ 0, 0, 0, 0);
+ Key key = createKeyWithKeyEntity(0, 0, keyEntity);
+ view.setKeyboard(createDummyKeyboard(key));
+ KeyEventHandler mockKeyEventHandler = createKeyEventHandlerMock();
+ view.setKeyEventHandler(mockKeyEventHandler);
+
+ // Set up mock popup preview.
+ PopUpPreview mockPopUpPreview = createMockBuilder(PopUpPreview.class)
+ .withConstructor(View.class, BackgroundDrawableFactory.class, DrawableCache.class)
+ .withArgs(view, new BackgroundDrawableFactory(mockResources), drawableCache)
+ .createMock();
+ PopUpPreview.Pool popupPreviewPool = VisibilityProxy.getField(view, "popupPreviewPool");
+ VisibilityProxy.<List<PopUpPreview>>getField(
+ popupPreviewPool, "freeList").add(mockPopUpPreview);
+ Handler dismissHandler = new Handler(Looper.myLooper());
+ VisibilityProxy.setField(popupPreviewPool, "dismissHandler", dismissHandler);
+
+ // Run test scenario.
+ if (expectShowIfNecessaryIsCalled) {
+ mockPopUpPreview.showIfNecessary(key, popup, false);
+ }
+ if (!popupEnabled) {
+ mockPopUpPreview.dismiss();
+ }
+ Capture<KeyEventContext> keyEventContextCapture = new Capture<KeyEventContext>();
+ mockKeyEventHandler.cancelDelayedKeyEvent(isA(KeyEventContext.class));
+ expectLastCall().anyTimes();
+ mockKeyEventHandler.maybeStartDelayedKeyEvent(capture(keyEventContextCapture));
+ mockKeyEventHandler.sendPress('a');
+ replayAll();
+
+ assertTrue(touchEvent(view, MotionEvent.ACTION_DOWN, 75, 45));
+ verifyAll();
+ KeyEventContext context = keyEventContextCapture.getValue();
+ assertEquals(expectLongPressCallbackIsSet, context.longPressCallback.isPresent());
+ }
+
+ @SmallTest
+ public void testDelayedPopup_PopupEnabled_Trigger_PopupIconPresent() {
+ delayedPopupTestImpl(true, true, true, true, false);
+ }
+
+ @SmallTest
+ public void testDelayedPopup_PopupEnabled_Trigger_PopupIconAbsent() {
+ delayedPopupTestImpl(true, true, false, true, false);
+ }
+
+ @SmallTest
+ public void testDelayedPopup_PopupEnabled_NotTrigger_PopupIconPresent() {
+ delayedPopupTestImpl(true, false, true, true, true);
+ }
+
+ @SmallTest
+ public void testDelayedPopup_PopupEnabled_NotTrigger_PopupIconAbsent() {
+ delayedPopupTestImpl(true, false, false, true, false);
+ }
+
+ @SmallTest
+ public void testDelayedPopup_PopupDisabled_Trigger_PopupIconPresent() {
+ delayedPopupTestImpl(false, true, true, false, false);
+ }
+
+ @SmallTest
+ public void testDelayedPopup_PopupDisabled_Trigger_PopupIconAbsent() {
+ delayedPopupTestImpl(false, true, false, false, false);
+ }
+
+ @SmallTest
+ public void testDelayedPopup_PopupDisabled_NotTrigger_PopupIconPresent() {
+ delayedPopupTestImpl(false, false, true, false, true);
+ }
+
+ @SmallTest
+ public void testDelayedPopup_PopupDisabled_NotTrigger_PopupIconAbsent() {
+ delayedPopupTestImpl(false, false, false, false, false);
+ }
+
// Unfortunately, there are no way to test multi-touch events because we can create neither
// MotionEvent class instances with multi-touch events nor mock instances.
// So, just skip the tests for those cases.
@@ -1004,54 +1138,26 @@
for (TestCase testCase : testCases) {
Row row = new Row(Arrays.asList(key1, testCase.spacer, key2), HEIGHT, VERTICAL_GAP);
- view.setKeyboard(new Keyboard(Optional.<String>absent(), Collections.singletonList(row), 1));
+ view.setKeyboard(new Keyboard(Optional.<String>absent(), Collections.singletonList(row), 1,
+ KeyboardSpecification.TWELVE_KEY_TOGGLE_FLICK_KANA));
// Center of key1.
- assertSame(key1, view.getKeyByCoord(WIDTH / 2, HEIGHT / 2));
+ assertSame(key1, view.getKeyByCoord(WIDTH / 2, HEIGHT / 2).get());
// Center of key2.
- assertSame(key2, view.getKeyByCoord(WIDTH * 5 / 2, HEIGHT / 2));
+ assertSame(key2, view.getKeyByCoord(WIDTH * 5 / 2, HEIGHT / 2).get());
// On a spacer.
- assertSame(testCase.expectedLeftHalf, view.getKeyByCoord(WIDTH * 4 / 3, HEIGHT / 2));
- assertSame(testCase.expectedRightHalf, view.getKeyByCoord(WIDTH * 5 / 3, HEIGHT / 2));
+ assertSame(testCase.expectedLeftHalf, view.getKeyByCoord(WIDTH * 4 / 3, HEIGHT / 2).get());
+ assertSame(testCase.expectedRightHalf, view.getKeyByCoord(WIDTH * 5 / 3, HEIGHT / 2).get());
// Both outside of the keyboard.
- assertSame(key1, view.getKeyByCoord(-WIDTH / 2, HEIGHT / 2));
- assertSame(key2, view.getKeyByCoord(WIDTH * 7 / 2, HEIGHT / 2));
+ assertSame(key1, view.getKeyByCoord(-WIDTH / 2, HEIGHT / 2).get());
+ assertSame(key2, view.getKeyByCoord(WIDTH * 7 / 2, HEIGHT / 2).get());
}
}
@SmallTest
- public void testOnTouchEvent_releaseSymbolCusorkeySecondly() {
- Resources res = view.getContext().getResources();
- KeyEventHandler keyEventHandler = createKeyEventHandlerMock();
- int keyCode = res.getInteger(R.integer.key_symbol);
- resetAll();
- Key targetKey = createKey(0, 0, keyCode);
- KeyEventContext keyEventContext =
- new KeyEventContext(targetKey, 0, 0, 0, 100, 60, 1, Collections.<MetaState>emptySet());
-
- // The listener should receive only onRelease event.
- keyEventHandler.cancelDelayedKeyEvent(keyEventContext);
- keyEventHandler.sendRelease(keyCode);
- replayAll();
- view.setKeyEventHandler(keyEventHandler);
-
- // Set pressed condition.
- Map<Integer, KeyEventContext> keyEventContextMap = view.keyEventContextMap;
- keyEventContextMap.put(0, keyEventContext);
-
- assertEquals(Flick.Direction.CENTER,
- keyEventContextMap.values().iterator().next().flickDirection);
- assertTrue(touchEvent(view, MotionEvent.ACTION_POINTER_UP, 0, 0));
- assertTrue(keyEventContextMap.isEmpty());
-
- view.setKeyEventHandler(null);
- verifyAll();
- }
-
- @SmallTest
public void testOnDetachedFromWindow() {
KeyboardViewBackgroundSurface keyboardViewBackgroundSurface =
createKeyboardViewBackgroundSurfaceMock();
@@ -1067,32 +1173,28 @@
@SuppressWarnings("unchecked")
@SmallTest
public void testSetSkinType() {
+ Resources resources = getInstrumentation().getTargetContext().getResources();
KeyboardViewBackgroundSurface keyboardViewBackgroundSurface =
createKeyboardViewBackgroundSurfaceMock();
keyboardViewBackgroundSurface.requestUpdateKeyboard(
isA(Keyboard.class), isA(Set.class));
DrawableCache drawableCache = createMockBuilder(DrawableCache.class)
- .withConstructor(MozcDrawableFactory.class)
- .withArgs(new MozcDrawableFactory(new MockResources()))
+ .withConstructor(Resources.class)
+ .withArgs(new MockResourcesWithDisplayMetrics())
.createMock();
- drawableCache.setSkinType(SkinType.ORANGE_LIGHTGRAY);
- expect(drawableCache.getDrawable(SkinType.ORANGE_LIGHTGRAY.windowBackgroundResourceId))
- .andReturn(Optional.<Drawable>absent());
+ drawableCache.setSkin(SkinType.ORANGE_LIGHTGRAY.getSkin(resources));
BackgroundDrawableFactory backgroundDrawableFactory =
- createMockBuilder(BackgroundDrawableFactory.class)
- .withConstructor(Float.TYPE)
- .withArgs(1f)
- .createMock();
- backgroundDrawableFactory.setSkinType(SkinType.ORANGE_LIGHTGRAY);
+ new BackgroundDrawableFactory(createNiceMock(MockResourcesWithDisplayMetrics.class));
+ backgroundDrawableFactory.setSkin(SkinType.ORANGE_LIGHTGRAY.getSkin(resources));
replayAll();
VisibilityProxy.setField(view, "backgroundSurface", keyboardViewBackgroundSurface);
VisibilityProxy.setField(view, "drawableCache", drawableCache);
VisibilityProxy.setField(view, "backgroundDrawableFactory", backgroundDrawableFactory);
- view.setSkinType(SkinType.ORANGE_LIGHTGRAY);
+ view.setSkin(SkinType.ORANGE_LIGHTGRAY.getSkin(resources));
verifyAll();
}
@@ -1101,20 +1203,21 @@
public void testSetKeyboard() {
KeyboardView view = new KeyboardView(getInstrumentation().getTargetContext());
Set<MetaState> originalMetaStates = EnumSet.of(
+ MetaState.NO_GLOBE,
MetaState.CAPS_LOCK,
MetaState.ACTION_GO,
MetaState.VARIATION_EMAIL_ADDRESS,
- MetaState.COMPOSING,
- MetaState.GLOBE);
+ MetaState.COMPOSING);
view.updateMetaStates(originalMetaStates, EnumSet.noneOf(MetaState.class));
assertEquals(originalMetaStates, view.getMetaStates());
- view.setKeyboard(new Keyboard(Optional.<String>absent(), Collections.<Row>emptyList(), 0f));
+ view.setKeyboard(new Keyboard(Optional.<String>absent(), Collections.<Row>emptyList(), 0f,
+ KeyboardSpecification.TWELVE_KEY_TOGGLE_FLICK_KANA));
assertEquals(
EnumSet.of(
+ MetaState.NO_GLOBE,
MetaState.ACTION_GO,
MetaState.VARIATION_EMAIL_ADDRESS,
- MetaState.COMPOSING,
- MetaState.GLOBE),
+ MetaState.COMPOSING),
view.getMetaStates());
}
@@ -1135,26 +1238,35 @@
// Keep the order. KeyboardView's state is not reset in the iteration.
TestData[] testDataList = {
- new TestData(0, 0, EnumSet.noneOf(MetaState.class)),
- new TestData(EditorInfo.IME_ACTION_DONE, 0, EnumSet.of(MetaState.ACTION_DONE)),
- new TestData(EditorInfo.IME_ACTION_GO, 0, EnumSet.of(MetaState.ACTION_GO)),
- new TestData(EditorInfo.IME_ACTION_NEXT, 0, EnumSet.of(MetaState.ACTION_NEXT)),
- new TestData(EditorInfo.IME_ACTION_NONE, 0, EnumSet.of(MetaState.ACTION_NONE)),
- new TestData(EditorInfo.IME_ACTION_PREVIOUS, 0, EnumSet.of(MetaState.ACTION_PREVIOUS)),
- new TestData(EditorInfo.IME_ACTION_SEARCH, 0, EnumSet.of(MetaState.ACTION_SEARCH)),
- new TestData(EditorInfo.IME_ACTION_SEND, 0, EnumSet.of(MetaState.ACTION_SEND)),
+ new TestData(0, 0, EnumSet.of(MetaState.NO_GLOBE)),
+ new TestData(EditorInfo.IME_ACTION_DONE,
+ 0, EnumSet.of(MetaState.NO_GLOBE, MetaState.ACTION_DONE)),
+ new TestData(EditorInfo.IME_ACTION_GO,
+ 0, EnumSet.of(MetaState.NO_GLOBE, MetaState.ACTION_GO)),
+ new TestData(EditorInfo.IME_ACTION_NEXT,
+ 0, EnumSet.of(MetaState.NO_GLOBE, MetaState.ACTION_NEXT)),
+ new TestData(EditorInfo.IME_ACTION_NONE,
+ 0, EnumSet.of(MetaState.NO_GLOBE, MetaState.ACTION_NONE)),
+ new TestData(EditorInfo.IME_ACTION_PREVIOUS,
+ 0, EnumSet.of(MetaState.NO_GLOBE, MetaState.ACTION_PREVIOUS)),
+ new TestData(EditorInfo.IME_ACTION_SEARCH,
+ 0, EnumSet.of(MetaState.NO_GLOBE, MetaState.ACTION_SEARCH)),
+ new TestData(EditorInfo.IME_ACTION_SEND,
+ 0, EnumSet.of(MetaState.NO_GLOBE, MetaState.ACTION_SEND)),
new TestData(0, InputType.TYPE_TEXT_VARIATION_URI | InputType.TYPE_CLASS_TEXT,
- EnumSet.of(MetaState.VARIATION_URI)),
+ EnumSet.of(MetaState.NO_GLOBE, MetaState.VARIATION_URI)),
new TestData(0, InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS | InputType.TYPE_CLASS_TEXT,
- EnumSet.of(MetaState.VARIATION_EMAIL_ADDRESS)),
+ EnumSet.of(MetaState.NO_GLOBE, MetaState.VARIATION_EMAIL_ADDRESS)),
new TestData(0, InputType.TYPE_TEXT_VARIATION_WEB_EMAIL_ADDRESS | InputType.TYPE_CLASS_TEXT,
- EnumSet.of(MetaState.VARIATION_EMAIL_ADDRESS)),
+ EnumSet.of(MetaState.NO_GLOBE, MetaState.VARIATION_EMAIL_ADDRESS)),
new TestData(0, InputType.TYPE_TEXT_VARIATION_SHORT_MESSAGE | InputType.TYPE_CLASS_TEXT,
- EnumSet.noneOf(MetaState.class)),
+ EnumSet.of(MetaState.NO_GLOBE)),
new TestData(0, InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS | InputType.TYPE_CLASS_TEXT,
- EnumSet.of(MetaState.VARIATION_EMAIL_ADDRESS)),
+ EnumSet.of(MetaState.NO_GLOBE, MetaState.VARIATION_EMAIL_ADDRESS)),
new TestData(0, InputType.TYPE_NUMBER_VARIATION_PASSWORD | InputType.TYPE_CLASS_NUMBER,
- EnumSet.noneOf(MetaState.class)),
+ EnumSet.of(MetaState.NO_GLOBE)),
+ new TestData(EditorInfo.IME_ACTION_DONE | EditorInfo.IME_FLAG_NO_ENTER_ACTION,
+ 0, EnumSet.of(MetaState.NO_GLOBE)),
};
for (TestData testData : testDataList) {
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/keyboard/PopUpPreviewTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/keyboard/PopUpPreviewTest.java
index 48563f1..5d47c03 100644
--- a/src/android/tests/src/com/google/android/inputmethod/japanese/keyboard/PopUpPreviewTest.java
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/keyboard/PopUpPreviewTest.java
@@ -34,15 +34,17 @@
import static org.easymock.EasyMock.getCurrentArguments;
import static org.easymock.EasyMock.isA;
+import org.mozc.android.inputmethod.japanese.keyboard.BackgroundDrawableFactory.DrawableType;
import org.mozc.android.inputmethod.japanese.keyboard.Key.Stick;
+import org.mozc.android.inputmethod.japanese.resources.R;
import org.mozc.android.inputmethod.japanese.testing.InstrumentationTestCaseWithMock;
+import org.mozc.android.inputmethod.japanese.testing.MockResourcesWithDisplayMetrics;
import org.mozc.android.inputmethod.japanese.view.DrawableCache;
-import org.mozc.android.inputmethod.japanese.view.MozcDrawableFactory;
import com.google.common.base.Optional;
+import android.content.res.Resources;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
-import android.test.mock.MockResources;
import android.test.suitebuilder.annotation.SmallTest;
import android.view.View;
import android.widget.FrameLayout;
@@ -60,17 +62,19 @@
public void testShow() {
Drawable icon = new ColorDrawable();
int iconResourceId = 1;
+ int longTapIconResourceId = 2;
+ Resources resources = getInstrumentation().getTargetContext().getResources();
DrawableCache cache = createMockBuilder(DrawableCache.class)
- .withConstructor(MozcDrawableFactory.class)
- .withArgs(new MozcDrawableFactory(new MockResources()))
+ .withConstructor(Resources.class)
+ .withArgs(resources)
.createMock();
expect(cache.getDrawable(iconResourceId)).andStubReturn(Optional.of(icon));
- int popupWidth = 40;
int popupHeight = 80;
- PopUp popup = new PopUp(iconResourceId, popupWidth, popupHeight, 0, -30);
- Key key = new Key(5, 10, 30, 20, 0, 0, false, false, false, Stick.EVEN,
+ PopUp popup = new PopUp(iconResourceId, longTapIconResourceId, popupHeight, 0, -30, 10, 10);
+ Key key = new Key(5, 10, 30, 20, 0, 0, false, false, Stick.EVEN,
+ DrawableType.TWELVEKEYS_REGULAR_KEY_BACKGROUND,
Collections.<KeyState>emptyList());
final int parentLocationX = 100;
@@ -93,33 +97,34 @@
replayAll();
- PopUpPreview preview = new PopUpPreview(mockView, new BackgroundDrawableFactory(1f), cache);
- ImageView popupView = preview.popupView;
+ PopUpPreview preview =
+ new PopUpPreview(mockView, new BackgroundDrawableFactory(resources), cache);
+ ImageView popupView = preview.popUp.getContentView();
- preview.showIfNecessary(null, popup);
- assertEquals(View.GONE, popupView.getVisibility());
- assertNull(popupView.getDrawable());
- assertNull(popupView.getBackground());
-
- preview.showIfNecessary(key, null);
+ preview.showIfNecessary(key, Optional.<PopUp>absent(), false);
assertEquals(View.GONE, popupView.getVisibility());
assertNull(popupView.getDrawable());
assertNull(popupView.getBackground());
FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(0, 0);
popupView.setLayoutParams(layoutParams);
- preview.showIfNecessary(key, popup);
+ preview.showIfNecessary(key, Optional.of(popup), false);
verifyAll();
assertEquals(View.VISIBLE, popupView.getVisibility());
assertSame(icon, popupView.getDrawable());
assertNotNull(popupView.getBackground());
- assertEquals(popupWidth, layoutParams.width);
- assertEquals(popupHeight, layoutParams.height);
- assertEquals(key.getX() + key.getWidth() / 2 + popup.getXOffset() - popup.getWidth() / 2
+ float density = resources.getDisplayMetrics().density;
+ int popupWindowPadding = (int) (BackgroundDrawableFactory.POPUP_WINDOW_PADDING * density);
+ assertEquals(Math.min(key.getWidth(),
+ resources.getDimensionPixelSize(R.dimen.popup_width_limitation))
+ + popupWindowPadding * 2,
+ layoutParams.width);
+ assertEquals(popupHeight + popupWindowPadding * 2, layoutParams.height);
+ assertEquals(key.getX() + key.getWidth() / 2 + popup.getXOffset() - layoutParams.width / 2
+ parentLocationX,
layoutParams.leftMargin);
assertEquals(key.getY() + key.getHeight() / 2 + popup.getYOffset() - popup.getHeight() / 2
- + parentLocationY,
+ + parentLocationY - popupWindowPadding,
layoutParams.topMargin);
assertEquals(0, layoutParams.rightMargin);
assertEquals(0, layoutParams.bottomMargin);
@@ -127,12 +132,53 @@
@SmallTest
public void testDismiss() {
- PopUpPreview preview =
- new PopUpPreview(new View(getInstrumentation().getTargetContext()), null, null);
+ PopUpPreview preview = new PopUpPreview(
+ new View(getInstrumentation().getTargetContext()),
+ new BackgroundDrawableFactory(new MockResourcesWithDisplayMetrics()),
+ new DrawableCache(new MockResourcesWithDisplayMetrics()));
preview.dismiss();
- ImageView popupView = preview.popupView;
+ ImageView popupView = preview.popUp.getContentView();
assertEquals(View.GONE, popupView.getVisibility());
assertNull(popupView.getDrawable());
assertNull(popupView.getBackground());
}
+
+ @SmallTest
+ public void testShowIfNecessaryWithInvalidResourceId() {
+ Drawable icon = new ColorDrawable();
+ int invalidResourceId = 0;
+ int validResourceId = 1;
+
+ DrawableCache cache = createMockBuilder(DrawableCache.class)
+ .withConstructor(Resources.class)
+ .withArgs(new MockResourcesWithDisplayMetrics())
+ .createMock();
+ expect(cache.getDrawable(invalidResourceId)).andStubReturn(Optional.<Drawable>absent());
+ expect(cache.getDrawable(validResourceId)).andStubReturn(Optional.of(icon));
+
+ PopUpPreview preview = new PopUpPreview(
+ new View(getInstrumentation().getTargetContext()),
+ new BackgroundDrawableFactory(new MockResourcesWithDisplayMetrics()), cache);
+ ImageView popupView = preview.popUp.getContentView();
+
+ replayAll();
+
+ for (boolean useValidIconResourceId : new boolean[] {false, true}) {
+ for (boolean useValidLongTapIconResourceId : new boolean[] {false, true}) {
+ int iconId = useValidIconResourceId ? validResourceId : invalidResourceId;
+ int longTapIconId = useValidLongTapIconResourceId ? validResourceId : invalidResourceId;
+ Key key = new Key(
+ 10, 10, 10, 10, 0, 0, false, false, Stick.EVEN,
+ DrawableType.TWELVEKEYS_REGULAR_KEY_BACKGROUND, Collections.<KeyState>emptyList());
+
+ preview.showIfNecessary(
+ key, Optional.of(new PopUp(iconId, longTapIconId, 10, 0, 0, 10, 10)), false);
+ assertEquals(useValidIconResourceId, popupView.getVisibility() == View.VISIBLE);
+
+ preview.showIfNecessary(
+ key, Optional.of(new PopUp(iconId, longTapIconId, 10, 0, 0, 10, 10)), true);
+ assertEquals(useValidLongTapIconResourceId, popupView.getVisibility() == View.VISIBLE);
+ }
+ }
+ }
}
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/keyboard/ProbableKeyEventGuesserTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/keyboard/ProbableKeyEventGuesserTest.java
index 9425808..1401c95 100644
--- a/src/android/tests/src/com/google/android/inputmethod/japanese/keyboard/ProbableKeyEventGuesserTest.java
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/keyboard/ProbableKeyEventGuesserTest.java
@@ -29,9 +29,7 @@
package org.mozc.android.inputmethod.japanese.keyboard;
-import org.mozc.android.inputmethod.japanese.JapaneseKeyboard;
-import org.mozc.android.inputmethod.japanese.JapaneseKeyboard.KeyboardSpecification;
-import org.mozc.android.inputmethod.japanese.JapaneseKeyboardTest;
+import org.mozc.android.inputmethod.japanese.keyboard.Keyboard.KeyboardSpecification;
import org.mozc.android.inputmethod.japanese.keyboard.ProbableKeyEventGuesser.LikelihoodCalculator;
import org.mozc.android.inputmethod.japanese.keyboard.ProbableKeyEventGuesser.LikelihoodCalculatorImpl;
import org.mozc.android.inputmethod.japanese.keyboard.ProbableKeyEventGuesser.StatisticsLoader;
@@ -99,9 +97,9 @@
.addStroke(TouchPosition.newBuilder().setAction(TouchAction.TOUCH_UP))
.build());
- private static String getFormattedKeyboardName(JapaneseKeyboard japaneseKeyboard,
+ private static String getFormattedKeyboardName(Keyboard keyboard,
Configuration configuration) {
- return japaneseKeyboard.getSpecification().getKeyboardSpecificationName()
+ return keyboard.getSpecification().getKeyboardSpecificationName()
.formattedKeyboardName(configuration);
}
@@ -140,25 +138,25 @@
final InputStream testStream = createStream(sourceIdList, statsList);
final Configuration configuration = new Configuration();
configuration.orientation = Configuration.ORIENTATION_LANDSCAPE;
- final JapaneseKeyboard japaneseKeyboard = JapaneseKeyboardTest.createJapaneseKeyboard(
+ final Keyboard keyboard = KeyboardTest.createKeyboard(
KeyboardSpecification.GODAN_KANA, getInstrumentation());
final Capture<SparseArray<float[]>> capture = new Capture<SparseArray<float[]>>();
StatisticsLoader loader = new StatisticsLoader(
new StatsFileAccessor() {
@Override
public InputStream openStream(
- JapaneseKeyboard japaneseKeyboardToLoad, Configuration configurationToLoad) {
- assertSame(japaneseKeyboard, japaneseKeyboardToLoad);
+ Keyboard keyboardToLoad, Configuration configurationToLoad) {
+ assertSame(keyboard, keyboardToLoad);
assertSame(configuration, configurationToLoad);
return testStream;
}},
- japaneseKeyboard,
+ keyboard,
configuration,
new UpdateStatsListener() {
@Override
public void updateStats(String formattedKeyboardName, SparseArray<float[]> stats) {
assertEquals(
- getFormattedKeyboardName(japaneseKeyboard, configuration),
+ getFormattedKeyboardName(keyboard, configuration),
formattedKeyboardName);
capture.setValue(stats);
}
@@ -184,12 +182,11 @@
new StatsFileAccessor() {
@Override
public InputStream openStream(
- JapaneseKeyboard japaneseKeyboard, Configuration configuration) throws IOException {
+ Keyboard keyboard, Configuration configuration) throws IOException {
throw new IOException("No file found");
}
},
- JapaneseKeyboardTest.createJapaneseKeyboard(KeyboardSpecification.GODAN_KANA,
- getInstrumentation()),
+ KeyboardTest.createKeyboard(KeyboardSpecification.GODAN_KANA, getInstrumentation()),
configuration,
new UpdateStatsListener() {
@Override
@@ -210,7 +207,7 @@
new StatsFileAccessor() {
@Override
public InputStream openStream(
- JapaneseKeyboard japaneseKeyboard, Configuration configuration) {
+ Keyboard keyboard, Configuration configuration) {
return new InputStream() {
@Override
public int read() throws IOException {
@@ -218,7 +215,7 @@
}
};
}},
- JapaneseKeyboardTest.createJapaneseKeyboard(
+ KeyboardTest.createKeyboard(
KeyboardSpecification.GODAN_KANA, getInstrumentation()),
configuration,
new UpdateStatsListener() {
@@ -273,29 +270,14 @@
@SmallTest
public void testSetJapaneseKeyboardWithNullConfig() {
- JapaneseKeyboard godanKana = JapaneseKeyboardTest.createJapaneseKeyboard(
+ Keyboard godanKana = KeyboardTest.createKeyboard(
KeyboardSpecification.GODAN_KANA, getInstrumentation());
ProbableKeyEventGuesser guesser = createFakeGuesser(0);
// JapaneseKeyboard == godanKana
// Configuration == null
- guesser.setJapaneseKeyboard(godanKana);
- guesser.setConfiguration(null);
-
- MoreAsserts.assertEmpty(
- guesser.getProbableKeyEvents(Arrays.asList(TouchEvent.getDefaultInstance())));
- }
-
- @SmallTest
- public void testSetConfigWithNullJanapaneseKeyboard() {
- Configuration configuration = new Configuration();
- configuration.orientation = Configuration.ORIENTATION_LANDSCAPE;
- ProbableKeyEventGuesser guesser = createFakeGuesser(0);
-
- // JapaneseKeyboard == null
- // Configuration == non-null
- guesser.setJapaneseKeyboard(null);
- guesser.setConfiguration(configuration);
+ guesser.setKeyboard(godanKana);
+ guesser.setConfiguration(Optional.<Configuration>absent());
MoreAsserts.assertEmpty(
guesser.getProbableKeyEvents(Arrays.asList(TouchEvent.getDefaultInstance())));
@@ -305,16 +287,16 @@
public void testNonExistentJanapaneseKeyboard() {
// This test expects that HARDWARE_QWERTY_ALPHABET doesn't have corresponding
// typing correction stats.
- JapaneseKeyboard keyboard =
- new JapaneseKeyboard(
+ Keyboard keyboard =
+ new Keyboard(
Optional.<String>absent(),
Collections.<Row>emptyList(), 0f, KeyboardSpecification.HARDWARE_QWERTY_ALPHABET);
Configuration configuration = new Configuration();
configuration.orientation = Configuration.ORIENTATION_LANDSCAPE;
ProbableKeyEventGuesser guesser = createFakeGuesser(0);
- guesser.setConfiguration(configuration);
- guesser.setJapaneseKeyboard(keyboard);
+ guesser.setConfiguration(Optional.of(configuration));
+ guesser.setKeyboard(keyboard);
MoreAsserts.assertEmpty(
guesser.getProbableKeyEvents(Arrays.asList(TouchEvent.getDefaultInstance())));
@@ -322,44 +304,43 @@
@SmallTest
public void testCorrectKeyboard() {
- JapaneseKeyboard godanKana = JapaneseKeyboardTest.createJapaneseKeyboard(
+ Keyboard godanKana = KeyboardTest.createKeyboard(
KeyboardSpecification.GODAN_KANA, getInstrumentation());
Configuration configuration = new Configuration();
configuration.orientation = Configuration.ORIENTATION_LANDSCAPE;
ProbableKeyEventGuesser guesser = createFakeGuesser(Double.NEGATIVE_INFINITY);
- guesser.setConfiguration(configuration);
- guesser.setJapaneseKeyboard(godanKana);
+ guesser.setConfiguration(Optional.of(configuration));
+ guesser.setKeyboard(godanKana);
MoreAsserts.assertNotEmpty(guesser.getProbableKeyEvents(TOUCH_DOWN_UP_EVENT_LIST));
}
@SmallTest
public void testFilterLessProbableEvents() {
- JapaneseKeyboard godanKana = JapaneseKeyboardTest.createJapaneseKeyboard(
+ Keyboard godanKana = KeyboardTest.createKeyboard(
KeyboardSpecification.GODAN_KANA, getInstrumentation());
Configuration configuration = new Configuration();
configuration.orientation = Configuration.ORIENTATION_LANDSCAPE;
ProbableKeyEventGuesser guesser = createFakeGuesser(Double.POSITIVE_INFINITY);
- guesser.setConfiguration(configuration);
- guesser.setJapaneseKeyboard(godanKana);
+ guesser.setConfiguration(Optional.of(configuration));
+ guesser.setKeyboard(godanKana);
MoreAsserts.assertEmpty(guesser.getProbableKeyEvents(TOUCH_DOWN_UP_EVENT_LIST));
}
@SmallTest
public void testEmptyTouchEvent() {
- JapaneseKeyboard godanKana = JapaneseKeyboardTest.createJapaneseKeyboard(
+ Keyboard godanKana = KeyboardTest.createKeyboard(
KeyboardSpecification.GODAN_KANA, getInstrumentation());
Configuration configuration = new Configuration();
configuration.orientation = Configuration.ORIENTATION_LANDSCAPE;
ProbableKeyEventGuesser guesser = createFakeGuesser(0);
- guesser.setConfiguration(configuration);
- guesser.setJapaneseKeyboard(godanKana);
+ guesser.setConfiguration(Optional.of(configuration));
+ guesser.setKeyboard(godanKana);
- MoreAsserts.assertEmpty(guesser.getProbableKeyEvents(null));
MoreAsserts.assertEmpty(guesser.getProbableKeyEvents(Collections.<TouchEvent>emptyList()));
MoreAsserts.assertEmpty(guesser.getProbableKeyEvents(
Collections.<TouchEvent>singletonList(TouchEvent.getDefaultInstance())));
@@ -367,7 +348,7 @@
@SmallTest
public void testVariousStatistics() {
- final JapaneseKeyboard godanKana = JapaneseKeyboardTest.createJapaneseKeyboard(
+ final Keyboard godanKana = KeyboardTest.createKeyboard(
KeyboardSpecification.GODAN_KANA, getInstrumentation());
final Configuration configuration = new Configuration();
configuration.orientation = Configuration.ORIENTATION_LANDSCAPE;
@@ -453,9 +434,8 @@
for (final TestData testData : testDataList) {
StatsFileAccessor assetManager = new StatsFileAccessor() {
@Override
- public InputStream openStream(
- JapaneseKeyboard japaneseKeyboardToLoad, Configuration configurationToLoad) {
- assertSame(godanKana, japaneseKeyboardToLoad);
+ public InputStream openStream(Keyboard keyboardToLoad, Configuration configurationToLoad) {
+ assertSame(godanKana, keyboardToLoad);
assertSame(configuration, configurationToLoad);
return createStream(testData.sourceIds, testData.stats);
}
@@ -468,8 +448,8 @@
new BlockingThreadPoolExecutor(),
new BlockingExecutor(),
fakeCalculator);
- guesser.setConfiguration(configuration);
- guesser.setJapaneseKeyboard(godanKana);
+ guesser.setConfiguration(Optional.of(configuration));
+ guesser.setKeyboard(godanKana);
List<TouchEvent> touchEventList =
Collections.singletonList(
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/model/JapaneseSoftwareKeyboardModelTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/model/JapaneseSoftwareKeyboardModelTest.java
index 0fc202c..6a246ab 100644
--- a/src/android/tests/src/com/google/android/inputmethod/japanese/model/JapaneseSoftwareKeyboardModelTest.java
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/model/JapaneseSoftwareKeyboardModelTest.java
@@ -29,7 +29,7 @@
package org.mozc.android.inputmethod.japanese.model;
-import org.mozc.android.inputmethod.japanese.JapaneseKeyboard.KeyboardSpecification;
+import org.mozc.android.inputmethod.japanese.keyboard.Keyboard.KeyboardSpecification;
import org.mozc.android.inputmethod.japanese.model.JapaneseSoftwareKeyboardModel.KeyboardMode;
import org.mozc.android.inputmethod.japanese.preference.ClientSidePreference.InputStyle;
import org.mozc.android.inputmethod.japanese.preference.ClientSidePreference.KeyboardLayout;
@@ -99,42 +99,6 @@
new TestData(KeyboardLayout.TWELVE_KEYS, KeyboardMode.ALPHABET,
InputStyle.TOGGLE_FLICK, true,
KeyboardSpecification.TWELVE_KEY_TOGGLE_QWERTY_ALPHABET),
- new TestData(KeyboardLayout.TWELVE_KEYS, KeyboardMode.KANA_NUMBER,
- InputStyle.TOGGLE, false,
- KeyboardSpecification.TWELVE_KEY_TOGGLE_NUMBER),
- new TestData(KeyboardLayout.TWELVE_KEYS, KeyboardMode.KANA_NUMBER,
- InputStyle.TOGGLE, true,
- KeyboardSpecification.TWELVE_KEY_TOGGLE_NUMBER),
- new TestData(KeyboardLayout.TWELVE_KEYS, KeyboardMode.KANA_NUMBER,
- InputStyle.FLICK, false,
- KeyboardSpecification.TWELVE_KEY_FLICK_NUMBER),
- new TestData(KeyboardLayout.TWELVE_KEYS, KeyboardMode.KANA_NUMBER,
- InputStyle.FLICK, true,
- KeyboardSpecification.TWELVE_KEY_FLICK_NUMBER),
- new TestData(KeyboardLayout.TWELVE_KEYS, KeyboardMode.KANA_NUMBER,
- InputStyle.TOGGLE_FLICK, false,
- KeyboardSpecification.TWELVE_KEY_TOGGLE_FLICK_NUMBER),
- new TestData(KeyboardLayout.TWELVE_KEYS, KeyboardMode.KANA_NUMBER,
- InputStyle.TOGGLE_FLICK, true,
- KeyboardSpecification.TWELVE_KEY_TOGGLE_FLICK_NUMBER),
- new TestData(KeyboardLayout.TWELVE_KEYS, KeyboardMode.ALPHABET_NUMBER,
- InputStyle.TOGGLE, false,
- KeyboardSpecification.TWELVE_KEY_TOGGLE_ALPHABET),
- new TestData(KeyboardLayout.TWELVE_KEYS, KeyboardMode.ALPHABET_NUMBER,
- InputStyle.TOGGLE, true,
- KeyboardSpecification.QWERTY_ALPHABET_NUMBER),
- new TestData(KeyboardLayout.TWELVE_KEYS, KeyboardMode.ALPHABET_NUMBER,
- InputStyle.FLICK, false,
- KeyboardSpecification.TWELVE_KEY_FLICK_ALPHABET),
- new TestData(KeyboardLayout.TWELVE_KEYS, KeyboardMode.ALPHABET_NUMBER,
- InputStyle.FLICK, true,
- KeyboardSpecification.QWERTY_ALPHABET_NUMBER),
- new TestData(KeyboardLayout.TWELVE_KEYS, KeyboardMode.ALPHABET_NUMBER,
- InputStyle.TOGGLE_FLICK, false,
- KeyboardSpecification.TWELVE_KEY_TOGGLE_FLICK_ALPHABET),
- new TestData(KeyboardLayout.TWELVE_KEYS, KeyboardMode.ALPHABET_NUMBER,
- InputStyle.TOGGLE_FLICK, true,
- KeyboardSpecification.QWERTY_ALPHABET_NUMBER),
new TestData(KeyboardLayout.QWERTY, KeyboardMode.KANA,
InputStyle.TOGGLE, false,
@@ -172,42 +136,6 @@
new TestData(KeyboardLayout.QWERTY, KeyboardMode.ALPHABET,
InputStyle.TOGGLE_FLICK, true,
KeyboardSpecification.QWERTY_ALPHABET),
- new TestData(KeyboardLayout.QWERTY, KeyboardMode.KANA_NUMBER,
- InputStyle.TOGGLE, false,
- KeyboardSpecification.QWERTY_KANA_NUMBER),
- new TestData(KeyboardLayout.QWERTY, KeyboardMode.KANA_NUMBER,
- InputStyle.TOGGLE, true,
- KeyboardSpecification.QWERTY_KANA_NUMBER),
- new TestData(KeyboardLayout.QWERTY, KeyboardMode.KANA_NUMBER,
- InputStyle.FLICK, false,
- KeyboardSpecification.QWERTY_KANA_NUMBER),
- new TestData(KeyboardLayout.QWERTY, KeyboardMode.KANA_NUMBER,
- InputStyle.FLICK, true,
- KeyboardSpecification.QWERTY_KANA_NUMBER),
- new TestData(KeyboardLayout.QWERTY, KeyboardMode.KANA_NUMBER,
- InputStyle.TOGGLE_FLICK, false,
- KeyboardSpecification.QWERTY_KANA_NUMBER),
- new TestData(KeyboardLayout.QWERTY, KeyboardMode.KANA_NUMBER,
- InputStyle.TOGGLE_FLICK, true,
- KeyboardSpecification.QWERTY_KANA_NUMBER),
- new TestData(KeyboardLayout.QWERTY, KeyboardMode.ALPHABET_NUMBER,
- InputStyle.TOGGLE, false,
- KeyboardSpecification.QWERTY_ALPHABET_NUMBER),
- new TestData(KeyboardLayout.QWERTY, KeyboardMode.ALPHABET_NUMBER,
- InputStyle.TOGGLE, true,
- KeyboardSpecification.QWERTY_ALPHABET_NUMBER),
- new TestData(KeyboardLayout.QWERTY, KeyboardMode.ALPHABET_NUMBER,
- InputStyle.FLICK, false,
- KeyboardSpecification.QWERTY_ALPHABET_NUMBER),
- new TestData(KeyboardLayout.QWERTY, KeyboardMode.ALPHABET_NUMBER,
- InputStyle.FLICK, true,
- KeyboardSpecification.QWERTY_ALPHABET_NUMBER),
- new TestData(KeyboardLayout.QWERTY, KeyboardMode.ALPHABET_NUMBER,
- InputStyle.TOGGLE_FLICK, false,
- KeyboardSpecification.QWERTY_ALPHABET_NUMBER),
- new TestData(KeyboardLayout.QWERTY, KeyboardMode.ALPHABET_NUMBER,
- InputStyle.TOGGLE_FLICK, true,
- KeyboardSpecification.QWERTY_ALPHABET_NUMBER),
new TestData(KeyboardLayout.GODAN, KeyboardMode.KANA,
InputStyle.TOGGLE, false,
@@ -245,24 +173,81 @@
new TestData(KeyboardLayout.GODAN, KeyboardMode.ALPHABET,
InputStyle.TOGGLE_FLICK, true,
KeyboardSpecification.QWERTY_ALPHABET),
- new TestData(KeyboardLayout.GODAN, KeyboardMode.ALPHABET_NUMBER,
+
+ new TestData(KeyboardLayout.TWELVE_KEYS, KeyboardMode.NUMBER,
InputStyle.TOGGLE, false,
- KeyboardSpecification.QWERTY_ALPHABET_NUMBER),
- new TestData(KeyboardLayout.GODAN, KeyboardMode.ALPHABET_NUMBER,
+ KeyboardSpecification.NUMBER),
+ new TestData(KeyboardLayout.TWELVE_KEYS, KeyboardMode.NUMBER,
InputStyle.TOGGLE, true,
- KeyboardSpecification.QWERTY_ALPHABET_NUMBER),
- new TestData(KeyboardLayout.GODAN, KeyboardMode.ALPHABET_NUMBER,
+ KeyboardSpecification.NUMBER),
+ new TestData(KeyboardLayout.TWELVE_KEYS, KeyboardMode.NUMBER,
InputStyle.FLICK, false,
- KeyboardSpecification.QWERTY_ALPHABET_NUMBER),
- new TestData(KeyboardLayout.GODAN, KeyboardMode.ALPHABET_NUMBER,
+ KeyboardSpecification.NUMBER),
+ new TestData(KeyboardLayout.TWELVE_KEYS, KeyboardMode.NUMBER,
InputStyle.FLICK, true,
- KeyboardSpecification.QWERTY_ALPHABET_NUMBER),
- new TestData(KeyboardLayout.GODAN, KeyboardMode.ALPHABET_NUMBER,
+ KeyboardSpecification.NUMBER),
+ new TestData(KeyboardLayout.TWELVE_KEYS, KeyboardMode.NUMBER,
InputStyle.TOGGLE_FLICK, false,
- KeyboardSpecification.QWERTY_ALPHABET_NUMBER),
- new TestData(KeyboardLayout.GODAN, KeyboardMode.ALPHABET_NUMBER,
+ KeyboardSpecification.NUMBER),
+ new TestData(KeyboardLayout.TWELVE_KEYS, KeyboardMode.NUMBER,
InputStyle.TOGGLE_FLICK, true,
- KeyboardSpecification.QWERTY_ALPHABET_NUMBER),
+ KeyboardSpecification.NUMBER),
+ new TestData(KeyboardLayout.TWELVE_KEYS, KeyboardMode.NUMBER,
+ InputStyle.TOGGLE, false,
+ KeyboardSpecification.NUMBER),
+ new TestData(KeyboardLayout.TWELVE_KEYS, KeyboardMode.NUMBER,
+ InputStyle.TOGGLE, true,
+ KeyboardSpecification.NUMBER),
+ new TestData(KeyboardLayout.TWELVE_KEYS, KeyboardMode.NUMBER,
+ InputStyle.FLICK, false,
+ KeyboardSpecification.NUMBER),
+ new TestData(KeyboardLayout.TWELVE_KEYS, KeyboardMode.NUMBER,
+ InputStyle.FLICK, true,
+ KeyboardSpecification.NUMBER),
+ new TestData(KeyboardLayout.TWELVE_KEYS, KeyboardMode.NUMBER,
+ InputStyle.TOGGLE_FLICK, false,
+ KeyboardSpecification.NUMBER),
+ new TestData(KeyboardLayout.TWELVE_KEYS, KeyboardMode.NUMBER,
+ InputStyle.TOGGLE_FLICK, true,
+ KeyboardSpecification.NUMBER),
+
+ new TestData(KeyboardLayout.TWELVE_KEYS, KeyboardMode.SYMBOL_NUMBER,
+ InputStyle.TOGGLE, false,
+ KeyboardSpecification.SYMBOL_NUMBER),
+ new TestData(KeyboardLayout.TWELVE_KEYS, KeyboardMode.SYMBOL_NUMBER,
+ InputStyle.TOGGLE, true,
+ KeyboardSpecification.SYMBOL_NUMBER),
+ new TestData(KeyboardLayout.TWELVE_KEYS, KeyboardMode.SYMBOL_NUMBER,
+ InputStyle.FLICK, false,
+ KeyboardSpecification.SYMBOL_NUMBER),
+ new TestData(KeyboardLayout.TWELVE_KEYS, KeyboardMode.SYMBOL_NUMBER,
+ InputStyle.FLICK, true,
+ KeyboardSpecification.SYMBOL_NUMBER),
+ new TestData(KeyboardLayout.TWELVE_KEYS, KeyboardMode.SYMBOL_NUMBER,
+ InputStyle.TOGGLE_FLICK, false,
+ KeyboardSpecification.SYMBOL_NUMBER),
+ new TestData(KeyboardLayout.TWELVE_KEYS, KeyboardMode.SYMBOL_NUMBER,
+ InputStyle.TOGGLE_FLICK, true,
+ KeyboardSpecification.SYMBOL_NUMBER),
+ new TestData(KeyboardLayout.TWELVE_KEYS, KeyboardMode.SYMBOL_NUMBER,
+ InputStyle.TOGGLE, false,
+ KeyboardSpecification.SYMBOL_NUMBER),
+ new TestData(KeyboardLayout.TWELVE_KEYS, KeyboardMode.SYMBOL_NUMBER,
+ InputStyle.TOGGLE, true,
+ KeyboardSpecification.SYMBOL_NUMBER),
+ new TestData(KeyboardLayout.TWELVE_KEYS, KeyboardMode.SYMBOL_NUMBER,
+ InputStyle.FLICK, false,
+ KeyboardSpecification.SYMBOL_NUMBER),
+ new TestData(KeyboardLayout.TWELVE_KEYS, KeyboardMode.SYMBOL_NUMBER,
+ InputStyle.FLICK, true,
+ KeyboardSpecification.SYMBOL_NUMBER),
+ new TestData(KeyboardLayout.TWELVE_KEYS, KeyboardMode.SYMBOL_NUMBER,
+ InputStyle.TOGGLE_FLICK, false,
+ KeyboardSpecification.SYMBOL_NUMBER),
+ new TestData(KeyboardLayout.TWELVE_KEYS, KeyboardMode.SYMBOL_NUMBER,
+ InputStyle.TOGGLE_FLICK, true,
+ KeyboardSpecification.SYMBOL_NUMBER),
+
};
JapaneseSoftwareKeyboardModel model = new JapaneseSoftwareKeyboardModel();
@@ -289,19 +274,17 @@
}
TestData[] testDataListForTwelveKeys = {
- new TestData(InputType.TYPE_CLASS_DATETIME, KeyboardMode.KANA_NUMBER),
+ new TestData(InputType.TYPE_CLASS_DATETIME, KeyboardMode.NUMBER),
new TestData(InputType.TYPE_CLASS_DATETIME | InputType.TYPE_DATETIME_VARIATION_DATE,
- KeyboardMode.KANA_NUMBER),
+ KeyboardMode.NUMBER),
new TestData(InputType.TYPE_CLASS_DATETIME | InputType.TYPE_DATETIME_VARIATION_NORMAL,
- KeyboardMode.KANA_NUMBER),
+ KeyboardMode.NUMBER),
new TestData(InputType.TYPE_CLASS_DATETIME | InputType.TYPE_DATETIME_VARIATION_TIME,
- KeyboardMode.KANA_NUMBER),
- new TestData(InputType.TYPE_CLASS_NUMBER, KeyboardMode.KANA_NUMBER),
- new TestData(InputType.TYPE_CLASS_PHONE, KeyboardMode.KANA_NUMBER),
- new TestData(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS,
- null),
- new TestData(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_EMAIL_SUBJECT,
- null),
+ KeyboardMode.NUMBER),
+ new TestData(InputType.TYPE_CLASS_NUMBER, KeyboardMode.NUMBER),
+ new TestData(InputType.TYPE_CLASS_PHONE, KeyboardMode.NUMBER),
+ new TestData(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS, null),
+ new TestData(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_EMAIL_SUBJECT, null),
new TestData(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_FILTER, null),
new TestData(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_LONG_MESSAGE, null),
new TestData(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_NORMAL, null),
@@ -311,14 +294,11 @@
new TestData(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PHONETIC, null),
new TestData(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_POSTAL_ADDRESS,
null),
- new TestData(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_SHORT_MESSAGE,
- null),
- new TestData(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_URI,
- null),
+ new TestData(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_SHORT_MESSAGE, null),
+ new TestData(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_URI, null),
new TestData(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD,
KeyboardMode.ALPHABET),
- new TestData(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_WEB_EDIT_TEXT,
- null),
+ new TestData(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_WEB_EDIT_TEXT, null),
new TestData(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_WEB_EMAIL_ADDRESS,
KeyboardMode.ALPHABET),
new TestData(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_WEB_PASSWORD,
@@ -357,19 +337,17 @@
}
TestData[] testDataListForQwertyAndGodan = {
- new TestData(InputType.TYPE_CLASS_DATETIME, KeyboardMode.ALPHABET_NUMBER),
+ new TestData(InputType.TYPE_CLASS_DATETIME, KeyboardMode.NUMBER),
new TestData(InputType.TYPE_CLASS_DATETIME | InputType.TYPE_DATETIME_VARIATION_DATE,
- KeyboardMode.ALPHABET_NUMBER),
+ KeyboardMode.NUMBER),
new TestData(InputType.TYPE_CLASS_DATETIME | InputType.TYPE_DATETIME_VARIATION_NORMAL,
- KeyboardMode.ALPHABET_NUMBER),
+ KeyboardMode.NUMBER),
new TestData(InputType.TYPE_CLASS_DATETIME | InputType.TYPE_DATETIME_VARIATION_TIME,
- KeyboardMode.ALPHABET_NUMBER),
- new TestData(InputType.TYPE_CLASS_NUMBER, KeyboardMode.ALPHABET_NUMBER),
- new TestData(InputType.TYPE_CLASS_PHONE, KeyboardMode.ALPHABET_NUMBER),
- new TestData(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS,
- null),
- new TestData(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_EMAIL_SUBJECT,
- null),
+ KeyboardMode.NUMBER),
+ new TestData(InputType.TYPE_CLASS_NUMBER, KeyboardMode.NUMBER),
+ new TestData(InputType.TYPE_CLASS_PHONE, KeyboardMode.NUMBER),
+ new TestData(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS, null),
+ new TestData(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_EMAIL_SUBJECT, null),
new TestData(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_FILTER, null),
new TestData(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_LONG_MESSAGE, null),
new TestData(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_NORMAL, null),
@@ -379,19 +357,18 @@
new TestData(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PHONETIC, null),
new TestData(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_POSTAL_ADDRESS,
null),
- new TestData(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_SHORT_MESSAGE,
- null),
+ new TestData(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_SHORT_MESSAGE, null),
new TestData(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_URI, null),
new TestData(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD,
KeyboardMode.ALPHABET),
- new TestData(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_WEB_EDIT_TEXT,
- null),
+ new TestData(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_WEB_EDIT_TEXT, null),
new TestData(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_WEB_EMAIL_ADDRESS,
KeyboardMode.ALPHABET),
new TestData(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_WEB_PASSWORD,
KeyboardMode.ALPHABET),
};
+
// Reset to qwerty.
model.setInputType(InputType.TYPE_NULL);
model.setKeyboardLayout(KeyboardLayout.QWERTY);
@@ -463,7 +440,7 @@
model.setKeyboardLayout(KeyboardLayout.TWELVE_KEYS);
model.setKeyboardMode(KeyboardMode.KANA);
model.setInputType(InputType.TYPE_CLASS_NUMBER);
- assertEquals(KeyboardMode.KANA_NUMBER, model.getKeyboardMode());
+ assertEquals(KeyboardMode.NUMBER, model.getKeyboardMode());
model.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
assertEquals(KeyboardMode.ALPHABET, model.getKeyboardMode());
model.setInputType(InputType.TYPE_NULL);
@@ -472,8 +449,8 @@
model.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
assertEquals(KeyboardMode.ALPHABET, model.getKeyboardMode());
- model.setKeyboardMode(KeyboardMode.KANA_NUMBER);
- assertEquals(KeyboardMode.KANA_NUMBER, model.getKeyboardMode());
+ model.setKeyboardMode(KeyboardMode.SYMBOL_NUMBER);
+ assertEquals(KeyboardMode.SYMBOL_NUMBER, model.getKeyboardMode());
// Even after the keyboard mode overwriting, the keyboard mode should be revereted before
// input-type-setting.
model.setInputType(InputType.TYPE_NULL);
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/model/SymbolMajorCategoryTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/model/SymbolMajorCategoryTest.java
index 718fd12..f09779a 100644
--- a/src/android/tests/src/com/google/android/inputmethod/japanese/model/SymbolMajorCategoryTest.java
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/model/SymbolMajorCategoryTest.java
@@ -50,6 +50,9 @@
} else if (minorCategory.name().startsWith("EMOJI")) {
assertEquals(SymbolMajorCategory.EMOJI,
SymbolMajorCategory.findMajorCategory(minorCategory));
+ } else if (minorCategory == SymbolMinorCategory.NUMBER) {
+ assertEquals(SymbolMajorCategory.NUMBER,
+ SymbolMajorCategory.findMajorCategory(minorCategory));
} else {
fail("Unexpected category name");
}
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/mushroom/MushroomUtilTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/mushroom/MushroomUtilTest.java
index e1515f3..441ee09 100644
--- a/src/android/tests/src/com/google/android/inputmethod/japanese/mushroom/MushroomUtilTest.java
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/mushroom/MushroomUtilTest.java
@@ -38,6 +38,7 @@
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
+import android.test.mock.MockPackageManager;
import org.easymock.Capture;
@@ -48,7 +49,7 @@
*/
public class MushroomUtilTest extends InstrumentationTestCaseWithMock {
public void testGetMushroomApplicationList() {
- PackageManager manager = createMock(PackageManager.class);
+ PackageManager manager = createMock(MockPackageManager.class);
Capture<Intent> intentCapture = new Capture<Intent>();
List<ResolveInfo> result = Collections.emptyList();
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/preference/ClearConversionHistoryDialogPreferenceTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/preference/ClearConversionHistoryDialogPreferenceTest.java
index 1d8c3d0..6ae8797 100644
--- a/src/android/tests/src/com/google/android/inputmethod/japanese/preference/ClearConversionHistoryDialogPreferenceTest.java
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/preference/ClearConversionHistoryDialogPreferenceTest.java
@@ -32,6 +32,7 @@
import org.mozc.android.inputmethod.japanese.resources.R;
import org.mozc.android.inputmethod.japanese.session.SessionExecutor;
import org.mozc.android.inputmethod.japanese.testing.InstrumentationTestCaseWithMock;
+import com.google.common.base.Optional;
import android.content.Context;
import android.content.DialogInterface;
@@ -42,9 +43,10 @@
/**
*/
public class ClearConversionHistoryDialogPreferenceTest extends InstrumentationTestCaseWithMock {
+
private ClearConversionHistoryDialogPreference preference;
private SessionExecutor mockSessionExecutor;
- private SessionExecutor originalSessionExecutor;
+ private Optional<SessionExecutor> originalSessionExecutor = Optional.absent();
@Override
protected void setUp() throws Exception {
@@ -55,14 +57,14 @@
preference = new ClearConversionHistoryDialogPreference(context, attrs);
mockSessionExecutor = createMock(SessionExecutor.class);
- originalSessionExecutor = SessionExecutor.setInstanceForTest(mockSessionExecutor);
+ originalSessionExecutor = SessionExecutor.setInstanceForTest(Optional.of(mockSessionExecutor));
}
@Override
protected void tearDown() throws Exception {
SessionExecutor.setInstanceForTest(originalSessionExecutor);
- originalSessionExecutor = null;
+ originalSessionExecutor = Optional.absent();
mockSessionExecutor = null;
preference = null;
super.tearDown();
@@ -77,13 +79,14 @@
private void doTestOnClick(boolean expectOnClickToFire, int button) {
resetAll();
+ DialogInterface dialogMock = createNiceMock(DialogInterface.class);
if (expectOnClickToFire) {
mockSessionExecutor.clearUserHistory();
mockSessionExecutor.clearUserPrediction();
}
replayAll();
- preference.onClick(null, button);
+ preference.onClick(dialogMock, button);
verifyAll();
}
}
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/preference/ClearSymbolHistoryDialogPreferenceTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/preference/ClearSymbolHistoryDialogPreferenceTest.java
index f0b694f..c18e624 100644
--- a/src/android/tests/src/com/google/android/inputmethod/japanese/preference/ClearSymbolHistoryDialogPreferenceTest.java
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/preference/ClearSymbolHistoryDialogPreferenceTest.java
@@ -33,6 +33,7 @@
import org.mozc.android.inputmethod.japanese.resources.R;
import org.mozc.android.inputmethod.japanese.session.SessionExecutor;
import org.mozc.android.inputmethod.japanese.testing.InstrumentationTestCaseWithMock;
+import com.google.common.base.Optional;
import android.content.Context;
import android.content.DialogInterface;
@@ -43,9 +44,10 @@
/**
*/
public class ClearSymbolHistoryDialogPreferenceTest extends InstrumentationTestCaseWithMock {
+
private ClearSymbolHistoryDialogPreference preference;
private SessionExecutor mockSessionExecutor;
- private SessionExecutor originalSessionExecutor;
+ private Optional<SessionExecutor> originalSessionExecutor = Optional.absent();
@Override
protected void setUp() throws Exception {
@@ -55,14 +57,14 @@
preference = new ClearSymbolHistoryDialogPreference(context, attrs);
mockSessionExecutor = createMock(SessionExecutor.class);
- originalSessionExecutor = SessionExecutor.setInstanceForTest(mockSessionExecutor);
+ originalSessionExecutor = SessionExecutor.setInstanceForTest(Optional.of(mockSessionExecutor));
}
@Override
protected void tearDown() throws Exception {
SessionExecutor.setInstanceForTest(originalSessionExecutor);
- originalSessionExecutor = null;
+ originalSessionExecutor = Optional.absent();
mockSessionExecutor = null;
preference = null;
super.tearDown();
@@ -77,6 +79,7 @@
private void doTestOnClick(boolean expectOnClickToFire, int button) {
resetAll();
+ DialogInterface dialogMock = createNiceMock(DialogInterface.class);
if (expectOnClickToFire) {
mockSessionExecutor.clearStorage(StorageType.EMOJI_HISTORY);
mockSessionExecutor.clearStorage(StorageType.EMOTICON_HISTORY);
@@ -84,7 +87,7 @@
}
replayAll();
- preference.onClick(null, button);
+ preference.onClick(dialogMock, button);
verifyAll();
}
}
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/preference/ClearUserDictionaryDialogPreferenceTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/preference/ClearUserDictionaryDialogPreferenceTest.java
index dc5fb12..b5f00b9 100644
--- a/src/android/tests/src/com/google/android/inputmethod/japanese/preference/ClearUserDictionaryDialogPreferenceTest.java
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/preference/ClearUserDictionaryDialogPreferenceTest.java
@@ -37,6 +37,7 @@
import org.mozc.android.inputmethod.japanese.resources.R;
import org.mozc.android.inputmethod.japanese.session.SessionExecutor;
import org.mozc.android.inputmethod.japanese.testing.InstrumentationTestCaseWithMock;
+import com.google.common.base.Optional;
import android.content.Context;
import android.content.DialogInterface;
@@ -47,9 +48,10 @@
/**
*/
public class ClearUserDictionaryDialogPreferenceTest extends InstrumentationTestCaseWithMock {
+
private ClearUserDictionaryDialogPreference preference;
private SessionExecutor mockSessionExecutor;
- private SessionExecutor originalSessionExecutor;
+ private Optional<SessionExecutor> originalSessionExecutor = Optional.absent();
@Override
protected void setUp() throws Exception {
@@ -59,14 +61,14 @@
preference = new ClearUserDictionaryDialogPreference(context, attrs);
mockSessionExecutor = createMock(SessionExecutor.class);
- originalSessionExecutor = SessionExecutor.setInstanceForTest(mockSessionExecutor);
+ originalSessionExecutor = SessionExecutor.setInstanceForTest(Optional.of(mockSessionExecutor));
}
@Override
protected void tearDown() throws Exception {
SessionExecutor.setInstanceForTest(originalSessionExecutor);
- originalSessionExecutor = null;
+ originalSessionExecutor = Optional.absent();
mockSessionExecutor = null;
preference = null;
super.tearDown();
@@ -81,6 +83,7 @@
private void doTestOnClick(boolean expectOnClickToFire, int button) {
resetAll();
+ DialogInterface dialogMock = createNiceMock(DialogInterface.class);
if (expectOnClickToFire) {
expect(mockSessionExecutor.sendUserDictionaryCommand(
UserDictionaryCommand.newBuilder()
@@ -90,7 +93,7 @@
}
replayAll();
- preference.onClick(null, button);
+ preference.onClick(dialogMock, button);
verifyAll();
}
}
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/preference/ClientSidePreferenceTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/preference/ClientSidePreferenceTest.java
index 2001d1c..e755952 100644
--- a/src/android/tests/src/com/google/android/inputmethod/japanese/preference/ClientSidePreferenceTest.java
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/preference/ClientSidePreferenceTest.java
@@ -32,12 +32,14 @@
import org.mozc.android.inputmethod.japanese.ViewManagerInterface.LayoutAdjustment;
import org.mozc.android.inputmethod.japanese.preference.ClientSidePreference.InputStyle;
import org.mozc.android.inputmethod.japanese.preference.ClientSidePreference.KeyboardLayout;
+import org.mozc.android.inputmethod.japanese.resources.R;
import org.mozc.android.inputmethod.japanese.testing.MozcPreferenceUtil;
import org.mozc.android.inputmethod.japanese.testing.Parameter;
import org.mozc.android.inputmethod.japanese.view.SkinType;
import android.content.SharedPreferences;
import android.content.res.Configuration;
+import android.content.res.Resources;
import android.test.InstrumentationTestCase;
import android.test.suitebuilder.annotation.SmallTest;
@@ -103,8 +105,11 @@
sharedPreferences, PreferenceUtil.PREF_LANDSCAPE_LAYOUT_ADJUSTMENT_KEY,
LANDSCAPE_LAYOUT_ADJUSTMENT.name());
+ Resources resources = getInstrumentation().getTargetContext().getResources();
MozcPreferenceUtil.updateSharedPreference(
- sharedPreferences, PreferenceUtil.PREF_SKIN_TYPE, SkinType.BLUE_LIGHTGRAY.name());
+ sharedPreferences,
+ resources.getString(R.string.pref_skin_type_key),
+ SkinType.BLUE_LIGHTGRAY.name());
class TestData extends Parameter {
final int orientation;
@@ -190,7 +195,7 @@
configuration.orientation = testData.orientation;
ClientSidePreference preference =
- new ClientSidePreference(sharedPreferences, configuration.orientation);
+ new ClientSidePreference(sharedPreferences, resources, configuration.orientation);
assertEquals(testData.toString(),
testData.expectedKeyboardLayout, preference.getKeyboardLayout());
assertEquals(testData.toString(),
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/preference/MiniBrowserActivityTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/preference/MiniBrowserActivityTest.java
index d8e0cb7..214654e 100644
--- a/src/android/tests/src/com/google/android/inputmethod/japanese/preference/MiniBrowserActivityTest.java
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/preference/MiniBrowserActivityTest.java
@@ -45,6 +45,8 @@
import android.content.res.Resources;
import android.net.Uri;
import android.test.UiThreadTest;
+import android.test.mock.MockContext;
+import android.test.mock.MockPackageManager;
import android.test.suitebuilder.annotation.SmallTest;
import android.webkit.WebView;
@@ -98,8 +100,8 @@
for (boolean isDefaultBrowserExistent : new boolean[] {true, false}) {
MozcLog.i(testData.toString());
resetAll();
- PackageManager packageManager = createNiceMock(PackageManager.class);
- Context context = createNiceMock(Context.class);
+ PackageManager packageManager = createNiceMock(MockPackageManager.class);
+ Context context = createNiceMock(MockContext.class);
Capture<Intent> queryIntentCapture = new Capture<Intent>();
Capture<Intent> activityIntentCapture = new Capture<Intent>();
if (testData.expectedDelegate) {
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/preference/PreferenceUtilTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/preference/PreferenceUtilTest.java
index 6044642..981722c 100644
--- a/src/android/tests/src/com/google/android/inputmethod/japanese/preference/PreferenceUtilTest.java
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/preference/PreferenceUtilTest.java
@@ -49,6 +49,7 @@
import android.preference.Preference;
import android.preference.Preference.OnPreferenceChangeListener;
import android.preference.PreferenceGroup;
+import android.test.mock.MockContext;
import android.test.mock.MockResources;
import android.test.suitebuilder.annotation.SmallTest;
import android.util.AttributeSet;
@@ -151,7 +152,7 @@
.andStubReturn(prefLandscapeGroup);
expect(preferenceManager.findPreference(isA(String.class))).andStubReturn(null);
- Context contextMock = createMock(Context.class);
+ Context contextMock = createMock(MockContext.class);
Resources resources = createMock(MockResources.class);
expect(prefPortraitGroup.getContext()).andStubReturn(contextMock);
expect(contextMock.getResources()).andStubReturn(resources);
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/session/SessionExecutorTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/session/SessionExecutorTest.java
index 7eed5ec..70d027b 100644
--- a/src/android/tests/src/com/google/android/inputmethod/japanese/session/SessionExecutorTest.java
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/session/SessionExecutorTest.java
@@ -30,11 +30,11 @@
package org.mozc.android.inputmethod.japanese.session;
import static org.mozc.android.inputmethod.japanese.testing.MozcMatcher.matchesBuilder;
+import static org.mozc.android.inputmethod.japanese.testing.MozcMatcher.sameOptional;
import static org.easymock.EasyMock.anyLong;
import static org.easymock.EasyMock.capture;
import static org.easymock.EasyMock.expect;
import static org.easymock.EasyMock.getCurrentArguments;
-import static org.easymock.EasyMock.isNull;
import static org.easymock.EasyMock.same;
import org.mozc.android.inputmethod.japanese.KeycodeConverter;
@@ -84,6 +84,7 @@
import android.os.Looper;
import android.os.Message;
import android.preference.PreferenceManager;
+import android.test.mock.MockContext;
import android.test.suitebuilder.annotation.LargeTest;
import android.test.suitebuilder.annotation.SmallTest;
import android.view.KeyEvent;
@@ -100,6 +101,7 @@
*
*/
public class SessionExecutorTest extends InstrumentationTestCaseWithMock {
+
private SessionExecutor createSessionExecutorMock() {
return createMockBuilder(SessionExecutor.class)
.addMockedMethods("evaluateSynchronously", "evaluateAsynchronously")
@@ -108,12 +110,13 @@
@Override
protected void tearDown() throws Exception {
- SessionExecutor.instance = null;
+ SessionExecutor.instance = Optional.absent();
super.tearDown();
}
@SmallTest
public void testGetInstanceInitializedIfNecessary() {
+ Context context = new MockContext();
SessionHandlerFactory factory = createMockBuilder(SessionHandlerFactory.class)
.withConstructor(Context.class)
.withArgs(getInstrumentation().getTargetContext())
@@ -122,7 +125,7 @@
expect(factory.create()).andReturn(mockHandler);
replayAll();
- SessionExecutor instance = SessionExecutor.getInstanceInitializedIfNecessary(factory, null);
+ SessionExecutor instance = SessionExecutor.getInstanceInitializedIfNecessary(factory, context);
verifyAll();
@@ -130,7 +133,7 @@
resetAll();
replayAll();
- SessionExecutor instance2 = SessionExecutor.getInstanceInitializedIfNecessary(factory, null);
+ SessionExecutor instance2 = SessionExecutor.getInstanceInitializedIfNecessary(factory, context);
verifyAll();
@@ -140,12 +143,14 @@
@SmallTest
public void testCallbackInitializeSessionHandler() {
+ Context context = getInstrumentation().getContext();
SessionHandler sessionHandler = createMock(SessionHandler.class);
- sessionHandler.initialize(null);
+ sessionHandler.initialize(context);
replayAll();
ExecutorMainCallback callback = new ExecutorMainCallback(sessionHandler);
Message message = new Message();
+ message.obj = Object.class.cast(context);
message.what = ExecutorMainCallback.INITIALIZE_SESSION_HANDLER;
assertTrue(callback.handleMessage(message));
@@ -300,8 +305,9 @@
Capture<Message> messageCapture = new Capture<Message>();
expect(callbackHandler.sendMessageAtTime(capture(messageCapture), anyLong())).andReturn(true);
- AsynchronousEvaluationContext context =
- new AsynchronousEvaluationContext(0, inputBuilder, null, null, callbackHandler);
+ AsynchronousEvaluationContext context = new AsynchronousEvaluationContext(
+ 0, inputBuilder, Optional.<KeyEventInterface>absent(),
+ Optional.<EvaluationCallback>absent(), Optional.of(callbackHandler));
long sessionId = 1;
{
@@ -334,7 +340,7 @@
Message message = messageCapture.getValue();
assertEquals(data.expectedWhat, message.what);
assertSame(context, message.obj);
- assertNotNull(context.outCommand);
+ assertTrue(context.outCommand.isPresent());
currentHandler.removeMessages(ExecutorMainCallback.EVALUATE_KEYEVENT_ASYNCHRONOUSLY);
}
}
@@ -360,7 +366,7 @@
verifyAll();
assertEquals(0, countDownLatch.getCount());
- assertNotNull(context.outCommand);
+ assertTrue(context.outCommand.isPresent());
}
@SmallTest
@@ -388,7 +394,7 @@
ExecutorMainCallback callback = new ExecutorMainCallback(sessionHandler);
callback.sessionId = sessionId;
- callback.request = initialRequest;
+ callback.request = Optional.of(initialRequest);
callback.updateRequest(
Input.newBuilder().setRequest(diffRequest).addAllTouchEvents(touchEventList));
@@ -417,11 +423,13 @@
callbackHandler.cancelTimeStamp = 0;
EvaluationCallback evaluationCallback = createMock(EvaluationCallback.class);
- evaluationCallback.onCompleted(null, null);
+ evaluationCallback.onCompleted(
+ Optional.<Command>absent(), Optional.<KeyEventInterface>absent());
replayAll();
- AsynchronousEvaluationContext context =
- new AsynchronousEvaluationContext(1, null, null, evaluationCallback, callbackHandler);
+ AsynchronousEvaluationContext context = new AsynchronousEvaluationContext(
+ 1, Input.newBuilder(), Optional.<KeyEventInterface>absent(),
+ Optional.of(evaluationCallback), Optional.<Handler>of(callbackHandler));
Message message = callbackHandler.obtainMessage(CallbackHandler.UNSQUASHABLE_OUTPUT, context);
callbackHandler.handleMessage(message);
@@ -444,7 +452,7 @@
replayAll();
SessionExecutor executor = new SessionExecutor();
- executor.handler = handler;
+ executor.handler = Optional.of(handler);
executor.deleteSession();
@@ -460,21 +468,22 @@
replayAll();
SessionExecutor executor = new SessionExecutor();
- executor.handler = handler;
+ executor.handler = Optional.of(handler);
Input.Builder inputBuilder = Input.newBuilder();
KeyEventInterface keyEvent = KeycodeConverter.getKeyEventInterface(KeyEvent.KEYCODE_A);
- executor.evaluateAsynchronously(inputBuilder, keyEvent, null);
+ executor.evaluateAsynchronously(
+ inputBuilder, Optional.of(keyEvent), Optional.<EvaluationCallback>absent());
verifyAll();
Message message = messageCapture.getValue();
assertEquals(ExecutorMainCallback.EVALUATE_KEYEVENT_ASYNCHRONOUSLY, message.what);
AsynchronousEvaluationContext context = AsynchronousEvaluationContext.class.cast(message.obj);
assertSame(inputBuilder, context.inputBuilder);
- assertSame(keyEvent, context.triggeringKeyEvent);
- assertNull(context.callback);
- assertNull(context.callbackHandler);
+ assertSame(keyEvent, context.triggeringKeyEvent.get());
+ assertFalse(context.callback.isPresent());
+ assertFalse(context.callbackHandler.isPresent());
}
@SmallTest
@@ -485,20 +494,21 @@
replayAll();
SessionExecutor executor = new SessionExecutor();
- executor.handler = handler;
+ executor.handler = Optional.of(handler);
Input.Builder inputBuilder = Input.newBuilder();
- executor.evaluateAsynchronously(inputBuilder, null, null);
+ executor.evaluateAsynchronously(
+ inputBuilder, Optional.<KeyEventInterface>absent(), Optional.<EvaluationCallback>absent());
verifyAll();
Message message = messageCapture.getValue();
assertEquals(ExecutorMainCallback.EVALUATE_ASYNCHRONOUSLY, message.what);
AsynchronousEvaluationContext context = AsynchronousEvaluationContext.class.cast(message.obj);
assertSame(inputBuilder, context.inputBuilder);
- assertNull(context.triggeringKeyEvent);
- assertNull(context.callback);
- assertNull(context.callbackHandler);
+ assertFalse(context.triggeringKeyEvent.isPresent());
+ assertFalse(context.callback.isPresent());
+ assertFalse(context.callbackHandler.isPresent());
}
@SmallTest
@@ -516,10 +526,10 @@
Message message = Message.class.cast(getCurrentArguments()[0]);
SynchronousEvaluationContext context =
SynchronousEvaluationContext.class.cast(message.obj);
- context.outCommand = Command.newBuilder()
+ context.outCommand = Optional.of(Command.newBuilder()
.setInput(Input.newBuilder().setType(CommandType.NO_OPERATION).build())
.setOutput(Output.getDefaultInstance())
- .build();
+ .build());
context.evaluationSynchronizer.countDown();
return Boolean.TRUE;
}
@@ -528,7 +538,7 @@
replayAll();
SessionExecutor executor = new SessionExecutor();
- executor.handler = handler;
+ executor.handler = Optional.of(handler);
executor.evaluateSynchronously(Input.getDefaultInstance());
@@ -549,8 +559,8 @@
.setType(CommandType.SEND_KEY)
.setKey(mozcKeyEvent)
.addAllTouchEvents(touchEventList)),
- same(triggeringKeyEvent),
- same(evaluationCallback));
+ sameOptional(triggeringKeyEvent),
+ sameOptional(evaluationCallback));
replayAll();
executor.sendKey(mozcKeyEvent, triggeringKeyEvent, touchEventList, evaluationCallback);
@@ -567,8 +577,7 @@
.setType(CommandType.SEND_COMMAND)
.setCommand(SessionCommand.newBuilder()
.setType(SessionCommand.CommandType.SUBMIT))),
- isNull(KeyEventInterface.class),
- same(evaluationCallback));
+ same(Optional.<KeyEventInterface>absent()), sameOptional(evaluationCallback));
replayAll();
executor.submit(evaluationCallback);
@@ -579,17 +588,19 @@
@SmallTest
public void testSwitchInputMode() {
SessionExecutor executor = createSessionExecutorMock();
+ EvaluationCallback callback = createNiceMock(EvaluationCallback.class);
+
executor.evaluateAsynchronously(
matchesBuilder(Input.newBuilder()
.setType(CommandType.SEND_COMMAND)
.setCommand(SessionCommand.newBuilder()
.setType(SessionCommand.CommandType.SWITCH_INPUT_MODE)
.setCompositionMode(CompositionMode.DIRECT))),
- isNull(KeyEventInterface.class),
- isNull(EvaluationCallback.class));
+ same(Optional.<KeyEventInterface>absent()), sameOptional(callback));
replayAll();
- executor.switchInputMode(null, CompositionMode.DIRECT, null);
+ executor.switchInputMode(
+ Optional.<KeyEventInterface>absent(), CompositionMode.DIRECT, callback);
verifyAll();
}
@@ -604,16 +615,14 @@
.setCommand(SessionCommand.newBuilder()
.setType(SessionCommand.CommandType.SUBMIT_CANDIDATE)
.setId(3))),
- isNull(KeyEventInterface.class),
- same(evaluationCallback));
+ same(Optional.<KeyEventInterface>absent()), sameOptional(evaluationCallback));
executor.evaluateAsynchronously(
matchesBuilder(Input.newBuilder()
.setType(CommandType.SEND_COMMAND)
.setCommand(SessionCommand.newBuilder()
.setType(SessionCommand.CommandType.USAGE_STATS_EVENT)
.setUsageStatsEvent(UsageStatsEvent.SUBMITTED_CANDIDATE_ROW_GE10))),
- isNull(KeyEventInterface.class),
- isNull(EvaluationCallback.class));
+ same(Optional.<KeyEventInterface>absent()), same(Optional.<EvaluationCallback>absent()));
replayAll();
executor.submitCandidate(3, Optional.<Integer>of(100), evaluationCallback);
@@ -629,8 +638,7 @@
.setType(CommandType.SEND_COMMAND)
.setCommand(SessionCommand.newBuilder()
.setType(SessionCommand.CommandType.RESET_CONTEXT))),
- isNull(KeyEventInterface.class),
- isNull(EvaluationCallback.class));
+ same(Optional.<KeyEventInterface>absent()), same(Optional.<EvaluationCallback>absent()));
replayAll();
executor.resetContext();
@@ -649,8 +657,7 @@
SessionCommand.newBuilder()
.setType(ProtoCommands.SessionCommand.CommandType.MOVE_CURSOR)
.setCursorPosition(5))),
- isNull(KeyEventInterface.class),
- same(evaluationCallback));
+ same(Optional.<KeyEventInterface>absent()), sameOptional(evaluationCallback));
replayAll();
executor.moveCursor(5, evaluationCallback);
@@ -659,6 +666,32 @@
}
@SmallTest
+ public void testPageDownAndUp() {
+ SessionExecutor executor = createSessionExecutorMock();
+ EvaluationCallback evaluationCallback = createNiceMock(EvaluationCallback.class);
+ executor.evaluateAsynchronously(
+ matchesBuilder(Input.newBuilder()
+ .setType(CommandType.SEND_COMMAND)
+ .setCommand(SessionCommand.newBuilder()
+ .setType(ProtoCommands.SessionCommand.CommandType.CONVERT_NEXT_PAGE))),
+ same(Optional.<KeyEventInterface>absent()), sameOptional(evaluationCallback));
+ replayAll();
+ executor.pageDown(evaluationCallback);
+ verifyAll();
+
+ resetAll();
+ executor.evaluateAsynchronously(
+ matchesBuilder(Input.newBuilder()
+ .setType(CommandType.SEND_COMMAND)
+ .setCommand(SessionCommand.newBuilder()
+ .setType(ProtoCommands.SessionCommand.CommandType.CONVERT_PREV_PAGE))),
+ same(Optional.<KeyEventInterface>absent()), sameOptional(evaluationCallback));
+ replayAll();
+ executor.pageUp(evaluationCallback);
+ verifyAll();
+ }
+
+ @SmallTest
public void testSwitchInputFieldType() {
SessionExecutor executor = createSessionExecutorMock();
executor.evaluateAsynchronously(
@@ -668,8 +701,7 @@
.setType(SessionCommand.CommandType.SWITCH_INPUT_FIELD_TYPE))
.setContext(ProtoCommands.Context.newBuilder()
.setInputFieldType(InputFieldType.NORMAL))),
- isNull(KeyEventInterface.class),
- isNull(EvaluationCallback.class));
+ same(Optional.<KeyEventInterface>absent()), same(Optional.<EvaluationCallback>absent()));
replayAll();
executor.switchInputFieldType(InputFieldType.NORMAL);
@@ -688,8 +720,7 @@
.setCommand(SessionCommand.newBuilder()
.setType(SessionCommand.CommandType.UNDO_OR_REWIND))
.addAllTouchEvents(touchEventList)),
- isNull(KeyEventInterface.class),
- same(evaluationCallback));
+ same(Optional.<KeyEventInterface>absent()), sameOptional(evaluationCallback));
replayAll();
executor.undoOrRewind(touchEventList, evaluationCallback);
@@ -707,8 +738,7 @@
.setType(StorageType.EMOTICON_HISTORY)
.setKey("TEST_KEY")
.addAllValue(Collections.singletonList(ByteString.copyFromUtf8("TEST_VALUE"))))),
- isNull(KeyEventInterface.class),
- isNull(EvaluationCallback.class));
+ same(Optional.<KeyEventInterface>absent()), same(Optional.<EvaluationCallback>absent()));
replayAll();
executor.insertToStorage(
@@ -727,8 +757,7 @@
.setType(CommandType.SEND_COMMAND)
.setCommand(
SessionCommand.newBuilder().setType(SessionCommand.CommandType.EXPAND_SUGGESTION))),
- isNull(KeyEventInterface.class),
- same(evaluationCallback));
+ same(Optional.<KeyEventInterface>absent()), sameOptional(evaluationCallback));
replayAll();
executor.expandSuggestion(evaluationCallback);
@@ -741,6 +770,7 @@
SessionExecutor executor = createSessionExecutorMock();
Context context = getInstrumentation().getContext();
+ Context targetContext = getInstrumentation().getTargetContext();
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context);
assertNotNull(sharedPreferences);
@@ -758,7 +788,7 @@
.setType(SessionCommand.CommandType.USAGE_STATS_EVENT)
.setUsageStatsEvent(UsageStatsEvent.SOFTWARE_KEYBOARD_LAYOUT_LANDSCAPE)
.setUsageStatsEventIntValue(KeyboardLayout.GODAN.getId()))),
- isNull(KeyEventInterface.class), isNull(EvaluationCallback.class));
+ same(Optional.<KeyEventInterface>absent()), same(Optional.<EvaluationCallback>absent()));
executor.evaluateAsynchronously(
matchesBuilder(Input.newBuilder()
.setType(CommandType.SEND_COMMAND)
@@ -766,9 +796,9 @@
.setType(SessionCommand.CommandType.USAGE_STATS_EVENT)
.setUsageStatsEvent(UsageStatsEvent.SOFTWARE_KEYBOARD_LAYOUT_PORTRAIT)
.setUsageStatsEventIntValue(KeyboardLayout.QWERTY.getId()))),
- isNull(KeyEventInterface.class), isNull(EvaluationCallback.class));
+ same(Optional.<KeyEventInterface>absent()), same(Optional.<EvaluationCallback>absent()));
replayAll();
- executor.preferenceUsageStatsEvent(sharedPreferences);
+ executor.preferenceUsageStatsEvent(sharedPreferences, targetContext.getResources());
verifyAll();
sharedPreferences.edit()
@@ -783,7 +813,7 @@
.setType(SessionCommand.CommandType.USAGE_STATS_EVENT)
.setUsageStatsEvent(UsageStatsEvent.SOFTWARE_KEYBOARD_LAYOUT_LANDSCAPE)
.setUsageStatsEventIntValue(KeyboardLayout.QWERTY.getId()))),
- isNull(KeyEventInterface.class), isNull(EvaluationCallback.class));
+ same(Optional.<KeyEventInterface>absent()), same(Optional.<EvaluationCallback>absent()));
executor.evaluateAsynchronously(
matchesBuilder(Input.newBuilder()
.setType(CommandType.SEND_COMMAND)
@@ -791,9 +821,9 @@
.setType(SessionCommand.CommandType.USAGE_STATS_EVENT)
.setUsageStatsEvent(UsageStatsEvent.SOFTWARE_KEYBOARD_LAYOUT_PORTRAIT)
.setUsageStatsEventIntValue(KeyboardLayout.QWERTY.getId()))),
- isNull(KeyEventInterface.class), isNull(EvaluationCallback.class));
+ same(Optional.<KeyEventInterface>absent()), same(Optional.<EvaluationCallback>absent()));
replayAll();
- executor.preferenceUsageStatsEvent(sharedPreferences);
+ executor.preferenceUsageStatsEvent(sharedPreferences, targetContext.getResources());
verifyAll();
}
@@ -808,8 +838,7 @@
.setCommand(SessionCommand.newBuilder()
.setType(SessionCommand.CommandType.USAGE_STATS_EVENT))
.addAllTouchEvents(touchEventList)),
- isNull(KeyEventInterface.class),
- isNull(EvaluationCallback.class));
+ same(Optional.<KeyEventInterface>absent()), same(Optional.<EvaluationCallback>absent()));
replayAll();
executor.touchEventUsageStatsEvent(touchEventList);
@@ -823,8 +852,7 @@
executor.evaluateAsynchronously(
matchesBuilder(Input.newBuilder()
.setType(CommandType.SYNC_DATA)),
- isNull(KeyEventInterface.class),
- isNull(EvaluationCallback.class));
+ same(Optional.<KeyEventInterface>absent()), same(Optional.<EvaluationCallback>absent()));
replayAll();
executor.syncData();
@@ -856,8 +884,7 @@
matchesBuilder(Input.newBuilder()
.setType(CommandType.SET_CONFIG)
.setConfig(inputConfig)),
- isNull(KeyEventInterface.class),
- isNull(EvaluationCallback.class));
+ same(Optional.<KeyEventInterface>absent()), same(Optional.<EvaluationCallback>absent()));
replayAll();
executor.setConfig(inputConfig);
@@ -874,8 +901,7 @@
matchesBuilder(Input.newBuilder()
.setType(CommandType.SET_IMPOSED_CONFIG)
.setConfig(inputConfig)),
- isNull(KeyEventInterface.class),
- isNull(EvaluationCallback.class));
+ same(Optional.<KeyEventInterface>absent()), same(Optional.<EvaluationCallback>absent()));
replayAll();
executor.setImposedConfig(inputConfig);
@@ -971,8 +997,7 @@
executor.evaluateAsynchronously(
matchesBuilder(Input.newBuilder()
.setType(CommandType.RELOAD)),
- isNull(KeyEventInterface.class),
- isNull(EvaluationCallback.class));
+ same(Optional.<KeyEventInterface>absent()), same(Optional.<EvaluationCallback>absent()));
replayAll();
executor.reload();
@@ -1007,7 +1032,7 @@
public void testStressConversion() throws InterruptedException {
MemoryLogger memoryLogger = new MemoryLogger("testStressConversion", 100);
- SessionExecutor session = SessionExecutor.getInstance(null);
+ SessionExecutor session = SessionExecutor.getInstance(getInstrumentation().getContext());
Context context = getInstrumentation().getTargetContext();
session.reset(new SessionHandlerFactory(context), context);
@@ -1025,14 +1050,17 @@
}
session.sendKey(ProtoCommands.KeyEvent.newBuilder()
.setKeyString(composition.toString()).build(),
- null, Collections.<TouchEvent>emptyList(), null);
+ createNiceMock(KeyEventInterface.class), Collections.<TouchEvent>emptyList(),
+ createNiceMock(EvaluationCallback.class));
session.sendKey(ProtoCommands.KeyEvent.newBuilder()
.setSpecialKey(SpecialKey.SPACE).build(),
- null, Collections.<TouchEvent>emptyList(), null);
+ createNiceMock(KeyEventInterface.class), Collections.<TouchEvent>emptyList(),
+ createNiceMock(EvaluationCallback.class));
final CountDownLatch latch = new CountDownLatch(1);
session.submit(new EvaluationCallback() {
@Override
- public void onCompleted(Command command, KeyEventInterface triggeringKeyEvent) {
+ public void onCompleted(
+ Optional<Command> command, Optional<KeyEventInterface> triggeringKeyEvent) {
latch.countDown();
}
});
@@ -1051,7 +1079,7 @@
public void testStressConversionKao() throws InterruptedException {
MemoryLogger memoryLogger = new MemoryLogger("testStressConversionKao", 10);
- SessionExecutor session = SessionExecutor.getInstance(null);
+ SessionExecutor session = SessionExecutor.getInstance(getInstrumentation().getContext());
Context context = getInstrumentation().getTargetContext();
session.reset(new SessionHandlerFactory(context), context);
@@ -1059,14 +1087,17 @@
memoryLogger.logMemory("start");
session.sendKey(ProtoCommands.KeyEvent.newBuilder()
.setKeyString(composition.toString()).build(),
- null, Collections.<TouchEvent>emptyList(), null);
+ createNiceMock(KeyEventInterface.class), Collections.<TouchEvent>emptyList(),
+ createNiceMock(EvaluationCallback.class));
session.sendKey(ProtoCommands.KeyEvent.newBuilder()
.setSpecialKey(SpecialKey.SPACE).build(),
- null, Collections.<TouchEvent>emptyList(), null);
+ createNiceMock(KeyEventInterface.class), Collections.<TouchEvent>emptyList(),
+ createNiceMock(EvaluationCallback.class));
final CountDownLatch latch = new CountDownLatch(1);
session.submit(new EvaluationCallback() {
@Override
- public void onCompleted(Command command, KeyEventInterface triggeringKeyEvent) {
+ public void onCompleted(
+ Optional<Command> command, Optional<KeyEventInterface> triggeringKeyEvent) {
latch.countDown();
}
});
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/session/SessionHandlerFactoryTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/session/SessionHandlerFactoryTest.java
index a4642a2..ff00a93 100644
--- a/src/android/tests/src/com/google/android/inputmethod/japanese/session/SessionHandlerFactoryTest.java
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/session/SessionHandlerFactoryTest.java
@@ -29,6 +29,8 @@
package org.mozc.android.inputmethod.japanese.session;
+import com.google.common.base.Optional;
+
import android.app.Activity;
import android.content.SharedPreferences;
import android.test.InstrumentationTestCase;
@@ -81,14 +83,6 @@
}
@SmallTest
- public void testCreateSessionHandler_nullParameter() {
- // SessionHandler instance for null parameter.
- assertEquals(
- LocalSessionHandler.class,
- new SessionHandlerFactory(SharedPreferences.class.cast(null)).create().getClass());
- }
-
- @SmallTest
public void testCreateSessionHandler_appropriateParameter() {
// SessionHandlerSocketClient for appropriate preference.
SharedPreferences.Editor editor = sharedPreferences.edit();
@@ -99,7 +93,7 @@
Integer.toString(PORT));
editor.commit();
assertEquals(SocketSessionHandler.class,
- new SessionHandlerFactory(sharedPreferences).create().getClass());
+ new SessionHandlerFactory(Optional.of(sharedPreferences)).create().getClass());
}
@SmallTest
@@ -113,7 +107,7 @@
Integer.toString(PORT));
editor.commit();
assertEquals(LocalSessionHandler.class,
- new SessionHandlerFactory(sharedPreferences).create().getClass());
+ new SessionHandlerFactory(Optional.of(sharedPreferences)).create().getClass());
}
@SmallTest
@@ -127,6 +121,6 @@
"MALFORMED");
editor.commit();
assertEquals(LocalSessionHandler.class,
- new SessionHandlerFactory(sharedPreferences).create().getClass());
+ new SessionHandlerFactory(Optional.of(sharedPreferences)).create().getClass());
}
}
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/stresstest/MozcStressTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/stresstest/MozcStressTest.java
index 808c8a0..1b2089d 100644
--- a/src/android/tests/src/com/google/android/inputmethod/japanese/stresstest/MozcStressTest.java
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/stresstest/MozcStressTest.java
@@ -29,10 +29,10 @@
package org.mozc.android.inputmethod.japanese.stresstest;
-import org.mozc.android.inputmethod.japanese.JapaneseKeyboard.KeyboardSpecification;
import org.mozc.android.inputmethod.japanese.MozcService;
import org.mozc.android.inputmethod.japanese.MozcUtil;
import org.mozc.android.inputmethod.japanese.ViewManager;
+import org.mozc.android.inputmethod.japanese.keyboard.Keyboard.KeyboardSpecification;
import org.mozc.android.inputmethod.japanese.preference.ClientSidePreference.KeyboardLayout;
import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Input.TouchEvent;
import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Request;
@@ -40,7 +40,7 @@
import org.mozc.android.inputmethod.japanese.session.SessionExecutor;
import org.mozc.android.inputmethod.japanese.testing.MemoryLogger;
import org.mozc.android.inputmethod.japanese.testing.mocking.MozcMockSupport;
-import com.google.common.base.Optional;
+import com.google.common.base.Preconditions;
import android.app.Activity;
import android.app.Instrumentation;
@@ -66,8 +66,8 @@
public class MozcStressTest extends InstrumentationTestCase {
class OnCreateRunner implements Runnable {
@Override
- public void run(){
- service = new MozcService(){
+ public void run() {
+ service = new MozcService() {
/*
* In tests which is set up here, this method returns false. This blocks our
* tests and we don't concern this method. So this is little hacky.
@@ -100,17 +100,17 @@
Instrumentation instrumentation = getInstrumentation();
mockSupport = new MozcMockSupport(instrumentation);
- activity = launchActivity(
- "org.mozc.android.inputmethod.japanese", Activity.class, null);
+ activity = Preconditions.checkNotNull(launchActivity(
+ "org.mozc.android.inputmethod.japanese", Activity.class, null));
instrumentation.runOnMainSync(new OnCreateRunner());
context = instrumentation.getTargetContext();
}
@Override
protected void tearDown() throws Exception {
- if (activity != null) {
- activity.finish();
- }
+ activity.finish();
+
+ activity = null;
service = null;
inputView = null;
viewManager = null;
@@ -179,16 +179,12 @@
viewManager.setKeyboardLayout(KeyboardLayout.TWELVE_KEYS);
final int actions = 500;
+ Context context = getInstrumentation().getTargetContext();
- SessionExecutor session = SessionExecutor.getInstance(null);
- KeyboardSpecification specification = viewManager.getJapaneseKeyboardSpecification();
- Request request = MozcUtil.getRequestForKeyboard(
- specification.getKeyboardSpecificationName(),
- Optional.of(specification.getSpecialRomanjiTable()),
- Optional.of(specification.getSpaceOnAlphanumeric()),
- Optional.of(specification.isKanaModifierInsensitiveConversion()),
- Optional.of(specification.getCrossingEdgeBehavior()),
- getInstrumentation().getTargetContext().getResources().getConfiguration());
+ SessionExecutor session = SessionExecutor.getInstance(context);
+ KeyboardSpecification specification = viewManager.getKeyboardSpecification();
+ Request request = MozcUtil.getRequestBuilder(
+ context.getResources(), specification, context.getResources().getConfiguration()).build();
List<TouchEvent> touchEventList = Collections.emptyList();
memoryLogger.logMemory("start");
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/testing/MainThreadRunner.java b/src/android/tests/src/com/google/android/inputmethod/japanese/testing/MainThreadRunner.java
index 28daf90..276db1f 100644
--- a/src/android/tests/src/com/google/android/inputmethod/japanese/testing/MainThreadRunner.java
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/testing/MainThreadRunner.java
@@ -29,8 +29,8 @@
package org.mozc.android.inputmethod.japanese.testing;
-import org.mozc.android.inputmethod.japanese.JapaneseKeyboard;
-import org.mozc.android.inputmethod.japanese.JapaneseKeyboardView;
+import org.mozc.android.inputmethod.japanese.keyboard.Keyboard;
+import org.mozc.android.inputmethod.japanese.keyboard.KeyboardView;
import android.app.Activity;
import android.app.Instrumentation;
@@ -113,12 +113,11 @@
return runner.result;
}
- public void setJapaneseKeyboard(final JapaneseKeyboardView view,
- final JapaneseKeyboard keyboard) {
+ public void setKeyboard(final KeyboardView view, final Keyboard keyboard) {
runOnMainSync(new Runnable() {
@Override
public void run() {
- view.setJapaneseKeyboard(keyboard);
+ view.setKeyboard(keyboard);
}
});
}
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/testing/MockContext.java b/src/android/tests/src/com/google/android/inputmethod/japanese/testing/MockContext.java
new file mode 100644
index 0000000..e3d009c
--- /dev/null
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/testing/MockContext.java
@@ -0,0 +1,45 @@
+// Copyright 2010-2014, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package org.mozc.android.inputmethod.japanese.testing;
+
+import android.content.ContextWrapper;
+
+/**
+ * Simple mock to be mocked by EasyMock.
+ *
+ * <p>On ART VM it gets impossible to mock system-provided class directly.
+ * However indirect mocking is possible so this class is introduced for the workaround.
+ */
+public class MockContext extends ContextWrapper {
+
+ public MockContext() {
+ super(null);
+ }
+}
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/testing/MockDrawable.java b/src/android/tests/src/com/google/android/inputmethod/japanese/testing/MockDrawable.java
new file mode 100644
index 0000000..ecd0d6d
--- /dev/null
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/testing/MockDrawable.java
@@ -0,0 +1,57 @@
+// Copyright 2010-2014, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package org.mozc.android.inputmethod.japanese.testing;
+
+import android.graphics.Canvas;
+import android.graphics.ColorFilter;
+import android.graphics.drawable.Drawable;
+
+/**
+ * @see MockContext
+ */
+public class MockDrawable extends Drawable {
+
+ @Override
+ public void draw(Canvas canvas) {
+ }
+
+ @Override
+ public int getOpacity() {
+ return 0;
+ }
+
+ @Override
+ public void setAlpha(int alpha) {
+ }
+
+ @Override
+ public void setColorFilter(ColorFilter cf) {
+ }
+}
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/testing/MockInputStream.java b/src/android/tests/src/com/google/android/inputmethod/japanese/testing/MockInputStream.java
new file mode 100644
index 0000000..02f9f0c
--- /dev/null
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/testing/MockInputStream.java
@@ -0,0 +1,44 @@
+// Copyright 2010-2014, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package org.mozc.android.inputmethod.japanese.testing;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+/**
+ * @see MockContext
+ */
+public class MockInputStream extends InputStream {
+
+ @Override
+ public int read() throws IOException {
+ return 0;
+ }
+}
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/testing/MockPackageManager.java b/src/android/tests/src/com/google/android/inputmethod/japanese/testing/MockPackageManager.java
new file mode 100644
index 0000000..34c5048
--- /dev/null
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/testing/MockPackageManager.java
@@ -0,0 +1,474 @@
+// Copyright 2010-2014, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package org.mozc.android.inputmethod.japanese.testing;
+
+import android.content.ComponentName;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.pm.ActivityInfo;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.FeatureInfo;
+import android.content.pm.InstrumentationInfo;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageInstaller;
+import android.content.pm.PackageManager;
+import android.content.pm.PermissionGroupInfo;
+import android.content.pm.PermissionInfo;
+import android.content.pm.ProviderInfo;
+import android.content.pm.ResolveInfo;
+import android.content.pm.ServiceInfo;
+import android.content.res.Resources;
+import android.content.res.XmlResourceParser;
+import android.graphics.Rect;
+import android.graphics.drawable.Drawable;
+import android.os.UserHandle;
+
+import java.util.List;
+
+/**
+ * @see MockContext
+ */
+public class MockPackageManager extends PackageManager {
+
+ @Deprecated
+ @Override
+ public void addPackageToPreferred(String arg0) {
+ }
+
+ @Override
+ public boolean addPermission(PermissionInfo arg0) {
+ return false;
+ }
+
+ @Override
+ public boolean addPermissionAsync(PermissionInfo arg0) {
+ return false;
+ }
+
+ @Deprecated
+ @Override
+ public void addPreferredActivity(IntentFilter arg0, int arg1,
+ ComponentName[] arg2, ComponentName arg3) {
+
+ }
+
+ @Override
+ public String[] canonicalToCurrentPackageNames(String[] arg0) {
+ return null;
+ }
+
+ @Override
+ public int checkPermission(String arg0, String arg1) {
+ return 0;
+ }
+
+ @Override
+ public int checkSignatures(String arg0, String arg1) {
+ return 0;
+ }
+
+ @Override
+ public int checkSignatures(int arg0, int arg1) {
+ return 0;
+ }
+
+ @Override
+ public void clearPackagePreferredActivities(String arg0) {
+ }
+
+ @Override
+ public String[] currentToCanonicalPackageNames(String[] arg0) {
+ return null;
+ }
+
+ @Override
+ public void extendVerificationTimeout(int arg0, int arg1, long arg2) {
+ }
+
+ @Override
+ public Drawable getActivityIcon(ComponentName arg0)
+ throws NameNotFoundException {
+ return null;
+ }
+
+ @Override
+ public Drawable getActivityIcon(Intent arg0) throws NameNotFoundException {
+ return null;
+ }
+
+ @Override
+ public ActivityInfo getActivityInfo(ComponentName arg0, int arg1)
+ throws NameNotFoundException {
+ return null;
+ }
+
+ @Override
+ public Drawable getActivityLogo(ComponentName arg0)
+ throws NameNotFoundException {
+ return null;
+ }
+
+ @Override
+ public Drawable getActivityLogo(Intent arg0) throws NameNotFoundException {
+ return null;
+ }
+
+ @Override
+ public List<PermissionGroupInfo> getAllPermissionGroups(int arg0) {
+ return null;
+ }
+
+ @Override
+ public int getApplicationEnabledSetting(String arg0) {
+ return 0;
+ }
+
+ @Override
+ public Drawable getApplicationIcon(ApplicationInfo arg0) {
+ return null;
+ }
+
+ @Override
+ public Drawable getApplicationIcon(String arg0) throws NameNotFoundException {
+ return null;
+ }
+
+ @Override
+ public ApplicationInfo getApplicationInfo(String arg0, int arg1)
+ throws NameNotFoundException {
+ return null;
+ }
+
+ @Override
+ public CharSequence getApplicationLabel(ApplicationInfo arg0) {
+ return null;
+ }
+
+ @Override
+ public Drawable getApplicationLogo(ApplicationInfo arg0) {
+ return null;
+ }
+
+ @Override
+ public Drawable getApplicationLogo(String arg0) throws NameNotFoundException {
+ return null;
+ }
+
+ @Override
+ public int getComponentEnabledSetting(ComponentName arg0) {
+ return 0;
+ }
+
+ @Override
+ public Drawable getDefaultActivityIcon() {
+ return null;
+ }
+
+ @Override
+ public Drawable getDrawable(String arg0, int arg1, ApplicationInfo arg2) {
+ return null;
+ }
+
+ @Override
+ public List<ApplicationInfo> getInstalledApplications(int arg0) {
+ return null;
+ }
+
+ @Override
+ public List<PackageInfo> getInstalledPackages(int arg0) {
+ return null;
+ }
+
+ @Override
+ public String getInstallerPackageName(String arg0) {
+ return null;
+ }
+
+ @Override
+ public InstrumentationInfo getInstrumentationInfo(ComponentName arg0, int arg1)
+ throws NameNotFoundException {
+ return null;
+ }
+
+ @Override
+ public Intent getLaunchIntentForPackage(String arg0) {
+ return null;
+ }
+
+ @Override
+ public String getNameForUid(int arg0) {
+ return null;
+ }
+
+ @Override
+ public int[] getPackageGids(String arg0) throws NameNotFoundException {
+ return null;
+ }
+
+ @Override
+ public PackageInfo getPackageInfo(String arg0, int arg1)
+ throws NameNotFoundException {
+ return null;
+ }
+
+ @Override
+ public String[] getPackagesForUid(int arg0) {
+ return null;
+ }
+
+ @Override
+ public List<PackageInfo> getPackagesHoldingPermissions(String[] arg0,
+ int arg1) {
+ return null;
+ }
+
+ @Override
+ public PermissionGroupInfo getPermissionGroupInfo(String arg0, int arg1)
+ throws NameNotFoundException {
+ return null;
+ }
+
+ @Override
+ public PermissionInfo getPermissionInfo(String arg0, int arg1)
+ throws NameNotFoundException {
+ return null;
+ }
+
+ @Override
+ public int getPreferredActivities(List<IntentFilter> arg0,
+ List<ComponentName> arg1, String arg2) {
+ return 0;
+ }
+
+ @Override
+ public List<PackageInfo> getPreferredPackages(int arg0) {
+ return null;
+ }
+
+ @Override
+ public ProviderInfo getProviderInfo(ComponentName arg0, int arg1)
+ throws NameNotFoundException {
+ return null;
+ }
+
+ @Override
+ public ActivityInfo getReceiverInfo(ComponentName arg0, int arg1)
+ throws NameNotFoundException {
+ return null;
+ }
+
+ @Override
+ public Resources getResourcesForActivity(ComponentName arg0)
+ throws NameNotFoundException {
+ return null;
+ }
+
+ @Override
+ public Resources getResourcesForApplication(ApplicationInfo arg0)
+ throws NameNotFoundException {
+ return null;
+ }
+
+ @Override
+ public Resources getResourcesForApplication(String arg0)
+ throws NameNotFoundException {
+ return null;
+ }
+
+ @Override
+ public ServiceInfo getServiceInfo(ComponentName arg0, int arg1)
+ throws NameNotFoundException {
+ return null;
+ }
+
+ @Override
+ public FeatureInfo[] getSystemAvailableFeatures() {
+ return null;
+ }
+
+ @Override
+ public String[] getSystemSharedLibraryNames() {
+ return null;
+ }
+
+ @Override
+ public CharSequence getText(String arg0, int arg1, ApplicationInfo arg2) {
+ return null;
+ }
+
+ @Override
+ public XmlResourceParser getXml(String arg0, int arg1, ApplicationInfo arg2) {
+ return null;
+ }
+
+ @Override
+ public boolean hasSystemFeature(String arg0) {
+ return false;
+ }
+
+ @Override
+ public boolean isSafeMode() {
+ return false;
+ }
+
+ @Override
+ public List<ResolveInfo> queryBroadcastReceivers(Intent arg0, int arg1) {
+ return null;
+ }
+
+ @Override
+ public List<ProviderInfo> queryContentProviders(String arg0, int arg1, int arg2) {
+ return null;
+ }
+
+ @Override
+ public List<InstrumentationInfo> queryInstrumentation(String arg0, int arg1) {
+ return null;
+ }
+
+ @Override
+ public List<ResolveInfo> queryIntentActivities(Intent arg0, int arg1) {
+ return null;
+ }
+
+ @Override
+ public List<ResolveInfo> queryIntentActivityOptions(ComponentName arg0,
+ Intent[] arg1, Intent arg2, int arg3) {
+ return null;
+ }
+
+ @Override
+ public List<ResolveInfo> queryIntentContentProviders(Intent arg0, int arg1) {
+ return null;
+ }
+
+ @Override
+ public List<ResolveInfo> queryIntentServices(Intent arg0, int arg1) {
+ return null;
+ }
+
+ @Override
+ public List<PermissionInfo> queryPermissionsByGroup(String arg0, int arg1)
+ throws NameNotFoundException {
+ return null;
+ }
+
+ @Deprecated
+ @Override
+ public void removePackageFromPreferred(String arg0) {
+ }
+
+ @Override
+ public void removePermission(String arg0) {
+ }
+
+ @Override
+ public ResolveInfo resolveActivity(Intent arg0, int arg1) {
+ return null;
+ }
+
+ @Override
+ public ProviderInfo resolveContentProvider(String arg0, int arg1) {
+ return null;
+ }
+
+ @Override
+ public ResolveInfo resolveService(Intent arg0, int arg1) {
+ return null;
+ }
+
+ @Override
+ public void setApplicationEnabledSetting(String arg0, int arg1, int arg2) {
+ }
+
+ @Override
+ public void setComponentEnabledSetting(ComponentName arg0, int arg1, int arg2) {
+ }
+
+ @Override
+ public void setInstallerPackageName(String arg0, String arg1) {
+ }
+
+ @Override
+ public void verifyPendingInstall(int arg0, int arg1) {
+ }
+
+ @Override
+ public Drawable getApplicationBanner(ApplicationInfo info) {
+ return null;
+ }
+
+ @Override
+ public Drawable getApplicationBanner(String packageName) throws NameNotFoundException {
+ return null;
+ }
+
+ @Override
+ public Drawable getActivityBanner(ComponentName activityName) throws NameNotFoundException {
+ return null;
+ }
+
+ @Override
+ public Drawable getActivityBanner(Intent intent) throws NameNotFoundException {
+ return null;
+ }
+
+ @Override
+ public Intent getLeanbackLaunchIntentForPackage(String packageName) {
+ return null;
+ }
+
+ @Override
+ public PackageInstaller getPackageInstaller() {
+ return null;
+ }
+
+ @Override
+ public Drawable getUserBadgedDrawableForDensity(Drawable arg0, UserHandle arg1, Rect arg2,
+ int arg3) {
+ return null;
+ }
+
+ @Override
+ public Drawable getUserBadgedIcon(Drawable arg0, UserHandle arg1) {
+ return null;
+ }
+
+ @Override
+ public CharSequence getUserBadgedLabel(CharSequence arg0, UserHandle arg1) {
+ return null;
+ }
+
+ // Overriding hidden public abstract method.
+ @SuppressWarnings("unused")
+ public Drawable getUserBadgeForDensity(UserHandle user, int density) {
+ return null;
+ }
+}
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/testing/MockResourcesWithDisplayMetrics.java b/src/android/tests/src/com/google/android/inputmethod/japanese/testing/MockResourcesWithDisplayMetrics.java
new file mode 100644
index 0000000..82ebbde
--- /dev/null
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/testing/MockResourcesWithDisplayMetrics.java
@@ -0,0 +1,46 @@
+// Copyright 2010-2014, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package org.mozc.android.inputmethod.japanese.testing;
+
+import android.util.DisplayMetrics;
+
+
+/**
+ * Mock Resources with stub DisplayMetrics.
+ */
+public class MockResourcesWithDisplayMetrics extends android.test.mock.MockResources {
+
+ @Override
+ public final DisplayMetrics getDisplayMetrics() {
+ DisplayMetrics metrics = new DisplayMetrics();
+ metrics.density = 1f;
+ return metrics;
+ }
+}
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/testing/MockWindow.java b/src/android/tests/src/com/google/android/inputmethod/japanese/testing/MockWindow.java
new file mode 100644
index 0000000..714a36c
--- /dev/null
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/testing/MockWindow.java
@@ -0,0 +1,260 @@
+// Copyright 2010-2014, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package org.mozc.android.inputmethod.japanese.testing;
+
+import android.content.Context;
+import android.content.res.Configuration;
+import android.graphics.drawable.Drawable;
+import android.net.Uri;
+import android.os.Bundle;
+import android.view.KeyEvent;
+import android.view.LayoutInflater;
+import android.view.MotionEvent;
+import android.view.SurfaceHolder.Callback2;
+import android.view.View;
+import android.view.ViewGroup.LayoutParams;
+import android.view.Window;
+
+/**
+ * @see MockContext
+ */
+public class MockWindow extends Window {
+
+ public MockWindow(Context context) {
+ super(context);
+ }
+
+ @Override
+ public void addContentView(View view, LayoutParams params) {
+ }
+
+ @Override
+ public void closeAllPanels() {
+ }
+
+ @Override
+ public void closePanel(int featureId) {
+ }
+
+ @Override
+ public View getCurrentFocus() {
+ return null;
+ }
+
+ @Override
+ public View getDecorView() {
+ return null;
+ }
+
+ @Override
+ public LayoutInflater getLayoutInflater() {
+ return null;
+ }
+
+ @Override
+ public int getVolumeControlStream() {
+ return 0;
+ }
+
+ @Override
+ public void invalidatePanelMenu(int featureId) {
+ }
+
+ @Override
+ public boolean isFloating() {
+ return false;
+ }
+
+ @Override
+ public boolean isShortcutKey(int keyCode, KeyEvent event) {
+ return false;
+ }
+
+ @Override
+ protected void onActive() {
+ }
+
+ @Override
+ public void onConfigurationChanged(Configuration newConfig) {
+ }
+
+ @Override
+ public void openPanel(int featureId, KeyEvent event) {
+ }
+
+ @Override
+ public View peekDecorView() {
+ return null;
+ }
+
+ @Override
+ public boolean performContextMenuIdentifierAction(int id, int flags) {
+ return false;
+ }
+
+ @Override
+ public boolean performPanelIdentifierAction(int featureId, int id, int flags) {
+ return false;
+ }
+
+ @Override
+ public boolean performPanelShortcut(int featureId, int keyCode, KeyEvent event, int flags) {
+ return false;
+ }
+
+ @Override
+ public void restoreHierarchyState(Bundle savedInstanceState) {
+ }
+
+ @Override
+ public Bundle saveHierarchyState() {
+ return null;
+ }
+
+ @Override
+ public void setBackgroundDrawable(Drawable drawable) {
+ }
+
+ @Override
+ public void setChildDrawable(int featureId, Drawable drawable) {
+ }
+
+ @Override
+ public void setChildInt(int featureId, int value) {
+ }
+
+ @Override
+ public void setContentView(int layoutResID) {
+ }
+
+ @Override
+ public void setContentView(View view) {
+ }
+
+ @Override
+ public void setContentView(View view, LayoutParams params) {
+ }
+
+ @Override
+ public void setFeatureDrawable(int featureId, Drawable drawable) {
+ }
+
+ @Override
+ public void setFeatureDrawableAlpha(int featureId, int alpha) {
+ }
+
+ @Override
+ public void setFeatureDrawableResource(int featureId, int resId) {
+ }
+
+ @Override
+ public void setFeatureDrawableUri(int featureId, Uri uri) {
+ }
+
+ @Override
+ public void setFeatureInt(int featureId, int value) {
+ }
+
+ @Override
+ public void setTitle(CharSequence title) {
+ }
+
+ @Deprecated
+ @Override
+ public void setTitleColor(int textColor) {
+ }
+
+ @Override
+ public void setVolumeControlStream(int streamType) {
+ }
+
+ @Override
+ public boolean superDispatchGenericMotionEvent(MotionEvent event) {
+ return false;
+ }
+
+ @Override
+ public boolean superDispatchKeyEvent(KeyEvent event) {
+ return false;
+ }
+
+ @Override
+ public boolean superDispatchKeyShortcutEvent(KeyEvent event) {
+ return false;
+ }
+
+ @Override
+ public boolean superDispatchTouchEvent(MotionEvent event) {
+ return false;
+ }
+
+ @Override
+ public boolean superDispatchTrackballEvent(MotionEvent event) {
+ return false;
+ }
+
+ @Override
+ public void takeInputQueue(android.view.InputQueue.Callback callback) {
+ }
+
+ @Override
+ public void takeKeyEvents(boolean get) {
+ }
+
+ @Override
+ public void takeSurface(Callback2 callback) {
+ }
+
+ @Override
+ public void togglePanel(int featureId, KeyEvent event) {
+ }
+
+ // hidden public abstract method.
+ public void alwaysReadCloseOnTouchAttr() {
+ }
+
+ @Override
+ public int getStatusBarColor() {
+ return 0;
+ }
+
+ @Override
+ public void setStatusBarColor(int color) {
+ }
+
+ @Override
+ public int getNavigationBarColor() {
+ return 0;
+ }
+
+ @Override
+ public void setNavigationBarColor(int color) {
+ }
+}
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/testing/MozcMatcher.java b/src/android/tests/src/com/google/android/inputmethod/japanese/testing/MozcMatcher.java
index 11f5582..7b801b2 100644
--- a/src/android/tests/src/com/google/android/inputmethod/japanese/testing/MozcMatcher.java
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/testing/MozcMatcher.java
@@ -32,10 +32,13 @@
import static org.easymock.EasyMock.reportMatcher;
import org.mozc.android.inputmethod.japanese.KeycodeConverter.KeyEventInterface;
+import com.google.common.base.Optional;
+import com.google.common.base.Preconditions;
import com.google.protobuf.Message;
import android.graphics.Canvas;
import android.graphics.Paint;
+import android.view.KeyEvent;
import org.easymock.Capture;
import org.easymock.IArgumentMatcher;
@@ -55,6 +58,7 @@
* This subclass hold copied instance instead.
*/
public static class DeepCopyPaintCapture extends Capture<Paint> {
+
@Override
public void setValue(Paint value) {
// Don't user Paint(Paint) constructor, which doesn't copy the fields.
@@ -69,13 +73,10 @@
* Matcher implementation for protobuf's MessageBuilder.
*/
private static class MessageBuilderMatcher implements IArgumentMatcher {
- private Message expected;
+ private final Message expected;
MessageBuilderMatcher(Message.Builder builder) {
- if (builder == null) {
- throw new NullPointerException("builder is null.");
- }
- this.expected = builder.buildPartial();
+ this.expected = Preconditions.checkNotNull(builder).buildPartial();
}
@Override
@@ -98,20 +99,22 @@
* Matcher implementation for KeyEvent, which matches action and key code.
*/
private static class KeyEventMatcher implements IArgumentMatcher {
+
private final int expectedKeyCode;
- private final android.view.KeyEvent expectedNativeKeyEvent;
+ private final Optional<android.view.KeyEvent> expectedNativeKeyEvent;
KeyEventMatcher(int expectedKeyCode) {
this.expectedKeyCode = expectedKeyCode;
- this.expectedNativeKeyEvent = null;
+ this.expectedNativeKeyEvent = Optional.absent();
}
KeyEventMatcher(android.view.KeyEvent expectedNativeKeyEvent) {
this.expectedKeyCode = android.view.KeyEvent.KEYCODE_UNKNOWN;
- this.expectedNativeKeyEvent = expectedNativeKeyEvent;
+ this.expectedNativeKeyEvent = Optional.of(expectedNativeKeyEvent);
}
@Override
public void appendTo(StringBuffer sb) {
+ Preconditions.checkNotNull(sb);
sb.append("matchesKeyEvent(");
sb.appendCodePoint(expectedKeyCode);
sb.append(")");
@@ -123,26 +126,26 @@
return false;
}
KeyEventInterface keyEvent = KeyEventInterface.class.cast(arg);
- if (expectedNativeKeyEvent != null) {
- return keyEvent.getNativeEvent() == expectedNativeKeyEvent;
+ if (expectedNativeKeyEvent.isPresent()) {
+ Optional<KeyEvent> nativeEvent = keyEvent.getNativeEvent();
+ return nativeEvent.isPresent() && (nativeEvent.get() == expectedNativeKeyEvent.get());
}
- return keyEvent.getNativeEvent() == null && keyEvent.getKeyCode() == expectedKeyCode;
+ return !keyEvent.getNativeEvent().isPresent() && keyEvent.getKeyCode() == expectedKeyCode;
}
}
-
/**
* Matcher implementation for Canvas, which matches expected matrix conversion given by
* sourcePoints and targetPoints.
*/
private static class CanvasPointMatcher implements IArgumentMatcher {
- private float[] sourcePoints;
- private float[] targetPoints;
+
+ private final float[] sourcePoints;
+ private final float[] targetPoints;
CanvasPointMatcher(float[] sourcePoints, float[] targetPoints) {
- if (sourcePoints == null || targetPoints == null) {
- throw new NullPointerException("sourcePoints and targetPoints should not be null.");
- }
+ Preconditions.checkNotNull(sourcePoints);
+ Preconditions.checkNotNull(targetPoints);
if (sourcePoints.length != targetPoints.length) {
throw new IllegalArgumentException(
"The length of sourcePoints and one of targetPoints shoudld be same. "
@@ -176,6 +179,35 @@
}
}
+ /**
+ * Matcher implementation for Optional, which contains a same object.
+ */
+ private static class SameOptionalMatcher<T> implements IArgumentMatcher {
+
+ private final T expectedValue;
+
+ SameOptionalMatcher(T value) {
+ this.expectedValue = Preconditions.checkNotNull(value);
+ }
+
+ @Override
+ public void appendTo(StringBuffer buff) {
+ buff.append("matchOptional(")
+ .append(expectedValue)
+ .append(")");
+ }
+
+ @SuppressWarnings("rawtypes")
+ @Override
+ public boolean matches(Object arg) {
+ if (!(arg instanceof Optional)) {
+ return false;
+ }
+ Optional targetValue = Optional.class.cast(arg);
+ return expectedValue == targetValue.orNull();
+ }
+ }
+
// Disallow instantiation.
private MozcMatcher() {
}
@@ -212,4 +244,12 @@
reportMatcher(new CanvasPointMatcher(sourcePoints, targetPoints));
return null;
}
+
+ /**
+ * Expects a {@link Optional}, which contains a same object.
+ */
+ public static <T> Optional<T> sameOptional(T value) {
+ reportMatcher(new SameOptionalMatcher<T>(value));
+ return null;
+ }
}
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/ui/CandidateLayoutRendererTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/ui/CandidateLayoutRendererTest.java
index 949a0a9..0a8fd83 100644
--- a/src/android/tests/src/com/google/android/inputmethod/japanese/ui/CandidateLayoutRendererTest.java
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/ui/CandidateLayoutRendererTest.java
@@ -31,22 +31,26 @@
import static org.easymock.EasyMock.eq;
import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.geq;
import static org.easymock.EasyMock.getCurrentArguments;
import static org.easymock.EasyMock.isA;
+import static org.easymock.EasyMock.leq;
import static org.easymock.EasyMock.same;
+import org.mozc.android.inputmethod.japanese.protobuf.ProtoCandidates.Annotation;
import org.mozc.android.inputmethod.japanese.protobuf.ProtoCandidates.CandidateList;
import org.mozc.android.inputmethod.japanese.protobuf.ProtoCandidates.CandidateWord;
import org.mozc.android.inputmethod.japanese.testing.InstrumentationTestCaseWithMock;
-import org.mozc.android.inputmethod.japanese.testing.VisibilityProxy;
import org.mozc.android.inputmethod.japanese.ui.CandidateLayout.Row;
import org.mozc.android.inputmethod.japanese.ui.CandidateLayout.Span;
+import org.mozc.android.inputmethod.japanese.ui.CandidateLayoutRenderer.DescriptionLayoutPolicy;
+import org.mozc.android.inputmethod.japanese.ui.CandidateLayoutRenderer.ValueScalingPolicy;
import org.mozc.android.inputmethod.japanese.view.CarrierEmojiRenderHelper;
import com.google.common.base.Optional;
import android.graphics.Canvas;
+import android.graphics.Paint;
import android.graphics.Rect;
-import android.test.mock.MockResources;
import android.view.View;
import org.easymock.IAnswer;
@@ -95,53 +99,46 @@
}
CandidateLayout candidateLayout = new CandidateLayout(rowList, 50, 50);
- // Set up the testee instance and mocks.
- View targetView = createViewMock(View.class);
- resetAll();
- expect(targetView.getResources()).andStubReturn(new MockResources());
- replayAll();
CandidateLayoutRenderer renderer = createMockBuilder(CandidateLayoutRenderer.class)
- .withConstructor(View.class)
- .withArgs(targetView)
.addMockedMethod("drawSpan")
.createMock();
- // Inject CarrierEmojiRenderHelper mock.
- CarrierEmojiRenderHelper carrierEmojiRenderHelper =
- createMockBuilder(CarrierEmojiRenderHelper.class)
- .withConstructor(View.class)
- .withArgs(targetView)
- .createMock();
- VisibilityProxy.setField(renderer, "carrierEmojiRenderHelper", carrierEmojiRenderHelper);
-
- Canvas canvas = createMock(Canvas.class);
+ // Test if the focused index is updated by setCandidateList.
resetAll();
- // Set CandidateList should affect to the carrierEmojiRenderHelper.
- carrierEmojiRenderHelper.setCandidateList(Optional.of(candidateList));
replayAll();
-
renderer.setCandidateList(Optional.of(candidateList));
verifyAll();
- // The focused index should also be updated.
assertEquals(6, renderer.focusedIndex);
+ // Test if the focused index is -1 for absent candidate list.
resetAll();
- carrierEmojiRenderHelper.setCandidateList(Optional.<CandidateList>absent());
- replayAll();
+ replayAll();
renderer.setCandidateList(Optional.<CandidateList>absent());
verifyAll();
assertEquals(-1, renderer.focusedIndex);
- resetAll();
- // Set the candidateList again.
- carrierEmojiRenderHelper.setCandidateList(Optional.of(candidateList));
- replayAll();
+ // drawCandidateLayout is tested below. Set up CarrrierEmojiRenderHelper and Canvas mocks.
+ View targetView = createViewMock(View.class);
+ CarrierEmojiRenderHelper carrierEmojiRenderHelper =
+ createMockBuilder(CarrierEmojiRenderHelper.class)
+ .withConstructor(View.class)
+ .withArgs(targetView)
+ .createNiceMock();
+ Canvas canvas = createMockBuilder(Canvas.class)
+ .addMockedMethod("getClipBounds", Rect.class)
+ .addMockedMethod("drawLine")
+ .createMock();
+ // Set the candidate list to both renderer and carrierEmojiRenderHelper.
+ resetAll();
+
+ replayAll();
renderer.setCandidateList(Optional.of(candidateList));
+ carrierEmojiRenderHelper.setCandidateList(Optional.of(candidateList));
verifyAll();
assertEquals(6, renderer.focusedIndex);
@@ -160,33 +157,236 @@
// All spans which are in the bounding box (or crossing the boundary) should be rendered.
// (1, 1) element is focused (specified by CandidateList#getFocusedIndex), and (1, 3) element is
- // pressed (set "8" in the drawCandidateLayout's argument below).
+ // pressed (set "8" in the drawCandidateLayout's argument below). In this case, separators are
+ // drawn on the right edge of each span because each span to be rendered is not rightmost.
+ // Separator length is not tested but should be less than or equal to the edge length, i.e., 10.
renderer.drawSpan(
- same(canvas), same(rowList.get(1)), same(rowList.get(1).getSpanList().get(1)), eq(true));
+ same(canvas), same(rowList.get(1)), same(rowList.get(1).getSpanList().get(1)), eq(true),
+ same(carrierEmojiRenderHelper));
+ canvas.drawLine(eq(10f), geq(10f), eq(10f), leq(20f), isA(Paint.class));
renderer.drawSpan(
- same(canvas), same(rowList.get(1)), same(rowList.get(1).getSpanList().get(2)), eq(false));
+ same(canvas), same(rowList.get(1)), same(rowList.get(1).getSpanList().get(2)), eq(false),
+ same(carrierEmojiRenderHelper));
+ canvas.drawLine(eq(20f), geq(10f), eq(20f), leq(20f), isA(Paint.class));
renderer.drawSpan(
- same(canvas), same(rowList.get(1)), same(rowList.get(1).getSpanList().get(3)), eq(true));
+ same(canvas), same(rowList.get(1)), same(rowList.get(1).getSpanList().get(3)), eq(true),
+ same(carrierEmojiRenderHelper));
+ canvas.drawLine(eq(30f), geq(10f), eq(30f), leq(20f), isA(Paint.class));
renderer.drawSpan(
- same(canvas), same(rowList.get(2)), same(rowList.get(2).getSpanList().get(1)), eq(false));
+ same(canvas), same(rowList.get(2)), same(rowList.get(2).getSpanList().get(1)), eq(false),
+ same(carrierEmojiRenderHelper));
+ canvas.drawLine(eq(10f), geq(20f), eq(10f), leq(30f), isA(Paint.class));
renderer.drawSpan(
- same(canvas), same(rowList.get(2)), same(rowList.get(2).getSpanList().get(2)), eq(false));
+ same(canvas), same(rowList.get(2)), same(rowList.get(2).getSpanList().get(2)), eq(false),
+ same(carrierEmojiRenderHelper));
+ canvas.drawLine(eq(20f), geq(20f), eq(20f), leq(30f), isA(Paint.class));
renderer.drawSpan(
- same(canvas), same(rowList.get(2)), same(rowList.get(2).getSpanList().get(3)), eq(false));
+ same(canvas), same(rowList.get(2)), same(rowList.get(2).getSpanList().get(3)), eq(false),
+ same(carrierEmojiRenderHelper));
+ canvas.drawLine(eq(30f), geq(20f), eq(30f), leq(30f), isA(Paint.class));
renderer.drawSpan(
- same(canvas), same(rowList.get(3)), same(rowList.get(3).getSpanList().get(1)), eq(false));
+ same(canvas), same(rowList.get(3)), same(rowList.get(3).getSpanList().get(1)), eq(false),
+ same(carrierEmojiRenderHelper));
+ canvas.drawLine(eq(10f), geq(30f), eq(10f), leq(40f), isA(Paint.class));
renderer.drawSpan(
- same(canvas), same(rowList.get(3)), same(rowList.get(3).getSpanList().get(2)), eq(false));
+ same(canvas), same(rowList.get(3)), same(rowList.get(3).getSpanList().get(2)), eq(false),
+ same(carrierEmojiRenderHelper));
+ canvas.drawLine(eq(20f), geq(30f), eq(20f), leq(40f), isA(Paint.class));
renderer.drawSpan(
- same(canvas), same(rowList.get(3)), same(rowList.get(3).getSpanList().get(3)), eq(false));
+ same(canvas), same(rowList.get(3)), same(rowList.get(3).getSpanList().get(3)), eq(false),
+ same(carrierEmojiRenderHelper));
+ canvas.drawLine(eq(30f), geq(30f), eq(30f), leq(40f), isA(Paint.class));
replayAll();
// 8 is the pseudo pressing candidate.
- renderer.drawCandidateLayout(canvas, candidateLayout, 8);
+ renderer.drawCandidateLayout(canvas, candidateLayout, 8, carrierEmojiRenderHelper);
verifyAll();
+
+ // Next, test rendering on the whole canvas.
+ resetAll();
+
+ expect(canvas.getClipBounds(isA(Rect.class))).andStubAnswer(new IAnswer<Boolean>() {
+ @Override
+ public Boolean answer() throws Throwable {
+ Rect.class.cast(getCurrentArguments()[0]).set(0, 0, 50, 50);
+ return Boolean.TRUE;
+ }
+ });
+
+ // Note that, in each row, a separator is not drawn after the last span, i.e., drawn only
+ // between spans. The focused and pressed spans are the same as before.
+ // Row 0
+ renderer.drawSpan(
+ same(canvas), same(rowList.get(0)), same(rowList.get(0).getSpanList().get(0)), eq(false),
+ same(carrierEmojiRenderHelper));
+ canvas.drawLine(eq(10f), geq(0f), eq(10f), leq(10f), isA(Paint.class));
+ renderer.drawSpan(
+ same(canvas), same(rowList.get(0)), same(rowList.get(0).getSpanList().get(1)), eq(false),
+ same(carrierEmojiRenderHelper));
+ canvas.drawLine(eq(20f), geq(0f), eq(20f), leq(10f), isA(Paint.class));
+ renderer.drawSpan(
+ same(canvas), same(rowList.get(0)), same(rowList.get(0).getSpanList().get(2)), eq(false),
+ same(carrierEmojiRenderHelper));
+ canvas.drawLine(eq(30f), geq(0f), eq(30f), leq(10f), isA(Paint.class));
+ renderer.drawSpan(
+ same(canvas), same(rowList.get(0)), same(rowList.get(0).getSpanList().get(3)), eq(false),
+ same(carrierEmojiRenderHelper));
+ canvas.drawLine(eq(40f), geq(0f), eq(40f), leq(10f), isA(Paint.class));
+ renderer.drawSpan(
+ same(canvas), same(rowList.get(0)), same(rowList.get(0).getSpanList().get(4)), eq(false),
+ same(carrierEmojiRenderHelper));
+
+ // Row 1
+ renderer.drawSpan(
+ same(canvas), same(rowList.get(1)), same(rowList.get(1).getSpanList().get(0)), eq(false),
+ same(carrierEmojiRenderHelper));
+ canvas.drawLine(eq(10f), geq(10f), eq(10f), leq(20f), isA(Paint.class));
+ renderer.drawSpan(
+ same(canvas), same(rowList.get(1)), same(rowList.get(1).getSpanList().get(1)), eq(true),
+ same(carrierEmojiRenderHelper));
+ canvas.drawLine(eq(20f), geq(10f), eq(20f), leq(20f), isA(Paint.class));
+ renderer.drawSpan(
+ same(canvas), same(rowList.get(1)), same(rowList.get(1).getSpanList().get(2)), eq(false),
+ same(carrierEmojiRenderHelper));
+ canvas.drawLine(eq(30f), geq(10f), eq(30f), leq(20f), isA(Paint.class));
+ renderer.drawSpan(
+ same(canvas), same(rowList.get(1)), same(rowList.get(1).getSpanList().get(3)), eq(true),
+ same(carrierEmojiRenderHelper));
+ canvas.drawLine(eq(40f), geq(10f), eq(40f), leq(20f), isA(Paint.class));
+ renderer.drawSpan(
+ same(canvas), same(rowList.get(1)), same(rowList.get(1).getSpanList().get(4)), eq(false),
+ same(carrierEmojiRenderHelper));
+
+ // Row 2
+ renderer.drawSpan(
+ same(canvas), same(rowList.get(2)), same(rowList.get(2).getSpanList().get(0)), eq(false),
+ same(carrierEmojiRenderHelper));
+ canvas.drawLine(eq(10f), geq(20f), eq(10f), leq(30f), isA(Paint.class));
+ renderer.drawSpan(
+ same(canvas), same(rowList.get(2)), same(rowList.get(2).getSpanList().get(1)), eq(false),
+ same(carrierEmojiRenderHelper));
+ canvas.drawLine(eq(20f), geq(20f), eq(20f), leq(30f), isA(Paint.class));
+ renderer.drawSpan(
+ same(canvas), same(rowList.get(2)), same(rowList.get(2).getSpanList().get(2)), eq(false),
+ same(carrierEmojiRenderHelper));
+ canvas.drawLine(eq(30f), geq(20f), eq(30f), leq(30f), isA(Paint.class));
+ renderer.drawSpan(
+ same(canvas), same(rowList.get(2)), same(rowList.get(2).getSpanList().get(3)), eq(false),
+ same(carrierEmojiRenderHelper));
+ canvas.drawLine(eq(40f), geq(20f), eq(40f), leq(30f), isA(Paint.class));
+ renderer.drawSpan(
+ same(canvas), same(rowList.get(2)), same(rowList.get(2).getSpanList().get(4)), eq(false),
+ same(carrierEmojiRenderHelper));
+
+ // Row 3
+ renderer.drawSpan(
+ same(canvas), same(rowList.get(3)), same(rowList.get(3).getSpanList().get(0)), eq(false),
+ same(carrierEmojiRenderHelper));
+ canvas.drawLine(eq(10f), geq(30f), eq(10f), leq(40f), isA(Paint.class));
+ renderer.drawSpan(
+ same(canvas), same(rowList.get(3)), same(rowList.get(3).getSpanList().get(1)), eq(false),
+ same(carrierEmojiRenderHelper));
+ canvas.drawLine(eq(20f), geq(30f), eq(20f), leq(40f), isA(Paint.class));
+ renderer.drawSpan(
+ same(canvas), same(rowList.get(3)), same(rowList.get(3).getSpanList().get(2)), eq(false),
+ same(carrierEmojiRenderHelper));
+ canvas.drawLine(eq(30f), geq(30f), eq(30f), leq(40f), isA(Paint.class));
+ renderer.drawSpan(
+ same(canvas), same(rowList.get(3)), same(rowList.get(3).getSpanList().get(3)), eq(false),
+ same(carrierEmojiRenderHelper));
+ canvas.drawLine(eq(40f), geq(30f), eq(40f), leq(40f), isA(Paint.class));
+ renderer.drawSpan(
+ same(canvas), same(rowList.get(3)), same(rowList.get(3).getSpanList().get(4)), eq(false),
+ same(carrierEmojiRenderHelper));
+
+ // Row 4
+ renderer.drawSpan(
+ same(canvas), same(rowList.get(4)), same(rowList.get(4).getSpanList().get(0)), eq(false),
+ same(carrierEmojiRenderHelper));
+ canvas.drawLine(eq(10f), geq(40f), eq(10f), leq(50f), isA(Paint.class));
+ renderer.drawSpan(
+ same(canvas), same(rowList.get(4)), same(rowList.get(4).getSpanList().get(1)), eq(false),
+ same(carrierEmojiRenderHelper));
+ canvas.drawLine(eq(20f), geq(40f), eq(20f), leq(50f), isA(Paint.class));
+ renderer.drawSpan(
+ same(canvas), same(rowList.get(4)), same(rowList.get(4).getSpanList().get(2)), eq(false),
+ same(carrierEmojiRenderHelper));
+ canvas.drawLine(eq(30f), geq(40f), eq(30f), leq(50f), isA(Paint.class));
+ renderer.drawSpan(
+ same(canvas), same(rowList.get(4)), same(rowList.get(4).getSpanList().get(3)), eq(false),
+ same(carrierEmojiRenderHelper));
+ canvas.drawLine(eq(40f), geq(40f), eq(40f), leq(50f), isA(Paint.class));
+ renderer.drawSpan(
+ same(canvas), same(rowList.get(4)), same(rowList.get(4).getSpanList().get(4)), eq(false),
+ same(carrierEmojiRenderHelper));
+
+ replayAll();
+ renderer.drawCandidateLayout(canvas, candidateLayout, 8, carrierEmojiRenderHelper);
+
+ verifyAll();
+ }
+
+ public void testVeryLongValueAndDescription() {
+ String veryLongWord = "";
+ for (int i = 0; i < 64; ++i) {
+ veryLongWord += "ああああ";
+ }
+ CandidateList candidateList = CandidateList.newBuilder()
+ .addCandidates(CandidateWord.newBuilder()
+ .setId(0)
+ .setIndex(0)
+ .setKey(veryLongWord)
+ .setValue(veryLongWord)
+ .setAnnotation(Annotation.newBuilder()
+ .setDescription(veryLongWord)))
+ .build();
+ CandidateLayoutRenderer renderer = new CandidateLayoutRenderer();
+ renderer.setCandidateList(Optional.of(candidateList));
+ renderer.setDescriptionLayoutPolicy(DescriptionLayoutPolicy.EXCLUSIVE);
+ renderer.setValueScalingPolicy(ValueScalingPolicy.HORIZONTAL);
+ int textSize = 10;
+ renderer.setValueTextSize(textSize);
+ renderer.setDescriptionTextSize(textSize);
+ Paint paint = new Paint();
+ paint.setTextSize(textSize);
+ float wordWidth = paint.measureText(veryLongWord);
+
+ Row row = new Row();
+ row.setTop(10);
+ row.setHeight(10);
+ row.setWidth(10);
+ Span span = new Span(
+ Optional.of(candidateList.getCandidates(0)), wordWidth, wordWidth,
+ Collections.<String>emptyList());
+ span.setLeft(0);
+ span.setRight(10);
+ row.addSpan(span);
+ List<Row> rowList = Collections.singletonList(row);
+ CandidateLayout candidateLayout = new CandidateLayout(rowList, 10, 10);
+
+ View targetView = createViewMock(View.class);
+ CarrierEmojiRenderHelper carrierEmojiRenderHelper =
+ createMockBuilder(CarrierEmojiRenderHelper.class)
+ .withConstructor(View.class)
+ .withArgs(targetView)
+ .createNiceMock();
+ Canvas canvas = createMockBuilder(Canvas.class)
+ .addMockedMethod("getClipBounds", Rect.class)
+ .createNiceMock();
+ expect(canvas.getClipBounds(isA(Rect.class))).andStubAnswer(new IAnswer<Boolean>() {
+ @Override
+ public Boolean answer() throws Throwable {
+ Rect.class.cast(getCurrentArguments()[0]).set(0, 0, 10, 10);
+ return Boolean.TRUE;
+ }
+ });
+
+ replayAll();
+ renderer.drawCandidateLayout(canvas, candidateLayout, 0, carrierEmojiRenderHelper);
+ verifyAll();
}
}
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/ui/ConversionCandidateLayouterTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/ui/ConversionCandidateLayouterTest.java
index abb76e9..98afde0 100644
--- a/src/android/tests/src/com/google/android/inputmethod/japanese/ui/ConversionCandidateLayouterTest.java
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/ui/ConversionCandidateLayouterTest.java
@@ -200,7 +200,7 @@
ConversionCandidateLayouter.layoutSpanList(spanList, 180, 18, DUMMY_CHUNK_METRICS, new int[18]);
// The remaining chunks will be assigned to the spans.
- float[] expectedXCoord = {0, 30, 60, 100, 140, 180};
+ float[] expectedXCoord = {0, 40, 80, 120, 150, 180};
for (int i = 0; i < spanList.size(); ++i) {
assertEquals(expectedXCoord[i], spanList.get(i).getLeft());
assertEquals(expectedXCoord[i + 1], spanList.get(i).getRight());
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/ui/FloatingCandidateLayoutRendererTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/ui/FloatingCandidateLayoutRendererTest.java
new file mode 100644
index 0000000..8fe3e73
--- /dev/null
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/ui/FloatingCandidateLayoutRendererTest.java
@@ -0,0 +1,186 @@
+// Copyright 2010-2014, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package org.mozc.android.inputmethod.japanese.ui;
+
+import org.mozc.android.inputmethod.japanese.ViewEventListener;
+import org.mozc.android.inputmethod.japanese.protobuf.ProtoCandidates.Annotation;
+import org.mozc.android.inputmethod.japanese.protobuf.ProtoCandidates.Candidates;
+import org.mozc.android.inputmethod.japanese.protobuf.ProtoCandidates.Candidates.Candidate;
+import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Command;
+import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Output;
+import org.mozc.android.inputmethod.japanese.testing.InstrumentationTestCaseWithMock;
+import com.google.common.base.Optional;
+import com.google.common.base.Preconditions;
+
+import android.content.res.Resources;
+import android.graphics.Rect;
+import android.test.suitebuilder.annotation.SmallTest;
+import android.view.MotionEvent;
+
+/**
+ * Test for FloatingCandidateLayoutRenderer.
+ */
+public class FloatingCandidateLayoutRendererTest extends InstrumentationTestCaseWithMock {
+
+ private Command generateCommandsProto(int candidatesNum) {
+ Preconditions.checkArgument(0 <= candidatesNum && candidatesNum < 10);
+ Candidates.Builder candidatesBuilder = Candidates.newBuilder();
+ for (int i = 0; i < candidatesNum; ++i) {
+ candidatesBuilder.addCandidate(Candidate.newBuilder()
+ .setIndex(i)
+ .setValue("cand_" + Integer.toString(i))
+ .setId(i)
+ .setAnnotation(Annotation.newBuilder().setShortcut(Integer.toString(i + 1))));
+ }
+ candidatesBuilder.setSize(candidatesNum);
+ candidatesBuilder.setPosition(0);
+
+ return Command.newBuilder()
+ .setOutput(Output.newBuilder().setCandidates(candidatesBuilder))
+ .buildPartial();
+ }
+
+ @SmallTest
+ public void testSetCandidates() {
+ Resources resources = getInstrumentation().getTargetContext().getResources();
+ FloatingCandidateLayoutRenderer layoutRenderer = new FloatingCandidateLayoutRenderer(resources);
+ layoutRenderer.setMaxWidth(Integer.MAX_VALUE);
+
+ // No candidates
+ layoutRenderer.setCandidates(generateCommandsProto(0));
+ assertFalse(layoutRenderer.getWindowRect().isPresent());
+
+ layoutRenderer.setCandidates(generateCommandsProto(1));
+ Optional<Rect> candidateRect1 = layoutRenderer.getWindowRect();
+ assertTrue(candidateRect1.isPresent());
+ assertTrue(0 > candidateRect1.get().left);
+ assertEquals(0, candidateRect1.get().top);
+ assertTrue(candidateRect1.get().width() > 0);
+ assertTrue(candidateRect1.get().height() > 0);
+
+ layoutRenderer.setCandidates(generateCommandsProto(2));
+ Optional<Rect> candidateRect2 = layoutRenderer.getWindowRect();
+ assertTrue(candidateRect2.isPresent());
+ assertTrue(0 > candidateRect2.get().left);
+ assertEquals(0, candidateRect2.get().top);
+ assertTrue(candidateRect2.get().width() > 0);
+ assertTrue(candidateRect2.get().height() > 0);
+
+ int candidateHeight = candidateRect2.get().height() - candidateRect1.get().height();
+
+ layoutRenderer.setCandidates(generateCommandsProto(3));
+ Optional<Rect> candidateRect3 = layoutRenderer.getWindowRect();
+ assertTrue(candidateRect3.isPresent());
+ assertTrue(0 > candidateRect3.get().left);
+ assertEquals(0, candidateRect3.get().top);
+ assertTrue(candidateRect3.get().width() > 0);
+ assertEquals(candidateRect2.get().height() + candidateHeight, candidateRect3.get().height());
+ }
+
+ public void testSetMaxWidth() {
+ Resources resources = getInstrumentation().getTargetContext().getResources();
+ FloatingCandidateLayoutRenderer layoutRenderer = new FloatingCandidateLayoutRenderer(resources);
+ layoutRenderer.setMaxWidth(Integer.MAX_VALUE);
+
+ layoutRenderer.setCandidates(generateCommandsProto(1));
+ Rect originalCandidateRect = layoutRenderer.getWindowRect().get();
+ int maxWidth = originalCandidateRect.width() - 1;
+
+ layoutRenderer.setMaxWidth(maxWidth);
+ Optional<Rect> candidateRectWithLimit = layoutRenderer.getWindowRect();
+ assertTrue(candidateRectWithLimit.isPresent());
+ assertEquals(maxWidth, candidateRectWithLimit.get().width());
+ assertEquals(originalCandidateRect.height(), candidateRectWithLimit.get().height());
+
+ layoutRenderer.setMaxWidth(originalCandidateRect.width());
+ assertEquals(originalCandidateRect, layoutRenderer.getWindowRect().get());
+
+ layoutRenderer.setMaxWidth(0);
+ assertFalse(layoutRenderer.getWindowRect().isPresent());
+ }
+
+ @SmallTest
+ public void testTouchEvent() {
+ Resources resources = getInstrumentation().getTargetContext().getResources();
+ FloatingCandidateLayoutRenderer layoutRenderer = new FloatingCandidateLayoutRenderer(resources);
+ layoutRenderer.setMaxWidth(Integer.MAX_VALUE);
+
+ layoutRenderer.setCandidates(generateCommandsProto(1));
+ int hight1 = layoutRenderer.getWindowRect().get().height();
+ layoutRenderer.setCandidates(generateCommandsProto(2));
+ int hight2 = layoutRenderer.getWindowRect().get().height();
+ int candidateHeight = hight2 - hight1;
+
+ ViewEventListener listener = createMock(ViewEventListener.class);
+ layoutRenderer.setViewEventListener(listener);
+
+ resetAll();
+ listener.onConversionCandidateSelected(0, Optional.<Integer>absent());
+ replayAll();
+ MotionEvent downEvent = MotionEvent.obtain(0L, 0L, MotionEvent.ACTION_DOWN, 0, 0, 0);
+ MotionEvent upEvent = MotionEvent.obtain(0L, 0L, MotionEvent.ACTION_UP, 0, 0, 0);
+ try {
+ layoutRenderer.onTouchEvent(downEvent);
+ layoutRenderer.onTouchEvent(upEvent);
+ } finally {
+ downEvent.recycle();
+ upEvent.recycle();
+ }
+ verifyAll();
+
+ resetAll();
+ listener.onConversionCandidateSelected(0, Optional.<Integer>absent());
+ replayAll();
+ downEvent = MotionEvent.obtain(0L, 0L, MotionEvent.ACTION_DOWN, 0, 0, 0);
+ upEvent = MotionEvent.obtain(0L, 0L, MotionEvent.ACTION_UP, 0, candidateHeight - 1, 0);
+ try {
+ layoutRenderer.onTouchEvent(downEvent);
+ layoutRenderer.onTouchEvent(upEvent);
+ } finally {
+ downEvent.recycle();
+ upEvent.recycle();
+ }
+ verifyAll();
+
+ resetAll();
+ listener.onConversionCandidateSelected(1, Optional.<Integer>absent());
+ replayAll();
+ downEvent = MotionEvent.obtain(0L, 0L, MotionEvent.ACTION_DOWN, 0, candidateHeight, 0);
+ upEvent = MotionEvent.obtain(0L, 0L, MotionEvent.ACTION_UP, 0, candidateHeight, 0);
+ try {
+ layoutRenderer.onTouchEvent(downEvent);
+ layoutRenderer.onTouchEvent(upEvent);
+ } finally {
+ downEvent.recycle();
+ upEvent.recycle();
+ }
+ verifyAll();
+ }
+}
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/ui/FloatingModeIndicatorTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/ui/FloatingModeIndicatorTest.java
new file mode 100644
index 0000000..e2f153a
--- /dev/null
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/ui/FloatingModeIndicatorTest.java
@@ -0,0 +1,114 @@
+// Copyright 2010-2014, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package org.mozc.android.inputmethod.japanese.ui;
+
+import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Command;
+import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.CompositionMode;
+import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Input;
+import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Output;
+import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Preedit;
+import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Preedit.Segment;
+import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.SessionCommand;
+import org.mozc.android.inputmethod.japanese.testing.ApiLevel;
+import org.mozc.android.inputmethod.japanese.testing.InstrumentationTestCaseWithMock;
+
+import android.annotation.TargetApi;
+import android.os.Handler;
+import android.test.suitebuilder.annotation.SmallTest;
+import android.view.View;
+
+/**
+ * Test for FloatingCandidateLayoutRenderer.
+ */
+@ApiLevel(21)
+@TargetApi(21)
+public class FloatingModeIndicatorTest extends InstrumentationTestCaseWithMock {
+
+ private final Command emptyCommand = Command.getDefaultInstance();
+ private final Command nonEmptyCommand = Command.newBuilder()
+ .setOutput(Output.newBuilder()
+ .setPreedit(Preedit.newBuilder()
+ .addSegment(Segment.getDefaultInstance())
+ .buildPartial())
+ .buildPartial())
+ .buildPartial();
+ private final Command switchInputModeCommand = Command.newBuilder()
+ .setInput(Input.newBuilder()
+ .setType(Input.CommandType.SEND_COMMAND)
+ .setCommand(SessionCommand.newBuilder()
+ .setType(SessionCommand.CommandType.SWITCH_INPUT_MODE)
+ .buildPartial())
+ .buildPartial())
+ .buildPartial();
+
+ private void clearMessages(Handler handler) {
+ handler.removeMessages(FloatingModeIndicator.HIDE_MODE_INDICATOR);
+ }
+
+ @SmallTest
+ public void testBasicBehavior() {
+ View parentView = createViewMockBuilder(View.class).createNiceMock();
+ FloatingModeIndicator modeIndicator = new FloatingModeIndicator(parentView);
+
+ replayAll();
+
+ assertEquals(View.GONE, modeIndicator.popup.getContentView().getVisibility());
+ assertFalse(modeIndicator.isVisible());
+
+ modeIndicator.setCompositionMode(CompositionMode.HIRAGANA);
+ assertTrue(modeIndicator.isVisible());
+ assertTrue(modeIndicator.handler.hasMessages(FloatingModeIndicator.HIDE_MODE_INDICATOR));
+ clearMessages(modeIndicator.handler);
+
+ modeIndicator.setCommand(nonEmptyCommand);
+ assertFalse(modeIndicator.isVisible());
+ assertFalse(modeIndicator.handler.hasMessages(FloatingModeIndicator.HIDE_MODE_INDICATOR));
+ clearMessages(modeIndicator.handler);
+
+ modeIndicator.setCompositionMode(CompositionMode.HALF_ASCII);
+ assertFalse(modeIndicator.isVisible());
+ assertFalse(modeIndicator.handler.hasMessages(FloatingModeIndicator.HIDE_MODE_INDICATOR));
+ clearMessages(modeIndicator.handler);
+
+ modeIndicator.setCommand(emptyCommand);
+ modeIndicator.setCompositionMode(CompositionMode.HALF_ASCII);
+ assertTrue(modeIndicator.isVisible());
+ assertTrue(modeIndicator.handler.hasMessages(FloatingModeIndicator.HIDE_MODE_INDICATOR));
+ clearMessages(modeIndicator.handler);
+
+ // SWITCH_INPUT_MODE should be ignored.
+ modeIndicator.setCommand(switchInputModeCommand);
+ assertTrue(modeIndicator.isVisible());
+ assertFalse(modeIndicator.handler.hasMessages(FloatingModeIndicator.HIDE_MODE_INDICATOR));
+ clearMessages(modeIndicator.handler);
+
+ verifyAll();
+ }
+}
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/ui/MenuDialogTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/ui/MenuDialogTest.java
index fd4187c..f177e92 100644
--- a/src/android/tests/src/com/google/android/inputmethod/japanese/ui/MenuDialogTest.java
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/ui/MenuDialogTest.java
@@ -46,6 +46,7 @@
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.test.mock.MockContext;
+import android.test.mock.MockPackageManager;
import android.test.suitebuilder.annotation.SmallTest;
import java.util.Collections;
@@ -74,7 +75,6 @@
int[] indexToIdTable = new int[] {
R.string.menu_item_input_method,
R.string.menu_item_preferences,
- R.string.menu_item_voice_input,
R.string.menu_item_mushroom,
};
MenuDialogListenerHandler handler =
@@ -116,21 +116,12 @@
verifyAll();
- // Test for onLaunchVoiceInputActivitySelected.
- resetAll();
- listener.onLaunchVoiceInputActivitySelected(same(context));
- replayAll();
-
- handler.onClick(dialog, 2);
-
- verifyAll();
-
// Test for onShowMushroomSelectionDialogSelected.
resetAll();
listener.onShowMushroomSelectionDialogSelected(same(context));
replayAll();
- handler.onClick(dialog, 3);
+ handler.onClick(dialog, 2);
verifyAll();
}
@@ -141,24 +132,15 @@
// If no mushroom-aware application is installed, Mushroom should be disabled.
resetAll();
- PackageManager packageManager = createMock(PackageManager.class);
+ PackageManager packageManager = createMock(MockPackageManager.class);
expect(packageManager.queryIntentActivities(notNull(Intent.class), eq(0)))
.andStubReturn(Collections.<ResolveInfo>emptyList());
expect(context.getPackageManager()).andStubReturn(packageManager);
replayAll();
- { // Voice: Off, Mushroom: On
- List<Integer> result = MenuDialog.getEnabledMenuIds(context, true);
- assertEquals(3, result.size());
- assertEquals(R.string.menu_item_input_method, result.get(0).intValue());
- assertEquals(R.string.menu_item_preferences, result.get(1).intValue());
- assertEquals(R.string.menu_item_voice_input, result.get(2).intValue());
- }
- { // Voice: Off, Mushroom: Off
- List<Integer> result = MenuDialog.getEnabledMenuIds(context, false);
- assertEquals(2, result.size());
- assertEquals(R.string.menu_item_input_method, result.get(0).intValue());
- assertEquals(R.string.menu_item_preferences, result.get(1).intValue());
- }
+ List<Integer> result = MenuDialog.getEnabledMenuIds(context);
+ assertEquals(2, result.size());
+ assertEquals(R.string.menu_item_input_method, result.get(0).intValue());
+ assertEquals(R.string.menu_item_preferences, result.get(1).intValue());
verifyAll();
// If a mushroom-aware application is installed, Mushroom should be enabled.
@@ -167,21 +149,11 @@
.andStubReturn(Collections.singletonList(new ResolveInfo()));
expect(context.getPackageManager()).andStubReturn(packageManager);
replayAll();
- { // Voice: On, Mushroom: On
- List<Integer> result = MenuDialog.getEnabledMenuIds(context, true);
- assertEquals(4, result.size());
- assertEquals(R.string.menu_item_input_method, result.get(0).intValue());
- assertEquals(R.string.menu_item_preferences, result.get(1).intValue());
- assertEquals(R.string.menu_item_voice_input, result.get(2).intValue());
- assertEquals(R.string.menu_item_mushroom, result.get(3).intValue());
- }
- { // Voice: Off, Mushroom: On
- List<Integer> result = MenuDialog.getEnabledMenuIds(context, false);
- assertEquals(3, result.size());
- assertEquals(R.string.menu_item_input_method, result.get(0).intValue());
- assertEquals(R.string.menu_item_preferences, result.get(1).intValue());
- assertEquals(R.string.menu_item_mushroom, result.get(2).intValue());
- }
+ result = MenuDialog.getEnabledMenuIds(context);
+ assertEquals(3, result.size());
+ assertEquals(R.string.menu_item_input_method, result.get(0).intValue());
+ assertEquals(R.string.menu_item_preferences, result.get(1).intValue());
+ assertEquals(R.string.menu_item_mushroom, result.get(2).intValue());
verifyAll();
}
}
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/ui/PopUpLayouterTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/ui/PopUpLayouterTest.java
new file mode 100644
index 0000000..f31161b
--- /dev/null
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/ui/PopUpLayouterTest.java
@@ -0,0 +1,97 @@
+// Copyright 2010-2014, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package org.mozc.android.inputmethod.japanese.ui;
+
+import static org.easymock.EasyMock.capture;
+import static org.easymock.EasyMock.eq;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.expectLastCall;
+import static org.easymock.EasyMock.getCurrentArguments;
+import static org.easymock.EasyMock.isA;
+
+import org.mozc.android.inputmethod.japanese.testing.InstrumentationTestCaseWithMock;
+
+import android.content.Context;
+import android.test.suitebuilder.annotation.SmallTest;
+import android.view.View;
+import android.widget.FrameLayout;
+
+import org.easymock.Capture;
+import org.easymock.IAnswer;
+
+/**
+ * Test for PopUpLayouter class.
+ */
+public class PopUpLayouterTest extends InstrumentationTestCaseWithMock {
+
+ @SmallTest
+ public void testBasicLayout() {
+ Context context = getInstrumentation().getTargetContext();
+ FrameLayout screenContentLayout = createMockBuilder(FrameLayout.class)
+ .withConstructor(context)
+ .createMock();
+ View rootView = createViewMock(View.class);
+ View parentView = createViewMock(View.class);
+ View popUpContentView = createViewMock(View.class);
+
+ IAnswer<Void> getLocationInWindowAnswer = new IAnswer<Void>() {
+ @Override
+ public Void answer() {
+ int[] location = int[].class.cast(getCurrentArguments()[0]);
+ location[0] = 100;
+ location[1] = 200;
+ return null;
+ }
+ };
+
+ Capture<FrameLayout.LayoutParams> layoutCapture = new Capture<FrameLayout.LayoutParams>();
+
+ resetAll();
+ expect(rootView.findViewById(android.R.id.content)).andStubReturn(
+ View.class.cast(screenContentLayout));
+ screenContentLayout.addView(eq(popUpContentView), isA(FrameLayout.LayoutParams.class));
+ expect(parentView.getRootView()).andStubReturn(View.class.cast(rootView));
+ parentView.getLocationInWindow(isA(int[].class));
+ expectLastCall().andAnswer(getLocationInWindowAnswer);
+ expect(popUpContentView.getLayoutParams()).andStubReturn(
+ new FrameLayout.LayoutParams(1000, 1000));
+ popUpContentView.setLayoutParams(capture(layoutCapture));
+ replayAll();
+ PopUpLayouter<View> layouter = new PopUpLayouter<View>(parentView, popUpContentView);
+ layouter.setBounds(110, 220, 330, 550);
+ verifyAll();
+
+ assertEquals(popUpContentView, layouter.getContentView());
+ assertEquals(210, layoutCapture.getValue().leftMargin);
+ assertEquals(420, layoutCapture.getValue().topMargin);
+ assertEquals(220, layoutCapture.getValue().width);
+ assertEquals(330, layoutCapture.getValue().height);
+ }
+}
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/ui/ScrollGuideViewTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/ui/ScrollGuideViewTest.java
index 4c78226..e9c78ab 100644
--- a/src/android/tests/src/com/google/android/inputmethod/japanese/ui/ScrollGuideViewTest.java
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/ui/ScrollGuideViewTest.java
@@ -38,11 +38,14 @@
/**
*/
public class ScrollGuideViewTest extends InstrumentationTestCase {
+
@SmallTest
public void testScrollGuideViewSkin() {
ScrollGuideView view = new ScrollGuideView(getInstrumentation().getTargetContext());
- Drawable drawable = view.scrollBarDrawable;
- view.setSkinType(SkinType.TEST);
- assertNotSame(drawable, view.scrollBarDrawable);
+ Drawable scrollBarDrawable = view.scrollBarDrawable;
+ Drawable backgroundDrawable = view.getBackground();
+ view.setSkin(SkinType.TEST.getSkin(getInstrumentation().getTargetContext().getResources()));
+ assertNotSame(scrollBarDrawable, view.scrollBarDrawable);
+ assertNotSame(backgroundDrawable, view.getBackground());
}
}
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/ui/SpanFactoryTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/ui/SpanFactoryTest.java
index 9be7cff..21c597e 100644
--- a/src/android/tests/src/com/google/android/inputmethod/japanese/ui/SpanFactoryTest.java
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/ui/SpanFactoryTest.java
@@ -33,15 +33,12 @@
import org.mozc.android.inputmethod.japanese.protobuf.ProtoCandidates.Annotation;
import org.mozc.android.inputmethod.japanese.protobuf.ProtoCandidates.CandidateWord;
-import org.mozc.android.inputmethod.japanese.testing.Parameter;
import org.mozc.android.inputmethod.japanese.ui.CandidateLayout.Span;
import android.test.suitebuilder.annotation.SmallTest;
import junit.framework.TestCase;
-import java.util.Arrays;
-
/**
* Unit test for {@link SpanFactory}.
*
@@ -82,40 +79,4 @@
assertEquals(valueSpan.getValueWidth(), mergedSpan.getValueWidth());
assertEquals(descriptionSpan.getDescriptionWidth(), mergedSpan.getDescriptionWidth());
}
-
- @SmallTest
- public void testSplitDescriptionList() {
- class TestData extends Parameter {
- final String description;
- final String[] expectedResult;
-
- TestData(String description, String[] expectedResult) {
- super();
- this.description = description;
- this.expectedResult = expectedResult;
- }
- }
- TestData[] testDataList = {
- new TestData("", new String[]{}),
- new TestData("a", new String[]{"a"}),
- new TestData("a b", new String[]{"a", "b"}),
- new TestData("a b c d", new String[]{"a", "b", "c", "d"}),
- new TestData("a b c d e", new String[]{"a", "b", "c", "d", "e"}),
- // NG words
- new TestData("ひらがな", new String[]{}),
- new TestData("a ひらがな b", new String[]{"a", "b"}),
- };
-
- SpanFactory spanFactory = new SpanFactory();
- spanFactory.setDescriptionDelimiter(" ");
- for (TestData testData : testDataList) {
- CandidateWord candidateWord = CandidateWord.newBuilder()
- .setAnnotation(Annotation.newBuilder()
- .setDescription(testData.description))
- .build();
- assertEquals(testData.toString(),
- Arrays.asList(testData.expectedResult),
- spanFactory.newInstance(candidateWord).getSplitDescriptionList());
- }
- }
}
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/util/CandidateDescriptionUtilTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/util/CandidateDescriptionUtilTest.java
new file mode 100644
index 0000000..9d530f7
--- /dev/null
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/util/CandidateDescriptionUtilTest.java
@@ -0,0 +1,96 @@
+// Copyright 2010-2014, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package org.mozc.android.inputmethod.japanese.util;
+
+import org.mozc.android.inputmethod.japanese.testing.Parameter;
+import com.google.common.base.Optional;
+import com.google.common.base.Preconditions;
+
+import android.test.InstrumentationTestCase;
+import android.test.suitebuilder.annotation.SmallTest;
+
+import java.util.List;
+
+/**
+ * Teset for CandidateDescriptionUtil class.
+ */
+public class CandidateDescriptionUtilTest extends InstrumentationTestCase {
+
+ @SmallTest
+ public void testExtractDescriptions() {
+ class TestData extends Parameter {
+ final String input;
+ final String[] expectedDescriptions;
+
+ public TestData(String input, String[] expectedDescriptions) {
+ this.input = Preconditions.checkNotNull(input);
+ this.expectedDescriptions = Preconditions.checkNotNull(expectedDescriptions);
+ }
+ }
+
+ TestData[] testDataArray = new TestData[] {
+ new TestData("[全]", new String[] {"[全]"}),
+ new TestData("[全] てすと", new String[] {"[全]", "てすと"}),
+ new TestData("[全]\nてすと", new String[] {"[全]", "てすと"}),
+ new TestData("丸数字", new String[] {}),
+ new TestData("丸数字 [全]", new String[] {"[全]"}),
+ new TestData("[全] 丸数字", new String[] {"[全]"}),
+ new TestData("[全] 丸数字 てすと", new String[] {"[全]", "てすと"}),
+ new TestData("小書き文字", new String[] {"小書き"}),
+ new TestData("小書き文字 [全]", new String[] {"小書き", "[全]"}),
+ new TestData("[全] 小書き文字", new String[] {"[全]", "小書き"}),
+ new TestData("[全] 小書き文字 てすと", new String[] {"[全]", "小書き", "てすと"}),
+ new TestData("亜の旧字体", new String[] {}),
+ new TestData("亜の旧字体 [全]", new String[] {"[全]"}),
+ new TestData("[全] 亜の旧字体", new String[] {"[全]"}),
+ new TestData("[全] 亜の旧字体\n小書き文字 丸数字 てすと", new String[] {"[全]", "小書き", "てすと"}),
+ };
+
+ assertEquals(
+ CandidateDescriptionUtil.extractDescriptions("", Optional.<String>absent()).size(), 0);
+ assertEquals(CandidateDescriptionUtil.extractDescriptions("", Optional.of(" \n")).size(), 0);
+
+ for (TestData testData : testDataArray) {
+ List<String> descriptionsWithoutDelimiter =
+ CandidateDescriptionUtil.extractDescriptions(testData.input, Optional.<String>absent());
+ assertEquals(testData.input, 1, descriptionsWithoutDelimiter.size());
+ assertEquals(testData.input, testData.input, descriptionsWithoutDelimiter.get(0));
+
+ List<String> descriptionsWithDelimiter =
+ CandidateDescriptionUtil.extractDescriptions(testData.input, Optional.of(" \n"));
+ assertEquals(testData.input,
+ testData.expectedDescriptions.length, descriptionsWithDelimiter.size());
+ for (int i = 0; i < testData.expectedDescriptions.length; ++i) {
+ assertEquals(testData.input + " i=" + i,
+ testData.expectedDescriptions[i], descriptionsWithDelimiter.get(i));
+ }
+ }
+ }
+}
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/util/LauncherIconManagerFactoryTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/util/LauncherIconManagerFactoryTest.java
new file mode 100644
index 0000000..bfcc965
--- /dev/null
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/util/LauncherIconManagerFactoryTest.java
@@ -0,0 +1,109 @@
+// Copyright 2010-2014, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package org.mozc.android.inputmethod.japanese.util;
+
+import org.mozc.android.inputmethod.japanese.MozcUtil;
+import org.mozc.android.inputmethod.japanese.preference.PreferenceUtil;
+import org.mozc.android.inputmethod.japanese.testing.MozcPreferenceUtil;
+import org.mozc.android.inputmethod.japanese.testing.Parameter;
+import com.google.common.base.Optional;
+
+import android.content.SharedPreferences;
+import android.test.InstrumentationTestCase;
+import android.test.suitebuilder.annotation.SmallTest;
+
+/**
+ * Test for LauncherIconManagerFactory.
+ */
+public class LauncherIconManagerFactoryTest extends InstrumentationTestCase {
+
+ /**
+ * Test for shouldLauncherIconBeVisible.
+ * Note that this test focus on the situation where PREF_LAUNCHER_ICON_VISIBILITY_KEY is not set.
+ * Preinstall version (2.16.1955.3) without showing preference screen OR first launch.
+ */
+ @SmallTest
+ public void testShouldLauncherIconBeVisible() {
+ SharedPreferences sharedPreferences = MozcPreferenceUtil.getSharedPreferences(
+ getInstrumentation().getContext(), "CLIENT_SIDE_PREF");
+ class TestData extends Parameter {
+ final boolean isSystemApplication;
+ final boolean isUpdatedSystemApplication;
+ final boolean isLaunchedAtLeastOnce;
+ final boolean expectation;
+ public TestData(boolean isSystemApplication, boolean isUpdatedSystemApplication,
+ boolean isLaunchedAtLeastOnce, boolean expectation) {
+ this.isSystemApplication = isSystemApplication;
+ this.isUpdatedSystemApplication = isUpdatedSystemApplication;
+ this.isLaunchedAtLeastOnce = isLaunchedAtLeastOnce;
+ this.expectation = expectation;
+ }
+ }
+ // NOTE: Basically if isLaunchedAtLeastOnce is true shouldLauncherIconBeVisible is not called.
+ // However Preinstall (2.16.1955.3) doesn't set PREF_LAUNCHER_ICON_VISIBILITY_KEY
+ // preference so the version and the first launch after upgrade from the version
+ // reach here.
+ TestData[] testDataList = {
+ // Launch PlayStore as the first time.
+ new TestData(false, false, false, true),
+ // Preinstall version (never launched) -> Launch PlayStore
+ // This situation should be treated as the same as usual installation from PlayStore.
+ new TestData(false, true, false, true), // Never happen. Just in case.
+ new TestData(true, true, false, true),
+ // Launch Preinstall as the first time (2.16.1955.3) -> Launch PlayStore.
+ // The icon should be kept invisible.
+ // NOTE: PlayStore -> Playstore scenario doesn't reach here because visibility preference is
+ // set on the first launch.
+ new TestData(false, true, true, false), // Never happen. Just in case.
+ new TestData(true, true, true, false),
+ // Launch Preinstall (any version) as the first time.
+ new TestData(true, false, false, false),
+ // Launch Preinstall (2.16.1955.3) as the first time -> Launch Preinstall
+ new TestData(true, false, true, false),
+ // Below situation should never happen.
+ // new TestData(false, false, true, n/a),
+ };
+ for (TestData testData : testDataList) {
+ SharedPreferences.Editor editor = sharedPreferences.edit().clear();
+ if (testData.isLaunchedAtLeastOnce) {
+ editor.putInt(PreferenceUtil.PREF_LAST_LAUNCH_ABI_INDEPENDENT_VERSION_CODE, 1234);
+ }
+ editor.apply();
+ MozcUtil.setSystemApplication(Optional.of(testData.isSystemApplication));
+ MozcUtil.setUpdatedSystemApplication(Optional.of(testData.isUpdatedSystemApplication));
+ assertEquals(
+ testData.toString(),
+ testData.expectation,
+ LauncherIconManagerFactory.DefaultImplementation
+ .shouldLauncherIconBeVisible(getInstrumentation().getTargetContext(),
+ sharedPreferences));
+ }
+ }
+}
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/util/ResourcesWrapperTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/util/ResourcesWrapperTest.java
index 152485f..0c2a520 100644
--- a/src/android/tests/src/com/google/android/inputmethod/japanese/util/ResourcesWrapperTest.java
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/util/ResourcesWrapperTest.java
@@ -36,6 +36,7 @@
import org.mozc.android.inputmethod.japanese.MozcUtil;
import org.mozc.android.inputmethod.japanese.testing.ApiLevel;
import org.mozc.android.inputmethod.japanese.testing.InstrumentationTestCaseWithMock;
+import org.mozc.android.inputmethod.japanese.testing.MockInputStream;
import android.annotation.TargetApi;
import android.content.Context;
@@ -438,7 +439,7 @@
@SmallTest
public void testOpenRawResource1() {
- InputStream stream = createMock(InputStream.class);
+ InputStream stream = createMock(MockInputStream.class);
TypedValue value = new TypedValue();
expect(base.openRawResource(eq(10), same(value))).andReturn(stream);
replayAll();
@@ -450,7 +451,7 @@
@SmallTest
public void testOpenRawResource2() throws NotFoundException {
- InputStream stream = createMock(InputStream.class);
+ InputStream stream = createMock(MockInputStream.class);
expect(base.openRawResource(10)).andReturn(stream);
replayAll();
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/util/ZipFileUtilTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/util/ZipFileUtilTest.java
index 47832a9..3c5aa53 100644
--- a/src/android/tests/src/com/google/android/inputmethod/japanese/util/ZipFileUtilTest.java
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/util/ZipFileUtilTest.java
@@ -58,7 +58,7 @@
succeeded = true;
return expected;
} finally {
- MozcUtil.close(zipInputStream, !succeeded);
+ MozcUtil.close(apkFile, !succeeded);
}
}
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/vectorgraphic/BitmapSaver.java b/src/android/tests/src/com/google/android/inputmethod/japanese/vectorgraphic/BitmapSaver.java
new file mode 100644
index 0000000..c09bb45
--- /dev/null
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/vectorgraphic/BitmapSaver.java
@@ -0,0 +1,71 @@
+// Copyright 2010-2014, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package org.mozc.android.inputmethod.japanese.vectorgraphic;
+
+import android.graphics.Bitmap;
+import android.graphics.Bitmap.CompressFormat;
+import android.os.Environment;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+
+/**
+ * Saves given {@code Bitmap} to the external stroge.
+ */
+public class BitmapSaver {
+
+ private BitmapSaver() {
+ }
+
+ /**
+ * @param filename e.g., "test-01.png"
+ * @param bitmap a Bitmap to be saved
+ * @return fullpath to resulting .png file.
+ */
+ public static String saveAsPng(String filename, Bitmap bitmap) {
+ FileOutputStream output = null;
+ try {
+ File file = new File(Environment.getExternalStorageDirectory(), filename);
+ output = new FileOutputStream(file);
+ bitmap.compress(CompressFormat.PNG, 100, output);
+ return file.getAbsolutePath();
+ } catch (FileNotFoundException e) {
+ throw new RuntimeException(e);
+ } finally {
+ try {
+ output.close();
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+ }
+}
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/view/DrawableCacheTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/view/DrawableCacheTest.java
index 6d82322..cf2b409 100644
--- a/src/android/tests/src/com/google/android/inputmethod/japanese/view/DrawableCacheTest.java
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/view/DrawableCacheTest.java
@@ -44,10 +44,21 @@
*/
public class DrawableCacheTest extends InstrumentationTestCaseWithMock {
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ Skin.getFallbackInstance().resetDrawableFactory();
+ for (SkinType skinType : SkinType.values()) {
+ skinType.getSkin(
+ getInstrumentation().getTargetContext().getResources()).resetDrawableFactory();
+ }
+ }
+
@SmallTest
public void testDrawableCache() {
Resources resources = createMock(MockResources.class);
- DrawableCache drawableCache = new DrawableCache(new MozcDrawableFactory(resources));
+ DrawableCache drawableCache = new DrawableCache(resources);
+ drawableCache.setSkin(Skin.getFallbackInstance());
// For invalid resource id (0), getDrawable returns {@code Optional.<Drawable>absent()} without
// looking up resources.
@@ -91,7 +102,8 @@
@SmallTest
public void testSetSkinType() {
Resources resources = createMock(MockResources.class);
- DrawableCache drawableCache = new DrawableCache(new MozcDrawableFactory(resources));
+ DrawableCache drawableCache = new DrawableCache(resources);
+ drawableCache.setSkin(SkinType.ORANGE_LIGHTGRAY.getSkin(resources));
Drawable drawable = new ColorDrawable(Color.BLACK);
expect(resources.getResourceTypeName(1)).andReturn("drawable");
expect(resources.getDrawable(1)).andReturn(drawable);
@@ -106,7 +118,7 @@
resetAll();
replayAll();
- drawableCache.setSkinType(SkinType.ORANGE_LIGHTGRAY);
+ drawableCache.setSkin(SkinType.ORANGE_LIGHTGRAY.getSkin(resources));
assertSame(drawable, drawableCache.getDrawable(1).get());
verifyAll();
@@ -118,7 +130,7 @@
expect(resources.getDrawable(1)).andReturn(drawable);
replayAll();
- drawableCache.setSkinType(SkinType.TEST);
+ drawableCache.setSkin(SkinType.TEST.getSkin(resources));
assertSame(drawable, drawableCache.getDrawable(1).get());
verifyAll();
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/view/MozcDrawableFactoryTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/view/MozcDrawableFactoryTest.java
index 677abc0..5867766 100644
--- a/src/android/tests/src/com/google/android/inputmethod/japanese/view/MozcDrawableFactoryTest.java
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/view/MozcDrawableFactoryTest.java
@@ -49,7 +49,8 @@
@SmallTest
public void testGetDrawableRaw() {
Resources resources = getInstrumentation().getTargetContext().getResources();
- MozcDrawableFactory factory = new MozcDrawableFactory(resources);
+ MozcDrawableFactory factory =
+ new MozcDrawableFactory(resources, new Skin());
// Unfortunately it is difficult to check if the returned drawable renders as what we want,
// because PictureDrawable renders in native code so we cannot intercept the Canvas,
@@ -88,7 +89,7 @@
expect(resources.getDrawable(1)).andReturn(drawable);
replayAll();
- MozcDrawableFactory factory = new MozcDrawableFactory(resources);
+ MozcDrawableFactory factory = new MozcDrawableFactory(resources, new Skin());
assertSame(drawable, factory.getDrawable(1).get());
verifyAll();
@@ -98,7 +99,7 @@
public void testEmojiDrawable() {
// Try to parse all emoji Drawable.
Resources resources = getInstrumentation().getTargetContext().getResources();
- MozcDrawableFactory factory = new MozcDrawableFactory(resources);
+ MozcDrawableFactory factory = new MozcDrawableFactory(resources, new Skin());
for (String prefix : new String[] { "docomo_emoji_", "softbank_emoji_", "kddi_emoji_" }) {
for (int codePoint = 0xFE000; codePoint <= 0xFEEA0; ++codePoint) {
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/view/SkinParserTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/view/SkinParserTest.java
new file mode 100644
index 0000000..b484dc1
--- /dev/null
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/view/SkinParserTest.java
@@ -0,0 +1,94 @@
+// Copyright 2010-2014, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package org.mozc.android.inputmethod.japanese.view;
+
+import org.mozc.android.inputmethod.japanese.view.SkinParser.SkinParserException;
+
+import android.content.res.Resources;
+import android.test.InstrumentationTestCase;
+import android.test.suitebuilder.annotation.SmallTest;
+
+/**
+ * Test for {@code SkinParser}
+ */
+public class SkinParserTest extends InstrumentationTestCase {
+
+ @SmallTest
+ public void testParser_correctSkin() throws SkinParserException {
+ Resources resources = getInstrumentation().getContext().getResources();
+ int[] skinIds = {
+ org.mozc.android.inputmethod.japanese.tests.R.xml.skinparser_correct_drawable_test_1};
+ for (int id : skinIds) {
+ SkinParser parser = new SkinParser(resources, resources.getXml(id));
+ Skin skin = parser.parseSkin();
+ assertTrue(skin.windowBackgroundDrawable != DummyDrawable.getInstance());
+ }
+ }
+
+ @SmallTest
+ public void testParser_incorrectSkin() {
+ // Note: Use getContext() to get test packge's resources.
+ Resources resources = getInstrumentation().getContext().getResources();
+ int[] skinIds = {org.mozc.android.inputmethod.japanese.tests.R.xml.skinparser_test_1,
+ org.mozc.android.inputmethod.japanese.tests.R.xml.skinparser_test_2,
+ org.mozc.android.inputmethod.japanese.tests.R.xml.skinparser_test_3,
+ org.mozc.android.inputmethod.japanese.tests.R.xml.skinparser_test_4,
+ org.mozc.android.inputmethod.japanese.tests.R.xml.skinparser_test_5,
+ org.mozc.android.inputmethod.japanese.tests.R.xml.skinparser_test_6,
+ org.mozc.android.inputmethod.japanese.tests.R.xml.skinparser_test_7};
+ for (int id : skinIds) {
+ try {
+ SkinParser parser = new SkinParser(resources, resources.getXml(id));
+ parser.parseSkin();
+ } catch (SkinParserException e) {
+ // Expected.
+ continue;
+ }
+ fail("SkinParserException must be thrown at ID 0x" + Integer.toString(id, 16));
+ }
+ }
+
+ @SmallTest
+ public void testDrawableParser_incorrectSkin() {
+ Resources resources = getInstrumentation().getContext().getResources();
+ int[] skinIds = {
+ org.mozc.android.inputmethod.japanese.tests.R.xml.skinparser_incorrect_drawable_test_1};
+ for (int id : skinIds) {
+ try {
+ SkinParser parser = new SkinParser(resources, resources.getXml(id));
+ parser.parseSkin();
+ } catch (SkinParserException e) {
+ // Expected.
+ continue;
+ }
+ fail("SkinParserException must be thrown at ID 0x" + Integer.toString(id, 16));
+ }
+ }
+}
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/view/SkinTypeTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/view/SkinTypeTest.java
index 602dfbe..4e9df97 100644
--- a/src/android/tests/src/com/google/android/inputmethod/japanese/view/SkinTypeTest.java
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/view/SkinTypeTest.java
@@ -30,21 +30,21 @@
package org.mozc.android.inputmethod.japanese.view;
import android.graphics.Paint;
-
-import junit.framework.TestCase;
+import android.test.InstrumentationTestCase;
/**
* Unit test for SkinType.
*/
-public class SkinTypeTest extends TestCase {
+public class SkinTypeTest extends InstrumentationTestCase {
public void testCategorySupport() {
// Just make sure that all known categories are supported on all skins.
Paint paint = new Paint();
for (SkinType skinType : SkinType.values()) {
- skinType.apply(paint, SkinType.STYLE_CATEGORY_KEYICON_MAIN);
- skinType.apply(paint, SkinType.STYLE_CATEGORY_KEYICON_GUIDE);
- skinType.apply(paint, SkinType.STYLE_CATEGORY_KEYICON_MAIN_HIGHLIGHT);
- skinType.apply(paint, SkinType.STYLE_CATEGORY_KEYICON_GUIDE_HIGHLIGHT);
+ Skin skin = skinType.getSkin(getInstrumentation().getTargetContext().getResources());
+ skin.apply(paint, Skin.STYLE_CATEGORY_KEYICON_MAIN);
+ skin.apply(paint, Skin.STYLE_CATEGORY_KEYICON_GUIDE);
+ skin.apply(paint, Skin.STYLE_CATEGORY_KEYICON_MAIN_HIGHLIGHT);
+ skin.apply(paint, Skin.STYLE_CATEGORY_KEYICON_GUIDE_HIGHLIGHT);
}
}
}
diff --git a/src/android/userfeedback/project.properties b/src/android/userfeedback/project.properties
index 9aacf2f..c3b6d82 100644
--- a/src/android/userfeedback/project.properties
+++ b/src/android/userfeedback/project.properties
@@ -39,4 +39,4 @@
android.library=true
# Project target.
-target=android-19
+target=android-21
diff --git a/src/base/base.gyp b/src/base/base.gyp
index b1b0640..32940d8 100644
--- a/src/base/base.gyp
+++ b/src/base/base.gyp
@@ -309,20 +309,17 @@
'../data/keymap/ms-ime.tsv',
'../data/preedit/12keys-halfwidthascii.tsv',
'../data/preedit/12keys-hiragana.tsv',
- '../data/preedit/12keys-number.tsv',
'../data/preedit/flick-halfwidthascii.tsv',
'../data/preedit/flick-hiragana.tsv',
- '../data/preedit/flick-number.tsv',
'../data/preedit/hiragana-romanji.tsv',
'../data/preedit/kana.tsv',
+ '../data/preedit/notouch-hiragana.tsv',
'../data/preedit/godan-hiragana.tsv',
'../data/preedit/qwerty_mobile-halfwidthascii.tsv',
- '../data/preedit/qwerty_mobile-hiragana-number.tsv',
'../data/preedit/qwerty_mobile-hiragana.tsv',
'../data/preedit/romanji-hiragana.tsv',
'../data/preedit/toggle_flick-halfwidthascii.tsv',
'../data/preedit/toggle_flick-hiragana.tsv',
- '../data/preedit/toggle_flick-number.tsv',
],
'outputs': [
'<(gen_out_dir)/config_file_stream_data.h',
diff --git a/src/build_mozc.py b/src/build_mozc.py
index 0a0dc44..42ea387 100644
--- a/src/build_mozc.py
+++ b/src/build_mozc.py
@@ -225,6 +225,9 @@
elif options.target_platform == 'NaCl':
# Add chrome NaCl Mozc gyp scripts.
gyp_file_names.append('%s/chrome/nacl/nacl_extension.gyp' % SRC_DIR)
+ elif options.target_platform == 'Android':
+ # Add Android Mozc gyp scripts.
+ gyp_file_names.extend(glob.glob('%s/android/*/*.gyp' % SRC_DIR))
gyp_file_names.sort()
return gyp_file_names
@@ -1199,24 +1202,24 @@
android_arch = GetMozcVersion().GetAndroidArch()
if android_arch == 'arm':
avd_configs = [
- {'--name': 'Nexus5-ApiL-arm-WVGA800',
+ {'--name': 'Nexus5-Api21-arm-WVGA800',
'--target': 'android-21',
'--abi': 'default/armeabi-v7a',
'--device': 'Nexus 5',
'--skin': 'WVGA800'},
- {'--name': 'Nexus10-ApiL-arm-WXGA800',
+ {'--name': 'Nexus10-Api21-arm-WXGA800',
'--target': 'android-21',
'--abi': 'default/armeabi-v7a',
'--device': 'Nexus 10',
'--skin': 'WXGA800'},]
elif android_arch == 'x86':
avd_configs = [
- {'--name': 'Nexus5-ApiL-x86-WVGA800',
+ {'--name': 'Nexus5-Api21-x86-WVGA800',
'--target': 'android-21',
'--abi': 'default/x86',
'--device': 'Nexus 5',
'--skin': 'WVGA800'},
- {'--name': 'Nexus10-ApiL-x86-WXGA800',
+ {'--name': 'Nexus10-Api21-x86-WXGA800',
'--target': 'android-21',
'--abi': 'default/x86',
'--device': 'Nexus 10',
@@ -1247,11 +1250,18 @@
serialnumbers.extend([emulator.serial for emulator in emulators])
# Run native and Java tests.
+ # If --configuration is Release, Java tests are skipped.
+ if options.configuration == 'Release':
+ targets = ['run_native_test']
+ logging.info('As this is Relase configuration, Java tests are skipped.')
+ else:
+ # run_java_test must be executed after run_native_test
+ # because package manager, which is mandatory to run Java tests,
+ # requires minutes to get ready.
+ targets = ['run_native_test', 'run_java_test']
+
android_gyp = os.path.join(SRC_DIR, 'android', 'android.gyp')
- # run_java_test must be executed after run_native_test
- # because package manager, which is mandatory to run Java tests,
- # requires minutes to get ready.
- for target in ('run_native_test', 'run_java_test'):
+ for target in targets:
(build_options, build_targets) = ParseBuildOptions(
build_args + ['%s:%s' % (android_gyp, target)])
# Injects android_device attribute to build_options.
@@ -1334,6 +1344,9 @@
targets.append('out_win/%s:unittests' % options.configuration)
else:
targets.append('%s/gyp/tests.gyp:unittests' % SRC_DIR)
+ if target_platform == 'Android' and options.configuration != 'Release':
+ targets.append('%s/android/android.gyp:build_java_test' % SRC_DIR)
+
# Build the test targets
(build_opts, build_args) = ParseBuildOptions(build_options + targets)
@@ -1346,6 +1359,7 @@
RunTests(GetBuildBaseName(options, target_platform), options.configuration,
options.test_jobs)
+
def CleanBuildFilesAndDirectories(options, unused_args):
"""Cleans build files and directories."""
# File and directory names to be removed.
@@ -1373,18 +1387,19 @@
GetMozcVersion().GetTargetPlatform())
if target_platform:
directory_names.append(target_platform)
-
if IsLinux():
# Remove auto-generated files.
file_names.append(os.path.join(SRC_DIR, 'android', 'AndroidManifest.xml'))
file_names.append(os.path.join(
SRC_DIR, 'android', 'tests', 'AndroidManifest.xml'))
+ # Remove a symbolic link to android/resources/res
+ file_names.append(os.path.join(SRC_DIR, 'android', 'resources', 'res'))
directory_names.append(os.path.join(SRC_DIR, 'android', 'assets'))
# Delete files/dirs generated by Android SDK/NDK.
android_library_projects = [
'',
'protobuf',
- 'static_resources/resources_oss',
+ 'resources',
'tests',
]
android_generated_dirs = ['bin', 'gen', 'obj', 'libs', 'gen_for_adt']
@@ -1392,11 +1407,6 @@
for directory in android_generated_dirs:
directory_names.append(
os.path.join(SRC_DIR, 'android', project, directory))
- # In addition, remove resources/res/raw directory, which contains
- # generated .pic files.
- directory_names.append(
- os.path.join(SRC_DIR, 'android', 'static_resources/resources_oss',
- 'res', 'raw'))
# Remove files.
for file_name in file_names:
diff --git a/src/build_tools/copy_file.py b/src/build_tools/copy_file.py
index 5bcf4a9..f2f42c7 100644
--- a/src/build_tools/copy_file.py
+++ b/src/build_tools/copy_file.py
@@ -32,9 +32,7 @@
This script provides more features than 'copies' rule of GYP.
1. The destination file name can be different from the original name.
-2. Changes the last update time according to a reference file.
-(This is the same as `touch -r REFERENCE_FILE'.)
-3. Is able to copy directories recursively.
+2. Is able to copy directories recursively.
"""
__author__ = "yukishiino"
@@ -59,79 +57,90 @@
def CopyFiles(src_list, dst, src_base='',
- preserve=False, recursive=False, reference=None,
+ preserve=False, recursive=False,
ignore_existence_check=False):
"""Copy files like 'cp' command on Unix.
Args:
src_list: List of files to be copied.
dst: The destination file or directory.
- src_base: The base directory which holds |src_list|.
+ src_base: Base directory of the source files.
+ The following path is copied to the destination.
+ e.g. src: a/b/c/d/e.txt , base_dir: a/b/ -> dest: c/d/e.txt
preserve: Preserves last update time. Permissions for files are always
copied.
recursive: Copies files recursively.
- reference: Last update time in the form of (atime, mtime) to be copied
- to files. The reference time is prioritized over preserving.
ignore_existence_check: Ignores existence check for src files.
"""
if not src_list:
return
- def _CopyFile(src_file, dst_file):
- if os.path.isdir(dst_file):
- _ErrorExit('An unexpected dir `%s\' exists' % dst_file)
- if ignore_existence_check and not os.path.exists(src_file):
- # Skip non-existent src.
- return
- shutil.copy(src_file, dst_file)
- _CopyUpdateTimeAndPermission(src_file, dst_file)
+ def _MakeDirs(dir):
+ if not os.path.exists(dir):
+ os.makedirs(dir)
- def _CopyDir(src_dir, dst_dir, file_list=None):
- if file_list is None:
- file_list = os.listdir(src_dir)
- for filename in file_list:
+ def _CopyDir(src_dir, dst_dir):
+ _MakeDirs(dst_dir)
+
+ for filename in os.listdir(src_dir):
src = os.path.join(src_dir, filename)
- dst = os.path.join(dst_dir, filename)
- _Copy(src, dst)
+ _Copy(src, dst_dir)
def _Copy(src, dst):
- if os.path.isdir(src):
- if not recursive:
- _ErrorExit('Cannot copy a directory `%s\'' % src)
- if not os.path.isdir(dst):
- os.mkdir(dst)
- _CopyDir(src, dst)
- _CopyUpdateTimeAndPermission(src, dst)
- else:
- _CopyDir(src, dst)
- else:
- _CopyFile(src, dst)
+ if os.path.isdir(dst):
+ dst = os.path.join(dst, os.path.basename(src))
- def _CopyUpdateTimeAndPermission(src, dst):
+ if os.path.isdir(src):
+ _CopyDir(src, dst)
+ else:
+ shutil.copy(src, dst)
+
+ # Copy update time and permission
if preserve:
shutil.copystat(src, dst)
- if reference:
- os.utime(dst, reference)
# Changes the file writable so we can overwrite it later.
os.chmod(dst, os.stat(dst).st_mode | stat.S_IWRITE)
- # Create the parent directory of dst.
- dst_parent = os.path.abspath(os.path.dirname(dst))
- if dst_parent and not os.path.exists(dst_parent):
- os.makedirs(dst_parent)
+ def _ErrorCheck(src, src_base):
+ if not os.path.exists(src):
+ if ignore_existence_check:
+ return False
+ else:
+ _ErrorExit('No such file or directory: "%s"' % src)
- if len(src_list) is 1:
- src = os.path.join(src_base, src_list[0])
- if os.path.isdir(dst):
- dst = os.path.join(dst, os.path.basename(os.path.abspath(src)))
- _Copy(src, dst)
- else: # len(src_list) > 1
- if not os.path.isdir(dst):
- os.mkdir(dst)
- for src in src_list:
- src = os.path.abspath(os.path.join(src_base, src))
- (src_dir, src_file) = os.path.split(src)
- _CopyDir(src_dir, dst, [src_file])
+ if os.path.isdir(src) and not recursive:
+ _ErrorExit('Cannot copy a directory: "%s"' % src)
+
+ if not src.startswith(src_base):
+ _ErrorExit('Source file does not start with src_base: "%s"' % src)
+
+ return True
+
+ dst = os.path.abspath(dst)
+ if src_base:
+ src_base = os.path.abspath(src_base)
+
+ # dst may be a file instead of a directory.
+ if len(src_list) == 1 and not os.path.exists(dst) and not src_base:
+ src = os.path.abspath(src_list[0])
+ if _ErrorCheck(src, src_base):
+ _MakeDirs(os.path.dirname(dst))
+ _Copy(src, dst)
+ return
+
+ # dst should be a directory here.
+ for src in src_list:
+ src = os.path.abspath(src)
+
+ if src_base:
+ dst_dir = os.path.join(dst,
+ os.path.relpath(os.path.dirname(src), src_base))
+ else:
+ dst_dir = dst
+
+ if _ErrorCheck(src, src_base):
+ _MakeDirs(dst_dir)
+ _Copy(src, dst_dir)
def _GetUpdateTime(filename):
@@ -151,14 +160,15 @@
def main():
parser = optparse.OptionParser(
usage='Usage: %prog [OPTION]... SOURCE... DEST')
+ parser.add_option('--src_base', dest='src_base', default='',
+ help=('Base directory of the source files. '
+ 'The following path is copied to the destination.'))
parser.add_option('--preserve', '-p', dest='preserve',
action='store_true', default=False,
help='Preserves last update time.')
parser.add_option('--recursive', '-r', dest='recursive',
action='store_true', default=False,
help='Copies directories recursively.')
- parser.add_option('--reference', dest='reference',
- help='Uses this file\'s last update time.')
parser.add_option('--ignore_existence_check', dest='ignore_existence_check',
action='store_true', default=False,
help='Ignore existence check for src files.')
@@ -167,15 +177,11 @@
if len(args) < 2:
_ErrorExit('The arguments must be source(s) and destination files.')
- reference_time = (_GetUpdateTime(options.reference)
- if options.reference else None)
-
src_list = args[:-1]
dst = args[-1]
- CopyFiles(src_list, dst,
+ CopyFiles(src_list, dst, src_base=options.src_base,
preserve=options.preserve, recursive=options.recursive,
- reference=reference_time,
ignore_existence_check=options.ignore_existence_check)
diff --git a/src/build_tools/util.py b/src/build_tools/util.py
index 929f7c5..e2ee846 100644
--- a/src/build_tools/util.py
+++ b/src/build_tools/util.py
@@ -40,6 +40,8 @@
import stat
import subprocess
import sys
+import tempfile
+import zipfile
def IsWindows():
@@ -237,3 +239,24 @@
record.levelname = ColoredText(level_name, level_no)
return True
+
+
+def WalkFileContainers(comma_separated_paths):
+ """Walks like os.walk() accepting comma separated directory or zip file paths.
+
+ Args:
+ comma_separated_paths: e.g., "directory/path,zip/file/path.zip"
+ Yields:
+ See os.walk()
+ """
+ for path in comma_separated_paths.split(','):
+ if os.path.isdir(path):
+ for dirpath, dirnames, filenames in os.walk(path):
+ yield dirpath, dirnames, filenames
+ else:
+ tempdir = tempfile.mkdtemp()
+ with zipfile.ZipFile(path, 'r') as z:
+ z.extractall(tempdir)
+ for dirpath, dirnames, filenames in os.walk(tempdir):
+ yield dirpath, dirnames, filenames
+
diff --git a/src/composer/table.cc b/src/composer/table.cc
index a0eadf1..cdd2745 100644
--- a/src/composer/table.cc
+++ b/src/composer/table.cc
@@ -60,28 +60,24 @@
const char k12keysHiraganaTableFile[] = "system://12keys-hiragana.tsv";
const char k12keysHalfwidthasciiTableFile[]
= "system://12keys-halfwidthascii.tsv";
-const char k12keysNumberTableFile[]
- = "system://12keys-number.tsv";
const char kFlickHiraganaTableFile[] = "system://flick-hiragana.tsv";
const char kFlickHalfwidthasciiTableFile[]
= "system://flick-halfwidthascii.tsv";
-const char kFlickNumberTableFile[]
- = "system://flick-number.tsv";
const char kToggleFlickHiraganaTableFile[]
= "system://toggle_flick-hiragana.tsv";
const char kToggleFlickHalfwidthasciiTableFile[]
= "system://toggle_flick-halfwidthascii.tsv";
-const char kToggleFlickNumberTableFile[]
- = "system://toggle_flick-number.tsv";
// Special tables for QWERTY mobile
const char kQwertyMobileHiraganaTableFile[]
= "system://qwerty_mobile-hiragana.tsv";
-const char kQwertyMobileHiraganaNumberTableFile[]
- = "system://qwerty_mobile-hiragana-number.tsv";
const char kQwertyMobileHalfwidthasciiTableFile[]
= "system://qwerty_mobile-halfwidthascii.tsv";
// Special tables for Godan
const char kGodanHiraganaTableFile[] = "system://godan-hiragana.tsv";
+const char kNotouchHiraganaTableFile[] = "system://notouch-hiragana.tsv";
+// Reuse qwerty_mobile-halfwidthascii table
+const char kNotouchHalfwidthasciiTableFile[]
+ = "system://qwerty_mobile-halfwidthascii.tsv";
const char kNewChunkPrefix[] = "\t";
const char kSpecialKeyOpen[] = "\x0F"; // Shift-In of ASCII
@@ -139,27 +135,18 @@
case mozc::commands::Request::TWELVE_KEYS_TO_HALFWIDTHASCII:
table_file_name = k12keysHalfwidthasciiTableFile;
break;
- case mozc::commands::Request::TWELVE_KEYS_TO_NUMBER:
- table_file_name = k12keysNumberTableFile;
- break;
case mozc::commands::Request::FLICK_TO_HIRAGANA:
table_file_name = kFlickHiraganaTableFile;
break;
case mozc::commands::Request::FLICK_TO_HALFWIDTHASCII:
table_file_name = kFlickHalfwidthasciiTableFile;
break;
- case mozc::commands::Request::FLICK_TO_NUMBER:
- table_file_name = kFlickNumberTableFile;
- break;
case mozc::commands::Request::TOGGLE_FLICK_TO_HIRAGANA:
table_file_name = kToggleFlickHiraganaTableFile;
break;
case mozc::commands::Request::TOGGLE_FLICK_TO_HALFWIDTHASCII:
table_file_name = kToggleFlickHalfwidthasciiTableFile;
break;
- case mozc::commands::Request::TOGGLE_FLICK_TO_NUMBER:
- table_file_name = kToggleFlickNumberTableFile;
- break;
case mozc::commands::Request::QWERTY_MOBILE_TO_HIRAGANA:
// This table is almost as same as "romaji-hiragana.tsv",
// and the diff should be only the behavior of ','.
@@ -168,15 +155,18 @@
// TODO(hidehiko): refactor this code to clean up.
table_file_name = kQwertyMobileHiraganaTableFile;
break;
- case mozc::commands::Request::QWERTY_MOBILE_TO_HIRAGANA_NUMBER:
- table_file_name = kQwertyMobileHiraganaNumberTableFile;
- break;
case mozc::commands::Request::QWERTY_MOBILE_TO_HALFWIDTHASCII:
table_file_name = kQwertyMobileHalfwidthasciiTableFile;
break;
case mozc::commands::Request::GODAN_TO_HIRAGANA:
table_file_name = kGodanHiraganaTableFile;
break;
+ case mozc::commands::Request::NOTOUCH_TO_HIRAGANA:
+ table_file_name = kNotouchHiraganaTableFile;
+ break;
+ case mozc::commands::Request::NOTOUCH_TO_HALFWIDTHASCII:
+ table_file_name = kNotouchHalfwidthasciiTableFile;
+ break;
default:
table_file_name = NULL;
}
diff --git a/src/composer/table_test.cc b/src/composer/table_test.cc
index 887b8a7..c81e753 100644
--- a/src/composer/table_test.cc
+++ b/src/composer/table_test.cc
@@ -839,6 +839,20 @@
EXPECT_EQ("\xE3\x81\x8D", entry->pending());
}
+ {
+ // To Notouch -> Hiragana mode.
+ request.set_special_romanji_table(
+ mozc::commands::Request::NOTOUCH_TO_HIRAGANA);
+ Table table;
+ table.InitializeWithRequestAndConfig(request, default_config_);
+
+ size_t key_length = 0;
+ bool fixed = false;
+ const mozc::composer::Entry *entry = table.LookUpPrefix("a", &key_length,
+ &fixed);
+ // "き"
+ EXPECT_EQ("\xE3\x81\x8D", entry->pending());
+ }
}
TEST_F(TableTest, OrderOfAddRule) {
@@ -1047,17 +1061,15 @@
commands::Request::DEFAULT_TABLE,
commands::Request::TWELVE_KEYS_TO_HIRAGANA,
commands::Request::TWELVE_KEYS_TO_HALFWIDTHASCII,
- commands::Request::TWELVE_KEYS_TO_NUMBER,
commands::Request::FLICK_TO_HIRAGANA,
commands::Request::FLICK_TO_HALFWIDTHASCII,
- commands::Request::FLICK_TO_NUMBER,
commands::Request::TOGGLE_FLICK_TO_HIRAGANA,
commands::Request::TOGGLE_FLICK_TO_HALFWIDTHASCII,
- commands::Request::TOGGLE_FLICK_TO_NUMBER,
commands::Request::GODAN_TO_HIRAGANA,
commands::Request::QWERTY_MOBILE_TO_HIRAGANA,
- commands::Request::QWERTY_MOBILE_TO_HIRAGANA_NUMBER,
commands::Request::QWERTY_MOBILE_TO_HALFWIDTHASCII,
+ commands::Request::NOTOUCH_TO_HIRAGANA,
+ commands::Request::NOTOUCH_TO_HALFWIDTHASCII,
};
static const config::Config::PreeditMethod preedit_method[] = {
config::Config::ROMAN,
diff --git a/src/data/images/android/svg/emoji_disable_icon.svg b/src/data/images/android/svg/emoji_disable_icon.svg
index 218582d..e7b9857 100644
--- a/src/data/images/android/svg/emoji_disable_icon.svg
+++ b/src/data/images/android/svg/emoji_disable_icon.svg
@@ -32,9 +32,7 @@
<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve">
-<circle style="fill:none;stroke:#231F20;stroke-width:0.75;stroke-miterlimit:10;" cx="8" cy="8" r="7"/>
-<g>
- <path style="fill:#231F20;" d=""/>
-</g>
+ width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve">
+<circle id="style-symbol-major-emoji-disable-circle" cx="8" cy="8" r="7"/>
+<path id="style-symbol-major" d="M8.864,9.947H7.153v-5.59h1.711V9.947z M8.864,12.889H7.153v-1.5h1.711V12.889z"/>
</svg>
diff --git a/src/data/images/android/svg/floating_mode_indicator__alphabet_normal.svg b/src/data/images/android/svg/floating_mode_indicator__alphabet_normal.svg
new file mode 100644
index 0000000..8d0c9f2
--- /dev/null
+++ b/src/data/images/android/svg/floating_mode_indicator__alphabet_normal.svg
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ version="1.1"
+ width="80"
+ height="80">
+ <g transform="matrix(1,0,0,-1,7,75)">
+ <path id="shadow" style="fill:#eceff1;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,8 0,49 c 0,4.4 3.6,8 8,8 l 17.5,0 6.5,7.88 c 0.53,0.6425 1.52,0.576 2.05,0 l 7.25,-7.88 16.7,0 c 4.4,0 8,-3.6 8,-8 l 0,-49 c 0,-4.4 -3.6,-8 -8,-8 l -50,0 c -4.4,0 -8,3.6 -8,8" />
+ </g>
+ <text y="45" x="40" style="font-size:40px;text-anchor:middle;dominant-baseline:central;">En</text>
+</svg>
diff --git a/src/data/images/android/svg/floating_mode_indicator__kana_normal.svg b/src/data/images/android/svg/floating_mode_indicator__kana_normal.svg
new file mode 100644
index 0000000..55ccf92
--- /dev/null
+++ b/src/data/images/android/svg/floating_mode_indicator__kana_normal.svg
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ version="1.1"
+ width="80"
+ height="80">
+ <g transform="matrix(1,0,0,-1,7,75)">
+ <path id="shadow" style="fill:#eceff1;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,8 0,49 c 0,4.4 3.6,8 8,8 l 17.5,0 6.5,7.88 c 0.53,0.6425 1.52,0.576 2.05,0 l 7.25,-7.88 16.7,0 c 4.4,0 8,-3.6 8,-8 l 0,-49 c 0,-4.4 -3.6,-8 -8,-8 l -50,0 c -4.4,0 -8,3.6 -8,8" />
+ </g>
+ <text y="45" x="40" style="font-size:40px;text-anchor:middle;dominant-baseline:central;">あ</text>
+</svg>
diff --git a/src/data/images/android/svg/function__action_done__icon.svg b/src/data/images/android/svg/function__action_done__icon.svg
new file mode 100644
index 0000000..f6aea24
--- /dev/null
+++ b/src/data/images/android/svg/function__action_done__icon.svg
@@ -0,0 +1,41 @@
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ version="1.1"
+ width="135"
+ height="135">
+ <circle id="style-keyicon-enter-circle" cx="67.5" cy="67.5" r="67.5" style="fill-rule:evenodd;fill:#7fcac3" />
+ <path id="style-keyicon-enter" d="M55.68375,82.7775,37.62125,64.715,32.0525,70.285,55.68375,93.91625,102.9475,46.6525,97.3775,41.08375,55.68375,82.7775z" fill-rule="nonzero" fill="#FFF"/>
+</svg>
diff --git a/src/data/images/android/svg/function__action_go__icon.svg b/src/data/images/android/svg/function__action_go__icon.svg
new file mode 100644
index 0000000..027cbf0
--- /dev/null
+++ b/src/data/images/android/svg/function__action_go__icon.svg
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ version="1.1"
+ width="135"
+ height="135">
+ <circle id="style-keyicon-enter-circle" cx="67.5" cy="67.5" r="67.5" style="fill-rule:evenodd;fill:#7fcac3" />
+ <path id="style-keyicon-enter" d="m67.5,36.6475-5.45375,5.45375,21.5425,21.5425-46.94125,0,0,7.7125,46.94125,0-21.5425,21.5425l5.45375,5.45375,30.8525-30.8525-30.8525-30.8525z" fill-rule="nonzero" fill="#FFF"/>
+</svg>
diff --git a/src/data/images/android/svg/function__action_next__icon.svg b/src/data/images/android/svg/function__action_next__icon.svg
new file mode 100644
index 0000000..a374e6d
--- /dev/null
+++ b/src/data/images/android/svg/function__action_next__icon.svg
@@ -0,0 +1,41 @@
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ version="1.1"
+ width="135"
+ height="135">
+ <circle id="style-keyicon-enter-circle" cx="67.5" cy="67.5" r="67.5" style="fill-rule:evenodd;fill:#7fcac3" />
+ <path id="style-keyicon-enter" d="m51.95625,86.909375,5.72625,5.70125,25.36125-25.47-24.86125-24.75125-5.70125,5.72625,19.11875,19.05125-19.64375,19.7425z" fill-rule="nonzero" fill="#FFF"/>
+</svg>
diff --git a/src/data/images/android/svg/function__action_previous__icon.svg b/src/data/images/android/svg/function__action_previous__icon.svg
new file mode 100644
index 0000000..33acd5f
--- /dev/null
+++ b/src/data/images/android/svg/function__action_previous__icon.svg
@@ -0,0 +1,41 @@
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ version="1.1"
+ width="135"
+ height="135">
+ <circle id="style-keyicon-enter-circle" cx="67.5" cy="67.5" r="67.5" style="fill-rule:evenodd;fill:#7fcac3" />
+ <path id="style-keyicon-enter" d="m83.04375,86.909375-5.72625,5.70125-25.36125-25.47,24.86125-24.75125,5.70125,5.72625-19.11875,19.05125,19.64375,19.7425z" fill-rule="nonzero" fill="#FFF"/>
+</svg>
diff --git a/src/data/images/android/svg/function__action_search__icon.svg b/src/data/images/android/svg/function__action_search__icon.svg
new file mode 100644
index 0000000..855b3b7
--- /dev/null
+++ b/src/data/images/android/svg/function__action_search__icon.svg
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!--
+Preprocesses for this file;
+- Imported .ai file into Inkscape.
+- Combine all pathes into one (Path > Combine).
+- Export as optimized .svg.
+- Removed following elements manually.
+ - metadata
+ - defs
+- Removed ignorable <g> elements.
+- Added id attribute.
+-->
+<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns="http://www.w3.org/2000/svg"
+ xml:space="preserve"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ version="1.1"
+ width="80"
+ height="80">
+ <circle id="style-keyicon-enter-circle" cx="40" cy="40" r="40" style="fill-rule:evenodd;fill:#7fcac3" />
+ <path id="style-keyicon-enter" d="m50.471876,46.325293h-2.248993l-0.843373-0.70281c2.670676-3.232928,4.357426-7.309228,4.357426-11.947777,0-10.120469-8.152603-18.273069-18.273075-18.273069-9.979907,0-18.132506,8.1526-18.132506,18.273069,0,10.12047,8.152599,18.27307,18.273068,18.27307,4.497989,0,8.714853-1.686745,11.947779-4.357424l0.843373,0.702809v2.248993l14.05621,14.056208,4.21686-4.216862-14.196769-14.056207zm-16.867452,0c-7.028103,0-12.650586-5.622483-12.650586-12.650587,0-7.028103,5.622483-12.650586,12.650586-12.650586,7.028107,0,12.65059,5.622483,12.65059,12.650586,0,7.028104-5.622483,12.650587-12.65059,12.650587z"/>
+</svg>
diff --git a/src/data/images/android/svg/function__action_send__icon.svg b/src/data/images/android/svg/function__action_send__icon.svg
new file mode 100644
index 0000000..52e06ce
--- /dev/null
+++ b/src/data/images/android/svg/function__action_send__icon.svg
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ version="1.1"
+ width="135"
+ height="135">
+ <circle id="style-keyicon-enter-circle" cx="67.5" cy="67.5" r="67.5" style="fill-rule:evenodd;fill:#7fcac3" />
+ <path id="style-keyicon-enter" d="m29.19,33.131875,0,25.925,48.2325,8.03875-48.2325,8.04,0,26.732495,76.62-34.772495-76.62-33.96375z" fill-rule="nonzero" fill="#FFF"/>
+</svg>
diff --git a/src/data/images/android/svg/function__enter__icon.svg b/src/data/images/android/svg/function__enter__icon.svg
new file mode 100644
index 0000000..93efbf0
--- /dev/null
+++ b/src/data/images/android/svg/function__enter__icon.svg
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ version="1.1"
+ width="80"
+ height="80">
+ <circle id="style-keyicon-enter-circle" cx="40" cy="40" r="40" style="fill-rule:evenodd;fill:#ff0000" />
+ <path id="style-keyicon-enter" d="m56.753534,37.678614-29.468464,0,8.848119-8.886375l-3.306676-3.292239-14.645086,14.707885,14.356356,14.292115,3.29224-3.305954-8.887097-8.848118h34.875647v-14.083508h-5.08525l0.02021,9.416194z" fill-rule="nonzero" fill="#FFF"/>
+</svg>
diff --git a/src/data/images/android/svg/function__symbol__popup.svg b/src/data/images/android/svg/function__symbol__popup.svg
new file mode 100644
index 0000000..ee0f346
--- /dev/null
+++ b/src/data/images/android/svg/function__symbol__popup.svg
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ version="1.1"
+ width="75"
+ height="75">
+ <!-- Original size: 75 x 75 -->
+ <g transform="matrix(0.85,0,0,0.85,5.625,5.625)">
+ <path id="style-keyicon-main" fill-rule="nonzero" fill="#000" d="m37.499999,58.301797c14.310182,0,18.988762-13.160478,18.988762-13.160478h-37.977527s4.678584,13.160478,18.988765,13.160478m13.636802-36.074056c-3.152905,0-5.708597,2.555692-5.708597,5.708598s2.555692,5.708598,5.708597,5.708598c3.15291,0,5.7086-2.555692,5.7086-5.708598s-2.55569-5.708598-5.7086-5.708598m-27.273605,11.416838c3.152906,0,5.708598-2.555691,5.708598-5.708598,0-3.152906-2.555692-5.708598-5.708598-5.708598-3.152907,0-5.708598,2.555692-5.708598,5.708598,0,3.152907,2.555691,5.708598,5.708598,5.708598m13.636803,34.124168c-16.690577,0-30.268142-13.578777-30.268142-30.268145,0-16.690577,13.577565-30.2693506,30.268142-30.2693506,16.690572,0,30.268142,13.5787736,30.268142,30.2693506,0,16.689368-13.57757,30.268145-30.268142,30.268145m0-67.7681444c-20.677649,0-37.5,16.8223504-37.5,37.4999994,0,20.676435,16.822351,37.498795,37.5,37.498795,20.677652,0,37.500002-16.82236,37.500002-37.498795,0-20.677649-16.82235-37.4999994-37.500002-37.4999994"/>
+ </g>
+</svg>
diff --git a/src/data/images/android/svg/globe.svg b/src/data/images/android/svg/globe.svg
deleted file mode 100644
index 65d915e..0000000
--- a/src/data/images/android/svg/globe.svg
+++ /dev/null
@@ -1,44 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!--
-Preprocesses for this file;
-- Imported .ai file into Inkscape.
-- Combine all pathes into one (Path > Combine).
-- Export as optimized .svg.
-- Removed following elements manually.
- - metadata
- - defs
-- Removed ignorable <g> elements.
-- Added id attribute.
--->
-<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" xml:space="preserve" height="120" width="120" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/"><g transform="matrix(1.25,0,0,-1.25,0,120)">
-<path id="" fill="#373535" d="m80.23,38.866c-2.052-7.486-6.629-13.924-12.779-18.332l-4.518,15.148-2.373,0.676-5.262-0.015-3.183,1.875,0.179,3.726,4.275,8.402-0.207,1.756,0.215,1.436,2.788,1.109-0.176,0.789-0.521,0.871-0.047,0.614,6.453,4.756v0.91l-2.298,1.763-0.23,0.864,4.885,6.629,1.862,0.798,1.022-0.066c1.215-1.092,2.372-2.244,3.415-3.5l-0.445-0.135,1.211-1.242,0.211,0.088c2.844-3.775,4.931-8.156,5.968-12.941l-0.064-0.245,0.18-0.363c0.4-2.029,0.636-4.129,0.656-6.279,0.019-3.03-0.397-5.955-1.129-8.748l-0.258-0.16,0.17-0.184zm-32.939,27.121-0.762,2.188,0.287,2.072,1.202,2.82-0.702,4.686-2.422,0.312-0.344,0.629,0.174,0.85,0.889,1.275,0.435,0.236c0.569,0.036,1.131,0.094,1.705,0.099,4.373,0.032,8.539-0.8,12.373-2.292l-2.208-5.924-9.425-8.15-1.202,1.199zm-12.431,0.932-0.438-0.276-1.391,0.006-0.207,0.217,1.138,1.43,0.308-0.075,0.309-0.445,0.281-0.857zm11.28-43.28-3.655-2.697-4.114-5.267c-2.38,0.716-4.631,1.709-6.752,2.908l-0.118,4.217-3.928,7.599,0.06,1.483,1.13,2.705-0.026,1.818-1.239,1.371-9.067,3.998-3.012,5.117-0.827,0.304-0.015-0.052c-0.002,0.112-0.016,0.217-0.016,0.323-0.068,8.88,3.36,16.955,8.964,22.986l1.031-0.574,5.701,1.172,0.672,0.394,0.151-0.312-0.405-0.762-0.076-0.334,3.962,5.519,0.286,0.108,0.259,0.002,0.228-0.096,0.206-0.199-2.492-4.641,0.956-0.902,1.348,0.926,0.299,4.162,1.706,0.537-0.815-1.336,2.526,1.432,0.879-0.203,0.088-0.42-1.608-0.288,3.038-2.585,1.178-2.026-1.527-1.678,0.244-0.283-1.112-1.762-0.27,0.017-0.57-0.304-2.619,1.647,2.63,2.148-0.392,0.871-2.502,1.582-0.806-2.269-5.43-4.211-1.777-2.67,1.507-1.717,2.443-1.125,1.03-0.924,2.135,5.467,0.828,0.793,3.662-1.765,0.42,0.058,3.009-7.273-0.903-0.34-1.119,0.055-0.363,0.484,0.504,0.355,0.283,0.371,0.062,0.387-0.164,0.408-4.589-1.302,1.805-1.334,1.014-0.129-6.981-3.889-3.164-4.603,0.022-2.422-1.17,0.277-0.552,1.586-3.774,0.703-1.512-0.842-1.273-1.728-0.25-0.936,0.141-1.14,0.727-0.78,2.024,0.975,0.646-0.078,2.468-4.16,8.118-0.276,3.457-1.31,2.808-3.678,4.79-1.422,1.673-1.238-2.134-6.983zm-30.815,20.774-0.674,1.506c-0.006,0.111-0.018,0.222-0.018,0.334l0.718-1.231-0.026-0.609zm9.274,27.035,0.981,0.682-0.18,0.179c1.025,0.946,2.104,1.84,3.243,2.651l0.162-0.059,1.618,0.315-0.047-1.809-1.87-2.014-2.397-1.105-1.629,0.933,0.119,0.227zm6.526,2.715,1.25,1.377,0.486-0.25-0.182-0.895-0.65-0.765-0.908,0.132,0.004,0.401zm3.577,4.238,0.145-0.211-0.405-0.492-0.737-0.316-0.678-0.043-0.131,0.179c0.598,0.301,1.19,0.618,1.806,0.883m1.431,0.313,0.697-0.137,2.414-1.373,0.58-0.088-0.967-0.928-1.563,0.211-1.221,0.971,0.06,1.344zm3.654,0.689,0.664,0.873c1.108,0.253,2.232,0.457,3.383,0.602l-3.6-2.356-1.858-0.07,1.411,0.951zm20.287-11.639-0.949-0.74-1.477,0.143-0.122,0.301,0.048,1.363,1.094-0.242,1.148,0.257,0.539-0.216-0.281-0.866zm0.287-8.162-0.088-1.047-1.518-0.351-0.638,1.616-0.013,3.153,2.257-3.371zm-12.357,25.475c-20.476,0-37.081-16.6-37.081-37.078,0-20.479,16.605-37.076,37.081-37.076,20.474,0,37.073,16.597,37.073,37.076,0,20.478-16.599,37.078-37.073,37.078" fill-rule="nonzero"/></g></svg>
diff --git a/src/data/images/android/svg/globe_keyicon.svg b/src/data/images/android/svg/globe_keyicon.svg
new file mode 100644
index 0000000..88a5351
--- /dev/null
+++ b/src/data/images/android/svg/globe_keyicon.svg
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ version="1.1"
+ width="68"
+ height="56">
+ <!-- Original size: 40 x 40 -->
+ <g transform="matrix(0.875,0,0,0.875,16.5,10.5)">
+ <path id="style-keyicon-twelvekeys-globe" d="M20,0c-11.1,0-20,9-20,20s8.9,20,20,20,20-9,20-20-9-20-20-20zm13.8,12h-5.9c-0.6-2.5-1.6-4.9-2.8-7.1,3.8,1.2,6.8,3.8,8.7,7.1zm-13.8-7.9c1.7,2.4,3,5.1,3.8,7.9h-7.6c0.8-2.9,2.1-5.5,3.8-7.9zm-15.5,19.9c-0.3-1.3-0.5-2.6-0.5-4s0.2-2.7,0.5-4h6.8c-0.2,1.3-0.3,2.6-0.3,4s0.1,2.7,0.3,4h-6.8zm1.7,4h5.9c0.6,2.5,1.6,4.9,2.8,7.1-3.8-1.2-6.8-3.8-8.7-7.1zm5.9-16h-5.9c1.9-3.3,5-5.9,8.7-7.1-1.3,2.2-2.2,4.6-2.8,7.1zm7.9,23.9c-1.7-2.4-3-5.1-3.8-7.9h7.6c-0.8,2.9-2.1,5.5-3.8,7.9zm4.7-11.9h-9.4c-0.2-1.3-0.3-2.6-0.3-4s0.1-2.7,0.3-4h9.4c0.2,1.3,0.3,2.6,0.3,4s-0.1,2.7-0.3,4zm0.5,11.1c1.2-2.2,2.1-4.6,2.8-7.1h5.9c-2,3.3-5,5.9-8.7,7.1zm3.5-11.1c0.2-1.3,0.3-2.6,0.3-4s-0.1-2.7-0.3-4h6.8c0.3,1.3,0.5,2.6,0.5,4s-0.2,2.7-0.5,4h-6.8z"/>
+ </g>
+</svg>
diff --git a/src/data/images/android/svg/globe_qwerty_function.svg b/src/data/images/android/svg/globe_qwerty_function.svg
new file mode 100644
index 0000000..2e21c31
--- /dev/null
+++ b/src/data/images/android/svg/globe_qwerty_function.svg
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ version="1.1"
+ width="68"
+ height="56">
+ <!-- Original size: 40 x 40 -->
+ <g transform="matrix(0.875,0,0,0.875,16.5,10.5)">
+ <path id="style-keyicon-qwerty-function" d="M20,0c-11.1,0-20,9-20,20s8.9,20,20,20,20-9,20-20-9-20-20-20zm13.8,12h-5.9c-0.6-2.5-1.6-4.9-2.8-7.1,3.8,1.2,6.8,3.8,8.7,7.1zm-13.8-7.9c1.7,2.4,3,5.1,3.8,7.9h-7.6c0.8-2.9,2.1-5.5,3.8-7.9zm-15.5,19.9c-0.3-1.3-0.5-2.6-0.5-4s0.2-2.7,0.5-4h6.8c-0.2,1.3-0.3,2.6-0.3,4s0.1,2.7,0.3,4h-6.8zm1.7,4h5.9c0.6,2.5,1.6,4.9,2.8,7.1-3.8-1.2-6.8-3.8-8.7-7.1zm5.9-16h-5.9c1.9-3.3,5-5.9,8.7-7.1-1.3,2.2-2.2,4.6-2.8,7.1zm7.9,23.9c-1.7-2.4-3-5.1-3.8-7.9h7.6c-0.8,2.9-2.1,5.5-3.8,7.9zm4.7-11.9h-9.4c-0.2-1.3-0.3-2.6-0.3-4s0.1-2.7,0.3-4h9.4c0.2,1.3,0.3,2.6,0.3,4s-0.1,2.7-0.3,4zm0.5,11.1c1.2-2.2,2.1-4.6,2.8-7.1h5.9c-2,3.3-5,5.9-8.7,7.1zm3.5-11.1c0.2-1.3,0.3-2.6,0.3-4s-0.1-2.7-0.3-4h6.8c0.3,1.3,0.5,2.6,0.5,4s-0.2,2.7-0.5,4h-6.8z"/>
+ </g>
+</svg>
diff --git a/src/data/images/android/svg/godan__function__delete__icon.svg b/src/data/images/android/svg/godan__function__delete__icon.svg
deleted file mode 100644
index dd740c2..0000000
--- a/src/data/images/android/svg/godan__function__delete__icon.svg
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="godan_x5F__x5F_function_x5F__x5F_delete_x5F__x5F_icon"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="82px" height="70px"
- viewBox="0 0 82 70" style="enable-background:new 0 0 82 70;" xml:space="preserve">
-<path id="" style="fill-rule:evenodd;clip-rule:evenodd;fill:#DDDDDC;" d="M58.03,23H34.234v0.066H34.2
- L22,35.032L34.2,47l0.034-0.032V47h23.764L60,45.033V25.064L58.03,23z M49.431,37.666l-1.797,1.766l-2.702-2.667l-2.697,2.667
- l-1.801-1.766l2.702-2.668l-2.702-2.666l1.801-1.766l2.697,2.665l2.702-2.665l1.797,1.798l-2.695,2.634L49.431,37.666z"/>
-</svg>
diff --git a/src/data/images/android/svg/godan__function__enter__icon.svg b/src/data/images/android/svg/godan__function__enter__icon.svg
deleted file mode 100644
index a8f2bba..0000000
--- a/src/data/images/android/svg/godan__function__enter__icon.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="godan_x5F__x5F_function_x5F__x5F_enter_x5F__x5F_icon"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="82px" height="140px"
- viewBox="0 0 82 140" style="enable-background:new 0 0 82 140;" xml:space="preserve">
-<polygon id="style-keyicon-function_2_" style="fill:#DDDDDC;" points="50.026,55.419 50.026,68.398 47.99,70.5 39.148,70.5
- 39.148,64.595 37.647,64.595 24,74.471 24,74.872 37.846,84.581 39.148,84.581 39.148,78.542 56.031,78.542 58,76.44 58,55.419 "/>
-</svg>
diff --git a/src/data/images/android/svg/godan__function__kana__icon.svg b/src/data/images/android/svg/godan__function__kana__icon.svg
deleted file mode 100644
index bdbb3fe..0000000
--- a/src/data/images/android/svg/godan__function__kana__icon.svg
+++ /dev/null
@@ -1,43 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="godan_x5F__x5F_function_x5F__x5F_kana_x5F__x5F_icon"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="82px" height="140px"
- viewBox="0 0 82 140" style="enable-background:new 0 0 82 140;" xml:space="preserve">
-<g id="style-keyicon-function">
- <path style="fill:#DDDDDC;" d=""/>
-</g>
-<g id="style-keyicon-function-dark_1_">
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__function__left_arrow__icon.svg b/src/data/images/android/svg/godan__function__left_arrow__icon.svg
deleted file mode 100644
index d972a4d..0000000
--- a/src/data/images/android/svg/godan__function__left_arrow__icon.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="godan_x5F__x5F_function_x5F__x5F_left_x5F_arrow_x5F__x5F_icon"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="82px" height="70px"
- viewBox="0 0 82 70" style="enable-background:new 0 0 82 70;" xml:space="preserve">
-<polygon id="style-keyicon-function_6_" style="fill-rule:evenodd;clip-rule:evenodd;fill:#DDDDDC;" points="33.101,34.245
- 47.731,24.762 49,25.931 49,44.035 47.798,45.238 33,35.684 "/>
-</svg>
diff --git a/src/data/images/android/svg/godan__function__right_arrow__icon.svg b/src/data/images/android/svg/godan__function__right_arrow__icon.svg
deleted file mode 100644
index 3b648d6..0000000
--- a/src/data/images/android/svg/godan__function__right_arrow__icon.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="godan_x5F__x5F_function_x5F__x5F_right_x5F_arrow_x5F__x5F_icon"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="82px" height="70px"
- viewBox="0 0 82 70" style="enable-background:new 0 0 82 70;" xml:space="preserve">
-<polygon id="style-keyicon-function_5_" style="fill-rule:evenodd;clip-rule:evenodd;fill:#DDDDDC;" points="48.9,34.245
- 34.269,24.762 33,25.931 33,44.035 34.202,45.238 49,35.684 "/>
-</svg>
diff --git a/src/data/images/android/svg/godan__function__space__icon.svg b/src/data/images/android/svg/godan__function__space__icon.svg
deleted file mode 100644
index f328d7a..0000000
--- a/src/data/images/android/svg/godan__function__space__icon.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="godan_x5F__x5F_function_x5F__x5F_space_x5F__x5F_icon"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="82px" height="70px"
- viewBox="0 0 82 70" style="enable-background:new 0 0 82 70;" xml:space="preserve">
-<polygon id="style-keyicon-function_4_" style="fill:#DDDDDC;" points="52.633,35 52.633,42.266 29.366,42.266 29.366,35 24.5,35
- 24.5,47.002 57.5,47.002 57.5,35 "/>
-</svg>
diff --git a/src/data/images/android/svg/godan__function__symbol__icon.svg b/src/data/images/android/svg/godan__function__symbol__icon.svg
deleted file mode 100644
index 3b83ae8..0000000
--- a/src/data/images/android/svg/godan__function__symbol__icon.svg
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="godan_x5F__x5F_function_x5F__x5F_symbol_x5F__x5F_icon"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="82px" height="70px"
- viewBox="0 0 82 70" style="enable-background:new 0 0 82 70;" xml:space="preserve">
-<g id="style-keyicon-function_1_">
- <circle style="fill:#DDDDDC;" cx="35.54" cy="21.736" r="2.21"/>
- <circle style="fill:#DDDDDC;" cx="46.31" cy="21.736" r="2.21"/>
- <path style="fill:#DDDDDC;" d=""/>
- <g>
- <path style="fill-rule:evenodd;clip-rule:evenodd;fill:#DDDDDC;" d=""/>
- </g>
-</g>
-<g id="style-keyicon-function_2_">
- <path style="fill:#DDDDDC;" d=""/>
- <path style="fill:#DDDDDC;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__function__undo__icon.svg b/src/data/images/android/svg/godan__function__undo__icon.svg
deleted file mode 100644
index 406b081..0000000
--- a/src/data/images/android/svg/godan__function__undo__icon.svg
+++ /dev/null
@@ -1,43 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="godan_x5F__x5F_function_x5F__x5F_undo_x5F__x5F_icon"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="82px" height="70px"
- viewBox="0 0 82 70" style="enable-background:new 0 0 82 70;" xml:space="preserve">
-<polygon id="style-keyicon-function_3_" style="fill:#DDDDDC;" points="52.661,34.086 52.661,27.813 50.827,25.912 34.844,25.912
- 34.844,30.35 33.542,31.251 24,24.143 24,22.875 33.676,16.869 34.844,17.803 34.844,21.407 56.232,21.407 58,23.309 58,34.086 "/>
-<g id="style-keyicon-function">
- <path style="fill:#DDDDDC;" d=""/>
- <path style="fill:#DDDDDC;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__14.svg b/src/data/images/android/svg/godan__kana__14.svg
index 0faa64d..9382212 100644
--- a/src/data/images/android/svg/godan__kana__14.svg
+++ b/src/data/images/android/svg/godan__kana__14.svg
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
<!--
Copyright 2010-2014, Google Inc.
All rights reserved.
@@ -30,27 +30,22 @@
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-->
<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="godan_x5F__x5F_kana_x5F__x5F_14"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="105px" height="70px"
- viewBox="0 0 105 70" style="enable-background:new 0 0 105 70;" xml:space="preserve">
+<svg version="1.1" id="godan_kana_14" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="105px" height="70px" viewBox="0 0 105 70" style="enable-background:new 0 0 105 70;" xml:space="preserve">
+<polyline id="style-keyicon-bound_1_" style="fill:none;stroke:#CCCBCB;stroke-miterlimit:10;" points="32.499,14.998 27.499,14.998 27.499,31.998 44.499,31.998 44.499,23.498 "/>
+<g id="style-keyicon-main_1_">
+ <text x="32.5" y="30" style="font-size:48px;text-anchor:middle;dominant-baseline:central;fill:#272727;">゛</text>
+</g>
+<polyline id="style-keyicon-bound_2_" style="fill:none;stroke:#CCCBCB;stroke-miterlimit:10;" points="65,15 60,15 60,32 77,32 77,23.5 "/>
+<g id="style-keyicon-main_2_">
+ <text x="62.5" y="30" style="font-size:48px;text-anchor:middle;dominant-baseline:central;fill:#272727;">゜</text>
+</g>
+<g id="style-keyicon-main_3_">
+ <text x="35" y="47.5" style="font-size:16px;text-anchor:middle;dominant-baseline:central;fill:#272727;">大</text>
+</g>
+<g id="style-keyicon-main_4_">
+ <text x="52.5" y="47.5" style="font-size:16px;text-anchor:middle;dominant-baseline:central;fill:#272727;">⇔</text>
+</g>
<g id="style-keyicon-main_5_">
- <path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-main_6_">
- <path style="fill:#272727;" d=""/>
-</g>
-<polyline id="style-keyicon-bound_1_" style="fill:none;stroke:#CCCBCB;stroke-miterlimit:10;" points="32.499,14.998
- 27.499,14.998 27.499,31.998 44.499,31.998 44.499,23.498 "/>
-<polyline id="style-keyicon-bound" style="fill:none;stroke:#CCCBCB;stroke-miterlimit:10;" points="65.5,15 60.5,15 60.5,32
- 77.5,32 77.5,23.5 "/>
-<g id="style-keyicon-main_7_">
- <path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-main_8_">
- <path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-main_9_">
- <path style="fill:#272727;" d=""/>
+ <text x="70" y="47.5" style="font-size:16px;text-anchor:middle;dominant-baseline:central;fill:#272727;">小</text>
</g>
</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__01_center.svg b/src/data/images/android/svg/godan__kana__support__01_center.svg
deleted file mode 100644
index b8c4c03..0000000
--- a/src/data/images/android/svg/godan__kana__support__01_center.svg
+++ /dev/null
@@ -1,48 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="center" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="70px" viewBox="0 0 105 70" style="enable-background:new 0 0 105 70;" xml:space="preserve">
-<g id="style-keyicon-main-highlight_1_">
- <path style="fill:#F9F9F9;" d=""/>
-</g>
-<g id="style-keyicon-guide">
-</g>
-<g id="style-keyicon-guide-light">
- <path style="fill:#999999;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
-</g>
-<g id="style-keyicon-guide_2_">
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__01_down.svg b/src/data/images/android/svg/godan__kana__support__01_down.svg
deleted file mode 100644
index a20db94..0000000
--- a/src/data/images/android/svg/godan__kana__support__01_down.svg
+++ /dev/null
@@ -1,48 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="down" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="70px" viewBox="0 0 105 70" style="enable-background:new 0 0 105 70;" xml:space="preserve">
-<g id="style-keyicon-main">
- <path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide">
-</g>
-<g id="style-keyicon-guide_1_">
-</g>
-<g id="style-keyicon-guide_2_">
-</g>
-<g id="style-keyicon-guide-highlight">
- <path style="fill:#F9F9F9;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__01_release.svg b/src/data/images/android/svg/godan__kana__support__01_release.svg
deleted file mode 100644
index 976f1ee..0000000
--- a/src/data/images/android/svg/godan__kana__support__01_release.svg
+++ /dev/null
@@ -1,48 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="release_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="70px" viewBox="0 0 105 70" style="enable-background:new 0 0 105 70;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
- <path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide_3_">
-</g>
-<g id="style-keyicon-guide-light_1_">
- <path style="fill:#999999;" d=""/>
-</g>
-<g id="style-keyicon-guide_4_">
-</g>
-<g id="style-keyicon-guide_5_">
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__02_center.svg b/src/data/images/android/svg/godan__kana__support__02_center.svg
deleted file mode 100644
index 9ad0992..0000000
--- a/src/data/images/android/svg/godan__kana__support__02_center.svg
+++ /dev/null
@@ -1,50 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="center" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="70px" viewBox="0 0 105 70" style="enable-background:new 0 0 105 70;" xml:space="preserve">
-<g id="style-keyicon-main-highlight_1_">
- <path style="fill:#F9F9F9;" d=""/>
-</g>
-<g id="style-keyicon-guide">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-light">
- <path style="fill:#999999;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
-</g>
-<g id="style-keyicon-guide_2_">
- <path style="fill:#333333;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__02_down.svg b/src/data/images/android/svg/godan__kana__support__02_down.svg
deleted file mode 100644
index eaf0373..0000000
--- a/src/data/images/android/svg/godan__kana__support__02_down.svg
+++ /dev/null
@@ -1,50 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="down" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="70px" viewBox="0 0 105 70" style="enable-background:new 0 0 105 70;" xml:space="preserve">
-<g id="style-keyicon-main">
- <path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
-</g>
-<g id="style-keyicon-guide_2_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-highlight">
- <path style="fill:#F9F9F9;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__02_release.svg b/src/data/images/android/svg/godan__kana__support__02_release.svg
deleted file mode 100644
index fc41875..0000000
--- a/src/data/images/android/svg/godan__kana__support__02_release.svg
+++ /dev/null
@@ -1,50 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="release_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="70px" viewBox="0 0 105 70" style="enable-background:new 0 0 105 70;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
- <path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide_3_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-light_1_">
- <path style="fill:#999999;" d=""/>
-</g>
-<g id="style-keyicon-guide_4_">
-</g>
-<g id="style-keyicon-guide_5_">
- <path style="fill:#333333;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__02_right.svg b/src/data/images/android/svg/godan__kana__support__02_right.svg
deleted file mode 100644
index 11bc9a9..0000000
--- a/src/data/images/android/svg/godan__kana__support__02_right.svg
+++ /dev/null
@@ -1,50 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="right" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="70px" viewBox="0 0 105 70" style="enable-background:new 0 0 105 70;" xml:space="preserve">
-<g id="style-keyicon-main">
- <path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-light">
- <path style="fill:#999999;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
-</g>
-<g id="style-keyicon-guide-highlight">
- <path style="fill:#F9F9F9;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__02_up.svg b/src/data/images/android/svg/godan__kana__support__02_up.svg
deleted file mode 100644
index 287006b..0000000
--- a/src/data/images/android/svg/godan__kana__support__02_up.svg
+++ /dev/null
@@ -1,50 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="up" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="70px" viewBox="0 0 105 70" style="enable-background:new 0 0 105 70;" xml:space="preserve">
-<g id="style-keyicon-main">
- <path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide-light">
- <path style="fill:#999999;" d=""/>
-</g>
-<g id="style-keyicon-guide">
-</g>
-<g id="style-keyicon-guide_1_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-highlight">
- <path style="fill:#F9F9F9;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__03_center.svg b/src/data/images/android/svg/godan__kana__support__03_center.svg
deleted file mode 100644
index e5ce1d9..0000000
--- a/src/data/images/android/svg/godan__kana__support__03_center.svg
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="center" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="70px" viewBox="0 0 105 70" style="enable-background:new 0 0 105 70;" xml:space="preserve">
-<g id="style-keyicon-main-highlight_1_">
- <path style="fill:#F9F9F9;" d=""/>
-</g>
-<g id="style-keyicon-guide">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-light">
- <path style="fill:#999999;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_2_">
- <path style="fill:#333333;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__03_down.svg b/src/data/images/android/svg/godan__kana__support__03_down.svg
deleted file mode 100644
index 3c88879..0000000
--- a/src/data/images/android/svg/godan__kana__support__03_down.svg
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="down" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="70px" viewBox="0 0 105 70" style="enable-background:new 0 0 105 70;" xml:space="preserve">
-<g id="style-keyicon-main">
- <path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_2_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-highlight">
- <path style="fill:#F9F9F9;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__03_left.svg b/src/data/images/android/svg/godan__kana__support__03_left.svg
deleted file mode 100644
index a6fc784..0000000
--- a/src/data/images/android/svg/godan__kana__support__03_left.svg
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="left" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="70px" viewBox="0 0 105 70" style="enable-background:new 0 0 105 70;" xml:space="preserve">
-<g id="style-keyicon-main">
- <path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-light">
- <path style="fill:#999999;" d=""/>
-</g>
-<g id="style-keyicon-guide-highlight_1_">
- <path style="fill:#F9F9F9;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
- <path style="fill:#333333;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__03_release.svg b/src/data/images/android/svg/godan__kana__support__03_release.svg
deleted file mode 100644
index 3aad1d7..0000000
--- a/src/data/images/android/svg/godan__kana__support__03_release.svg
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="release_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="70px" viewBox="0 0 105 70" style="enable-background:new 0 0 105 70;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
- <path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide_3_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-light_1_">
- <path style="fill:#999999;" d=""/>
-</g>
-<g id="style-keyicon-guide_4_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_5_">
- <path style="fill:#333333;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__03_right.svg b/src/data/images/android/svg/godan__kana__support__03_right.svg
deleted file mode 100644
index d75e485..0000000
--- a/src/data/images/android/svg/godan__kana__support__03_right.svg
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="right" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="70px" viewBox="0 0 105 70" style="enable-background:new 0 0 105 70;" xml:space="preserve">
-<g id="style-keyicon-main">
- <path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-light">
- <path style="fill:#999999;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-highlight">
- <path style="fill:#F9F9F9;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__03_up.svg b/src/data/images/android/svg/godan__kana__support__03_up.svg
deleted file mode 100644
index 423e30c..0000000
--- a/src/data/images/android/svg/godan__kana__support__03_up.svg
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="up" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="70px" viewBox="0 0 105 70" style="enable-background:new 0 0 105 70;" xml:space="preserve">
-<g id="style-keyicon-main">
- <path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide-light">
- <path style="fill:#999999;" d=""/>
-</g>
-<g id="style-keyicon-guide">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-highlight">
- <path style="fill:#F9F9F9;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__04_center.svg b/src/data/images/android/svg/godan__kana__support__04_center.svg
deleted file mode 100644
index b8c4c03..0000000
--- a/src/data/images/android/svg/godan__kana__support__04_center.svg
+++ /dev/null
@@ -1,48 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="center" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="70px" viewBox="0 0 105 70" style="enable-background:new 0 0 105 70;" xml:space="preserve">
-<g id="style-keyicon-main-highlight_1_">
- <path style="fill:#F9F9F9;" d=""/>
-</g>
-<g id="style-keyicon-guide">
-</g>
-<g id="style-keyicon-guide-light">
- <path style="fill:#999999;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
-</g>
-<g id="style-keyicon-guide_2_">
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__04_down.svg b/src/data/images/android/svg/godan__kana__support__04_down.svg
deleted file mode 100644
index a20db94..0000000
--- a/src/data/images/android/svg/godan__kana__support__04_down.svg
+++ /dev/null
@@ -1,48 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="down" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="70px" viewBox="0 0 105 70" style="enable-background:new 0 0 105 70;" xml:space="preserve">
-<g id="style-keyicon-main">
- <path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide">
-</g>
-<g id="style-keyicon-guide_1_">
-</g>
-<g id="style-keyicon-guide_2_">
-</g>
-<g id="style-keyicon-guide-highlight">
- <path style="fill:#F9F9F9;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__04_release.svg b/src/data/images/android/svg/godan__kana__support__04_release.svg
deleted file mode 100644
index 976f1ee..0000000
--- a/src/data/images/android/svg/godan__kana__support__04_release.svg
+++ /dev/null
@@ -1,48 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="release_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="70px" viewBox="0 0 105 70" style="enable-background:new 0 0 105 70;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
- <path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide_3_">
-</g>
-<g id="style-keyicon-guide-light_1_">
- <path style="fill:#999999;" d=""/>
-</g>
-<g id="style-keyicon-guide_4_">
-</g>
-<g id="style-keyicon-guide_5_">
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__05_center.svg b/src/data/images/android/svg/godan__kana__support__05_center.svg
deleted file mode 100644
index 9ad0992..0000000
--- a/src/data/images/android/svg/godan__kana__support__05_center.svg
+++ /dev/null
@@ -1,50 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="center" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="70px" viewBox="0 0 105 70" style="enable-background:new 0 0 105 70;" xml:space="preserve">
-<g id="style-keyicon-main-highlight_1_">
- <path style="fill:#F9F9F9;" d=""/>
-</g>
-<g id="style-keyicon-guide">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-light">
- <path style="fill:#999999;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
-</g>
-<g id="style-keyicon-guide_2_">
- <path style="fill:#333333;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__05_down.svg b/src/data/images/android/svg/godan__kana__support__05_down.svg
deleted file mode 100644
index eaf0373..0000000
--- a/src/data/images/android/svg/godan__kana__support__05_down.svg
+++ /dev/null
@@ -1,50 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="down" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="70px" viewBox="0 0 105 70" style="enable-background:new 0 0 105 70;" xml:space="preserve">
-<g id="style-keyicon-main">
- <path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
-</g>
-<g id="style-keyicon-guide_2_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-highlight">
- <path style="fill:#F9F9F9;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__05_release.svg b/src/data/images/android/svg/godan__kana__support__05_release.svg
deleted file mode 100644
index fc41875..0000000
--- a/src/data/images/android/svg/godan__kana__support__05_release.svg
+++ /dev/null
@@ -1,50 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="release_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="70px" viewBox="0 0 105 70" style="enable-background:new 0 0 105 70;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
- <path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide_3_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-light_1_">
- <path style="fill:#999999;" d=""/>
-</g>
-<g id="style-keyicon-guide_4_">
-</g>
-<g id="style-keyicon-guide_5_">
- <path style="fill:#333333;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__05_right.svg b/src/data/images/android/svg/godan__kana__support__05_right.svg
deleted file mode 100644
index 11bc9a9..0000000
--- a/src/data/images/android/svg/godan__kana__support__05_right.svg
+++ /dev/null
@@ -1,50 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="right" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="70px" viewBox="0 0 105 70" style="enable-background:new 0 0 105 70;" xml:space="preserve">
-<g id="style-keyicon-main">
- <path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-light">
- <path style="fill:#999999;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
-</g>
-<g id="style-keyicon-guide-highlight">
- <path style="fill:#F9F9F9;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__05_up.svg b/src/data/images/android/svg/godan__kana__support__05_up.svg
deleted file mode 100644
index 287006b..0000000
--- a/src/data/images/android/svg/godan__kana__support__05_up.svg
+++ /dev/null
@@ -1,50 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="up" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="70px" viewBox="0 0 105 70" style="enable-background:new 0 0 105 70;" xml:space="preserve">
-<g id="style-keyicon-main">
- <path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide-light">
- <path style="fill:#999999;" d=""/>
-</g>
-<g id="style-keyicon-guide">
-</g>
-<g id="style-keyicon-guide_1_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-highlight">
- <path style="fill:#F9F9F9;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__06_center.svg b/src/data/images/android/svg/godan__kana__support__06_center.svg
deleted file mode 100644
index 6bea628..0000000
--- a/src/data/images/android/svg/godan__kana__support__06_center.svg
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="godan_x5F__x5F_kana_x5F__x5F_support_x5F__x5F_06_x5F_center"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="105px" height="70px"
- viewBox="0 0 105 70" style="enable-background:new 0 0 105 70;" xml:space="preserve">
-<g id="style-keyicon-main-highlight_1_">
- <path style="fill:#F9F9F9;" d=""/>
-</g>
-<g id="style-keyicon-guide-light">
- <path style="fill:#999999;" d=""/>
-</g>
-<g id="style-keyicon-guide">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
- <path style="fill:#333333;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__06_down.svg b/src/data/images/android/svg/godan__kana__support__06_down.svg
deleted file mode 100644
index a3ab49e..0000000
--- a/src/data/images/android/svg/godan__kana__support__06_down.svg
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="godan_x5F__x5F_kana_x5F__x5F_support_x5F__x5F_06_x5F_down"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="105px" height="70px"
- viewBox="0 0 105 70" style="enable-background:new 0 0 105 70;" xml:space="preserve">
-<g id="style-keyicon-main">
- <path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide-highlight">
- <path style="fill:#F9F9F9;" d=""/>
-</g>
-<g id="style-keyicon-guide">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
- <path style="fill:#333333;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__06_release.svg b/src/data/images/android/svg/godan__kana__support__06_release.svg
deleted file mode 100644
index a2aebb2..0000000
--- a/src/data/images/android/svg/godan__kana__support__06_release.svg
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="godan_x5F__x5F_kana_x5F__x5F_support_x5F__x5F_06_x5F_release"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="105px" height="70px"
- viewBox="0 0 105 70" style="enable-background:new 0 0 105 70;" xml:space="preserve">
-<g id="style-keyicon-main">
- <path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide-light_1_">
- <path style="fill:#999999;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_2_">
- <path style="fill:#333333;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__06_right.svg b/src/data/images/android/svg/godan__kana__support__06_right.svg
deleted file mode 100644
index 07c6f44..0000000
--- a/src/data/images/android/svg/godan__kana__support__06_right.svg
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="godan_x5F__x5F_kana_x5F__x5F_support_x5F__x5F_06_x5F_right"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="105px" height="70px"
- viewBox="0 0 105 70" style="enable-background:new 0 0 105 70;" xml:space="preserve">
-<g id="style-keyicon-main">
- <path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide-light">
- <path style="fill:#999999;" d=""/>
-</g>
-<g id="style-keyicon-guide-highlight">
- <path style="fill:#F9F9F9;" d=""/>
-</g>
-<g id="style-keyicon-guide">
- <path style="fill:#333333;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__06_up.svg b/src/data/images/android/svg/godan__kana__support__06_up.svg
deleted file mode 100644
index 3fb298e..0000000
--- a/src/data/images/android/svg/godan__kana__support__06_up.svg
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="godan_x5F__x5F_kana_x5F__x5F_support_x5F__x5F_06_x5F_up"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="105px" height="70px"
- viewBox="0 0 105 70" style="enable-background:new 0 0 105 70;" xml:space="preserve">
-<g id="style-keyicon-main">
- <path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide-light">
- <path style="fill:#999999;" d=""/>
-</g>
-<g id="style-keyicon-guide-highlight_2_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-highlight_3_">
- <path style="fill:#F9F9F9;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__07_center.svg b/src/data/images/android/svg/godan__kana__support__07_center.svg
deleted file mode 100644
index b8c4c03..0000000
--- a/src/data/images/android/svg/godan__kana__support__07_center.svg
+++ /dev/null
@@ -1,48 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="center" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="70px" viewBox="0 0 105 70" style="enable-background:new 0 0 105 70;" xml:space="preserve">
-<g id="style-keyicon-main-highlight_1_">
- <path style="fill:#F9F9F9;" d=""/>
-</g>
-<g id="style-keyicon-guide">
-</g>
-<g id="style-keyicon-guide-light">
- <path style="fill:#999999;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
-</g>
-<g id="style-keyicon-guide_2_">
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__07_down.svg b/src/data/images/android/svg/godan__kana__support__07_down.svg
deleted file mode 100644
index a20db94..0000000
--- a/src/data/images/android/svg/godan__kana__support__07_down.svg
+++ /dev/null
@@ -1,48 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="down" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="70px" viewBox="0 0 105 70" style="enable-background:new 0 0 105 70;" xml:space="preserve">
-<g id="style-keyicon-main">
- <path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide">
-</g>
-<g id="style-keyicon-guide_1_">
-</g>
-<g id="style-keyicon-guide_2_">
-</g>
-<g id="style-keyicon-guide-highlight">
- <path style="fill:#F9F9F9;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__07_release.svg b/src/data/images/android/svg/godan__kana__support__07_release.svg
deleted file mode 100644
index 976f1ee..0000000
--- a/src/data/images/android/svg/godan__kana__support__07_release.svg
+++ /dev/null
@@ -1,48 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="release_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="70px" viewBox="0 0 105 70" style="enable-background:new 0 0 105 70;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
- <path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide_3_">
-</g>
-<g id="style-keyicon-guide-light_1_">
- <path style="fill:#999999;" d=""/>
-</g>
-<g id="style-keyicon-guide_4_">
-</g>
-<g id="style-keyicon-guide_5_">
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__08_center.svg b/src/data/images/android/svg/godan__kana__support__08_center.svg
deleted file mode 100644
index 9ad0992..0000000
--- a/src/data/images/android/svg/godan__kana__support__08_center.svg
+++ /dev/null
@@ -1,50 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="center" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="70px" viewBox="0 0 105 70" style="enable-background:new 0 0 105 70;" xml:space="preserve">
-<g id="style-keyicon-main-highlight_1_">
- <path style="fill:#F9F9F9;" d=""/>
-</g>
-<g id="style-keyicon-guide">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-light">
- <path style="fill:#999999;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
-</g>
-<g id="style-keyicon-guide_2_">
- <path style="fill:#333333;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__08_down.svg b/src/data/images/android/svg/godan__kana__support__08_down.svg
deleted file mode 100644
index eaf0373..0000000
--- a/src/data/images/android/svg/godan__kana__support__08_down.svg
+++ /dev/null
@@ -1,50 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="down" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="70px" viewBox="0 0 105 70" style="enable-background:new 0 0 105 70;" xml:space="preserve">
-<g id="style-keyicon-main">
- <path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
-</g>
-<g id="style-keyicon-guide_2_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-highlight">
- <path style="fill:#F9F9F9;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__08_release.svg b/src/data/images/android/svg/godan__kana__support__08_release.svg
deleted file mode 100644
index fc41875..0000000
--- a/src/data/images/android/svg/godan__kana__support__08_release.svg
+++ /dev/null
@@ -1,50 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="release_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="70px" viewBox="0 0 105 70" style="enable-background:new 0 0 105 70;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
- <path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide_3_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-light_1_">
- <path style="fill:#999999;" d=""/>
-</g>
-<g id="style-keyicon-guide_4_">
-</g>
-<g id="style-keyicon-guide_5_">
- <path style="fill:#333333;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__08_right.svg b/src/data/images/android/svg/godan__kana__support__08_right.svg
deleted file mode 100644
index 11bc9a9..0000000
--- a/src/data/images/android/svg/godan__kana__support__08_right.svg
+++ /dev/null
@@ -1,50 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="right" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="70px" viewBox="0 0 105 70" style="enable-background:new 0 0 105 70;" xml:space="preserve">
-<g id="style-keyicon-main">
- <path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-light">
- <path style="fill:#999999;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
-</g>
-<g id="style-keyicon-guide-highlight">
- <path style="fill:#F9F9F9;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__08_up.svg b/src/data/images/android/svg/godan__kana__support__08_up.svg
deleted file mode 100644
index 287006b..0000000
--- a/src/data/images/android/svg/godan__kana__support__08_up.svg
+++ /dev/null
@@ -1,50 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="up" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="70px" viewBox="0 0 105 70" style="enable-background:new 0 0 105 70;" xml:space="preserve">
-<g id="style-keyicon-main">
- <path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide-light">
- <path style="fill:#999999;" d=""/>
-</g>
-<g id="style-keyicon-guide">
-</g>
-<g id="style-keyicon-guide_1_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-highlight">
- <path style="fill:#F9F9F9;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__09_center.svg b/src/data/images/android/svg/godan__kana__support__09_center.svg
deleted file mode 100644
index 5d28725..0000000
--- a/src/data/images/android/svg/godan__kana__support__09_center.svg
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="center" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="70px" viewBox="0 0 105 70" style="enable-background:new 0 0 105 70;" xml:space="preserve">
-<g id="style-keyicon-main-highlight_1_">
- <path style="fill:#F9F9F9;" d=""/>
-</g>
-<g id="style-keyicon-guide">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-light">
- <path style="fill:#999999;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
-</g>
-<g id="style-keyicon-guide_2_">
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__09_down.svg b/src/data/images/android/svg/godan__kana__support__09_down.svg
deleted file mode 100644
index 05207fa..0000000
--- a/src/data/images/android/svg/godan__kana__support__09_down.svg
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="down" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="70px" viewBox="0 0 105 70" style="enable-background:new 0 0 105 70;" xml:space="preserve">
-<g id="style-keyicon-main">
- <path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
-</g>
-<g id="style-keyicon-guide_2_">
-</g>
-<g id="style-keyicon-guide-highlight">
- <path style="fill:#F9F9F9;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__09_release.svg b/src/data/images/android/svg/godan__kana__support__09_release.svg
deleted file mode 100644
index 2cbdd7f..0000000
--- a/src/data/images/android/svg/godan__kana__support__09_release.svg
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="release_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="70px" viewBox="0 0 105 70" style="enable-background:new 0 0 105 70;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
- <path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide_3_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-light_1_">
- <path style="fill:#999999;" d=""/>
-</g>
-<g id="style-keyicon-guide_4_">
-</g>
-<g id="style-keyicon-guide_5_">
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__09_up.svg b/src/data/images/android/svg/godan__kana__support__09_up.svg
deleted file mode 100644
index 40a812f..0000000
--- a/src/data/images/android/svg/godan__kana__support__09_up.svg
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="up" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="70px" viewBox="0 0 105 70" style="enable-background:new 0 0 105 70;" xml:space="preserve">
-<g id="style-keyicon-main">
- <path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide-light">
- <path style="fill:#999999;" d=""/>
-</g>
-<g id="style-keyicon-guide">
-</g>
-<g id="style-keyicon-guide_1_">
-</g>
-<g id="style-keyicon-guide-highlight">
- <path style="fill:#F9F9F9;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__10_center.svg b/src/data/images/android/svg/godan__kana__support__10_center.svg
deleted file mode 100644
index 5a6c66f..0000000
--- a/src/data/images/android/svg/godan__kana__support__10_center.svg
+++ /dev/null
@@ -1,47 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="center" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="70px" viewBox="0 0 105 70" style="enable-background:new 0 0 105 70;" xml:space="preserve">
-<g id="style-keyicon-main-highlight_1_">
- <path style="fill:#F9F9F9;" d=""/>
-</g>
-<g id="style-keyicon-guide">
-</g>
-<g id="style-keyicon-guide-light">
-</g>
-<g id="style-keyicon-guide_1_">
-</g>
-<g id="style-keyicon-guide_2_">
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__10_release.svg b/src/data/images/android/svg/godan__kana__support__10_release.svg
deleted file mode 100644
index 35f567d..0000000
--- a/src/data/images/android/svg/godan__kana__support__10_release.svg
+++ /dev/null
@@ -1,47 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="release_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="70px" viewBox="0 0 105 70" style="enable-background:new 0 0 105 70;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
- <path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide_3_">
-</g>
-<g id="style-keyicon-guide-light_1_">
-</g>
-<g id="style-keyicon-guide_4_">
-</g>
-<g id="style-keyicon-guide_5_">
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__11_center.svg b/src/data/images/android/svg/godan__kana__support__11_center.svg
deleted file mode 100644
index b8c4c03..0000000
--- a/src/data/images/android/svg/godan__kana__support__11_center.svg
+++ /dev/null
@@ -1,48 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="center" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="70px" viewBox="0 0 105 70" style="enable-background:new 0 0 105 70;" xml:space="preserve">
-<g id="style-keyicon-main-highlight_1_">
- <path style="fill:#F9F9F9;" d=""/>
-</g>
-<g id="style-keyicon-guide">
-</g>
-<g id="style-keyicon-guide-light">
- <path style="fill:#999999;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
-</g>
-<g id="style-keyicon-guide_2_">
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__11_down.svg b/src/data/images/android/svg/godan__kana__support__11_down.svg
deleted file mode 100644
index a20db94..0000000
--- a/src/data/images/android/svg/godan__kana__support__11_down.svg
+++ /dev/null
@@ -1,48 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="down" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="70px" viewBox="0 0 105 70" style="enable-background:new 0 0 105 70;" xml:space="preserve">
-<g id="style-keyicon-main">
- <path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide">
-</g>
-<g id="style-keyicon-guide_1_">
-</g>
-<g id="style-keyicon-guide_2_">
-</g>
-<g id="style-keyicon-guide-highlight">
- <path style="fill:#F9F9F9;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__11_release.svg b/src/data/images/android/svg/godan__kana__support__11_release.svg
deleted file mode 100644
index 976f1ee..0000000
--- a/src/data/images/android/svg/godan__kana__support__11_release.svg
+++ /dev/null
@@ -1,48 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="release_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="70px" viewBox="0 0 105 70" style="enable-background:new 0 0 105 70;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
- <path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide_3_">
-</g>
-<g id="style-keyicon-guide-light_1_">
- <path style="fill:#999999;" d=""/>
-</g>
-<g id="style-keyicon-guide_4_">
-</g>
-<g id="style-keyicon-guide_5_">
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__12_center.svg b/src/data/images/android/svg/godan__kana__support__12_center.svg
deleted file mode 100644
index 765ab3c..0000000
--- a/src/data/images/android/svg/godan__kana__support__12_center.svg
+++ /dev/null
@@ -1,57 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="godan_x5F__x5F_kana_x5F__x5F_support_x5F__x5F_12_x5F_center"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="105px" height="70px"
- viewBox="0 0 105 70" style="enable-background:new 0 0 105 70;" xml:space="preserve">
-<g id="style-keyicon-main-highlight">
- <path style="fill:#F9F9F9;" d=""/>
-</g>
-<g id="style-keyicon-main">
- <path style="fill:#272727;" d=""/>
-</g>
-<polyline id="style-keyicon-bound_5_" style="fill:none;stroke:#CCCBCB;stroke-miterlimit:10;" points="44.75,58.167 44.75,49.667
- 61.75,49.667 61.75,66.667 53.25,66.667 "/>
-<g id="style-keyicon-main_1_">
- <path style="fill:#333333;" d=""/>
-</g>
-<polyline id="style-keyicon-bound_4_" style="fill:none;stroke:#CCCBCB;stroke-miterlimit:10;" points="12.75,35 12.75,26.5
- 29.75,26.5 29.75,43.5 21.25,43.5 "/>
-<g id="style-keyicon-main_2_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-main_3_">
- <path style="fill:#333333;" d=""
- />
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__12_down.svg b/src/data/images/android/svg/godan__kana__support__12_down.svg
deleted file mode 100644
index 4e5764b..0000000
--- a/src/data/images/android/svg/godan__kana__support__12_down.svg
+++ /dev/null
@@ -1,55 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="godan_x5F__x5F_kana_x5F__x5F_support_x5F__x5F_12_x5F_down"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="105px" height="70px"
- viewBox="0 0 105 70" style="enable-background:new 0 0 105 70;" xml:space="preserve">
-<g id="style-keyicon-main">
- <path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-main-highlight">
- <path style="fill:#F9F9F9;" d=""/>
-</g>
-<g id="style-keyicon-main_1_">
- <path style="fill:#333333;" d=""/>
-</g>
-<polyline id="style-keyicon-bound_11_" style="fill:none;stroke:#CCCBCB;stroke-miterlimit:10;" points="12.75,35 12.75,26.5
- 29.75,26.5 29.75,43.5 21.25,43.5 "/>
-<g id="style-keyicon-main_2_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-main_3_">
- <path style="fill:#333333;" d=""
- />
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__12_left.svg b/src/data/images/android/svg/godan__kana__support__12_left.svg
deleted file mode 100644
index 8596113..0000000
--- a/src/data/images/android/svg/godan__kana__support__12_left.svg
+++ /dev/null
@@ -1,55 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="godan_x5F__x5F_kana_x5F__x5F_support_x5F__x5F_12_x5F_left"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="105px" height="70px"
- viewBox="0 0 105 70" style="enable-background:new 0 0 105 70;" xml:space="preserve">
-<g id="style-keyicon-main">
- <path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-main_1_">
- <path style="fill:#272727;" d=""/>
-</g>
-<polyline id="style-keyicon-bound_6_" style="fill:none;stroke:#CCCBCB;stroke-miterlimit:10;" points="44.75,58.167 44.75,49.667
- 61.75,49.667 61.75,66.667 53.25,66.667 "/>
-<g id="style-keyicon-main-highlight">
- <path style="fill:#F9F9F9;" d=""/>
-</g>
-<g id="style-keyicon-main_2_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-main_3_">
- <path style="fill:#333333;" d=""
- />
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__12_release.svg b/src/data/images/android/svg/godan__kana__support__12_release.svg
deleted file mode 100644
index 2fd1ee7..0000000
--- a/src/data/images/android/svg/godan__kana__support__12_release.svg
+++ /dev/null
@@ -1,57 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="godan_x5F__x5F_kana_x5F__x5F_support_x5F__x5F_12_x5F_release"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="105px" height="70px"
- viewBox="0 0 105 70" style="enable-background:new 0 0 105 70;" xml:space="preserve">
-<g id="style-keyicon-main">
- <path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-main_1_">
- <path style="fill:#272727;" d=""/>
-</g>
-<polyline id="style-keyicon-bound_3_" style="fill:none;stroke:#CCCBCB;stroke-miterlimit:10;" points="44.75,58.167 44.75,49.667
- 61.75,49.667 61.75,66.667 53.25,66.667 "/>
-<g id="style-keyicon-main_2_">
- <path style="fill:#333333;" d=""/>
-</g>
-<polyline id="style-keyicon-bound_2_" style="fill:none;stroke:#CCCBCB;stroke-miterlimit:10;" points="12.75,35 12.75,26.5
- 29.75,26.5 29.75,43.5 21.25,43.5 "/>
-<g id="style-keyicon-main_3_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-main_4_">
- <path style="fill:#333333;" d=""
- />
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__12_right.svg b/src/data/images/android/svg/godan__kana__support__12_right.svg
deleted file mode 100644
index c05bc59..0000000
--- a/src/data/images/android/svg/godan__kana__support__12_right.svg
+++ /dev/null
@@ -1,57 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="godan_x5F__x5F_kana_x5F__x5F_support_x5F__x5F_12_x5F_right"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="105px" height="70px"
- viewBox="0 0 105 70" style="enable-background:new 0 0 105 70;" xml:space="preserve">
-<g id="style-keyicon-main">
- <path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-main_1_">
- <path style="fill:#272727;" d=""/>
-</g>
-<polyline id="style-keyicon-bound_10_" style="fill:none;stroke:#CCCBCB;stroke-miterlimit:10;" points="44.75,58.167 44.75,49.667
- 61.75,49.667 61.75,66.667 53.25,66.667 "/>
-<g id="style-keyicon-main_2_">
- <path style="fill:#333333;" d=""/>
-</g>
-<polyline id="style-keyicon-bound_9_" style="fill:none;stroke:#CCCBCB;stroke-miterlimit:10;" points="12.75,35 12.75,26.5
- 29.75,26.5 29.75,43.5 21.25,43.5 "/>
-<g id="style-keyicon-main-highlight">
- <path style="fill:#F9F9F9;" d=""/>
-</g>
-<g id="style-keyicon-main_3_">
- <path style="fill:#333333;" d=""
- />
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__12_up.svg b/src/data/images/android/svg/godan__kana__support__12_up.svg
deleted file mode 100644
index 459903b..0000000
--- a/src/data/images/android/svg/godan__kana__support__12_up.svg
+++ /dev/null
@@ -1,57 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="godan_x5F__x5F_kana_x5F__x5F_support_x5F__x5F_12_x5F_up"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="105px" height="70px"
- viewBox="0 0 105 70" style="enable-background:new 0 0 105 70;" xml:space="preserve">
-<g id="style-keyicon-main">
- <path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-main-highlight">
- <path style="fill:#272727;" d=""/>
-</g>
-<polyline id="style-keyicon-bound_8_" style="fill:none;stroke:#CCCBCB;stroke-miterlimit:10;" points="44.75,58.167 44.75,49.667
- 61.75,49.667 61.75,66.667 53.25,66.667 "/>
-<g id="style-keyicon-main_1_">
- <path style="fill:#333333;" d=""/>
-</g>
-<polyline id="style-keyicon-bound_7_" style="fill:none;stroke:#CCCBCB;stroke-miterlimit:10;" points="12.75,35 12.75,26.5
- 29.75,26.5 29.75,43.5 21.25,43.5 "/>
-<g id="style-keyicon-main_2_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-main-highlight_1_">
- <path style="fill:#F9F9F9;" d=""
- />
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__13_center.svg b/src/data/images/android/svg/godan__kana__support__13_center.svg
deleted file mode 100644
index 5a6c66f..0000000
--- a/src/data/images/android/svg/godan__kana__support__13_center.svg
+++ /dev/null
@@ -1,47 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="center" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="70px" viewBox="0 0 105 70" style="enable-background:new 0 0 105 70;" xml:space="preserve">
-<g id="style-keyicon-main-highlight_1_">
- <path style="fill:#F9F9F9;" d=""/>
-</g>
-<g id="style-keyicon-guide">
-</g>
-<g id="style-keyicon-guide-light">
-</g>
-<g id="style-keyicon-guide_1_">
-</g>
-<g id="style-keyicon-guide_2_">
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__13_release.svg b/src/data/images/android/svg/godan__kana__support__13_release.svg
deleted file mode 100644
index 35f567d..0000000
--- a/src/data/images/android/svg/godan__kana__support__13_release.svg
+++ /dev/null
@@ -1,47 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="release_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="70px" viewBox="0 0 105 70" style="enable-background:new 0 0 105 70;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
- <path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide_3_">
-</g>
-<g id="style-keyicon-guide-light_1_">
-</g>
-<g id="style-keyicon-guide_4_">
-</g>
-<g id="style-keyicon-guide_5_">
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__15_center.svg b/src/data/images/android/svg/godan__kana__support__15_center.svg
deleted file mode 100644
index 0e5657e..0000000
--- a/src/data/images/android/svg/godan__kana__support__15_center.svg
+++ /dev/null
@@ -1,48 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="center" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="70px" viewBox="0 0 105 70" style="enable-background:new 0 0 105 70;" xml:space="preserve">
-<g id="style-keyicon-main-highlight_1_">
- <path style="fill:#F9F9F9;" d=""/>
-</g>
-<g id="style-keyicon-guide">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-light">
-</g>
-<g id="style-keyicon-guide_1_">
-</g>
-<g id="style-keyicon-guide_2_">
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__15_release.svg b/src/data/images/android/svg/godan__kana__support__15_release.svg
deleted file mode 100644
index 7f57371..0000000
--- a/src/data/images/android/svg/godan__kana__support__15_release.svg
+++ /dev/null
@@ -1,48 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="release_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="70px" viewBox="0 0 105 70" style="enable-background:new 0 0 105 70;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
- <path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide_3_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-light_1_">
-</g>
-<g id="style-keyicon-guide_4_">
-</g>
-<g id="style-keyicon-guide_5_">
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__15_up.svg b/src/data/images/android/svg/godan__kana__support__15_up.svg
deleted file mode 100644
index 3cb4c66..0000000
--- a/src/data/images/android/svg/godan__kana__support__15_up.svg
+++ /dev/null
@@ -1,48 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="up" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="70px" viewBox="0 0 105 70" style="enable-background:new 0 0 105 70;" xml:space="preserve">
-<g id="style-keyicon-main">
- <path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide-light">
-</g>
-<g id="style-keyicon-guide">
-</g>
-<g id="style-keyicon-guide_1_">
-</g>
-<g id="style-keyicon-guide-highlight">
- <path style="fill:#F9F9F9;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__popup__01.svg b/src/data/images/android/svg/godan__kana__support__popup__01.svg
deleted file mode 100644
index 9de6789..0000000
--- a/src/data/images/android/svg/godan__kana__support__popup__01.svg
+++ /dev/null
@@ -1,44 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="godan_x5F__x5F_kana_x5F__x5F_support_x5F__x5F_popup_x5F__x5F_01"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="112px" height="112px"
- viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<circle id="style-keypopup-highlight" style="fill-rule:evenodd;clip-rule:evenodd;fill:#F7982D;" cx="56.001" cy="56.001" r="22"/>
-<g id="style-keyicon-main_2_">
- <path d=""/>
-</g>
-<g id="style-keyicon-main_3_">
- <path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__popup__02.svg b/src/data/images/android/svg/godan__kana__support__popup__02.svg
deleted file mode 100644
index 3a423e1..0000000
--- a/src/data/images/android/svg/godan__kana__support__popup__02.svg
+++ /dev/null
@@ -1,50 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="godan_x5F__x5F_kana_x5F__x5F_support_x5F__x5F_popup_x5F__x5F_02"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="112px" height="112px"
- viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<circle id="style-keypopup-highlight_1_" style="fill-rule:evenodd;clip-rule:evenodd;fill:#F7982D;" cx="56" cy="56" r="22"/>
-<g id="style-keyicon-main">
- <path d=""/>
-</g>
-<g id="style-keyicon-main_1_">
- <path d=""/>
-</g>
-<g id="style-keyicon-main_6_">
- <path d=""/>
-</g>
-<g id="style-keyicon-main_7_">
- <path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__popup__03.svg b/src/data/images/android/svg/godan__kana__support__popup__03.svg
deleted file mode 100644
index 0f6523d..0000000
--- a/src/data/images/android/svg/godan__kana__support__popup__03.svg
+++ /dev/null
@@ -1,53 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="godan_x5F__x5F_kana_x5F__x5F_support_x5F__x5F_popup_x5F__x5F_03"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="112px" height="112px"
- viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<circle id="style-keypopup-highlight_2_" style="fill-rule:evenodd;clip-rule:evenodd;fill:#F7982D;" cx="56" cy="56" r="22"/>
-<g id="style-keyicon-main">
- <path d=""/>
-</g>
-<g id="style-keyicon-main_1_">
- <path d=""/>
-</g>
-<g id="style-keyicon-main_2_">
- <path d=""/>
-</g>
-<g id="style-keyicon-main_3_">
- <path d=""/>
-</g>
-<g id="style-keyicon-main_4_">
- <path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__popup__04.svg b/src/data/images/android/svg/godan__kana__support__popup__04.svg
deleted file mode 100644
index b0cdd25..0000000
--- a/src/data/images/android/svg/godan__kana__support__popup__04.svg
+++ /dev/null
@@ -1,44 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="godan_x5F__x5F_kana_x5F__x5F_support_x5F__x5F_popup_x5F__x5F_04"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="112px" height="112px"
- viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<circle id="style-keypopup-highlight_3_" style="fill-rule:evenodd;clip-rule:evenodd;fill:#F7982D;" cx="56.001" cy="56.001" r="22"/>
-<g id="style-keyicon-main">
- <path d=""/>
-</g>
-<g id="style-keyicon-main_1_">
- <path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__popup__05.svg b/src/data/images/android/svg/godan__kana__support__popup__05.svg
deleted file mode 100644
index cc38b5f..0000000
--- a/src/data/images/android/svg/godan__kana__support__popup__05.svg
+++ /dev/null
@@ -1,50 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="godan_x5F__x5F_kana_x5F__x5F_support_x5F__x5F_popup_x5F__x5F_05"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="112px" height="112px"
- viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<circle id="style-keypopup-highlight_4_" style="fill-rule:evenodd;clip-rule:evenodd;fill:#F7982D;" cx="56" cy="56" r="22"/>
-<g id="style-keyicon-main">
- <path d=""/>
-</g>
-<g id="style-keyicon-main_1_">
- <path d=""/>
-</g>
-<g id="style-keyicon-main_2_">
- <path d=""/>
-</g>
-<g id="style-keyicon-main_3_">
- <path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__popup__06.svg b/src/data/images/android/svg/godan__kana__support__popup__06.svg
deleted file mode 100644
index 51ff735..0000000
--- a/src/data/images/android/svg/godan__kana__support__popup__06.svg
+++ /dev/null
@@ -1,53 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="godan_x5F__x5F_kana_x5F__x5F_support_x5F__x5F_popup_x5F__x5F_06"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="112px" height="112px"
- viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<circle id="style-keypopup-highlight_5_" style="fill-rule:evenodd;clip-rule:evenodd;fill:#F7982D;" cx="56" cy="56" r="22"/>
-<g id="style-keyicon-main">
- <path d=""/>
-</g>
-<g id="style-keyicon-main_1_">
- <path d=""/>
-</g>
-<g id="style-keyicon-main_2_">
- <path d=""/>
-</g>
-<g id="style-keyicon-main_3_">
- <path d=""/>
-</g>
-<g id="style-keyicon-main_4_">
- <path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__popup__07.svg b/src/data/images/android/svg/godan__kana__support__popup__07.svg
deleted file mode 100644
index fb644d6..0000000
--- a/src/data/images/android/svg/godan__kana__support__popup__07.svg
+++ /dev/null
@@ -1,44 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="godan_x5F__x5F_kana_x5F__x5F_support_x5F__x5F_popup_x5F__x5F_07"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="112px" height="112px"
- viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<circle id="style-keypopup-highlight_6_" style="fill-rule:evenodd;clip-rule:evenodd;fill:#F7982D;" cx="56.001" cy="56.001" r="22"/>
-<g id="style-keyicon-main">
- <path d=""/>
-</g>
-<g id="style-keyicon-main_1_">
- <path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__popup__08.svg b/src/data/images/android/svg/godan__kana__support__popup__08.svg
deleted file mode 100644
index 5475fc0..0000000
--- a/src/data/images/android/svg/godan__kana__support__popup__08.svg
+++ /dev/null
@@ -1,50 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="godan_x5F__x5F_kana_x5F__x5F_support_x5F__x5F_popup_x5F__x5F_08"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="112px" height="112px"
- viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<circle id="style-keypopup-highlight_7_" style="fill-rule:evenodd;clip-rule:evenodd;fill:#F7982D;" cx="56" cy="56" r="22"/>
-<g id="style-keyicon-main">
- <path d=""/>
-</g>
-<g id="style-keyicon-main_1_">
- <path d=""/>
-</g>
-<g id="style-keyicon-main_2_">
- <path d=""/>
-</g>
-<g id="style-keyicon-main_3_">
- <path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__popup__09.svg b/src/data/images/android/svg/godan__kana__support__popup__09.svg
deleted file mode 100644
index 784d3ad..0000000
--- a/src/data/images/android/svg/godan__kana__support__popup__09.svg
+++ /dev/null
@@ -1,53 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="godan_x5F__x5F_kana_x5F__x5F_support_x5F__x5F_popup_x5F__x5F_09_1_"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="112px" height="112px"
- viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<circle id="style-keypopup-highlight_8_" style="fill-rule:evenodd;clip-rule:evenodd;fill:#F7982D;" cx="56" cy="56" r="22"/>
-<g id="style-keyicon-main">
- <path d=""/>
-</g>
-<g id="style-keyicon-main_1_">
- <path d=""/>
-</g>
-<g id="style-keyicon-main_2_">
- <path d=""/>
-</g>
-<g id="style-keyicon-main_3_">
- <path d=""/>
-</g>
-<g id="style-keyicon-main_4_">
- <path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__popup__10.svg b/src/data/images/android/svg/godan__kana__support__popup__10.svg
deleted file mode 100644
index ca38d66..0000000
--- a/src/data/images/android/svg/godan__kana__support__popup__10.svg
+++ /dev/null
@@ -1,41 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="godan_x5F__x5F_kana_x5F__x5F_support_x5F__x5F_popup_x5F__x5F_10"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="112px" height="112px"
- viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<circle id="style-keypopup-highlight_9_" style="fill-rule:evenodd;clip-rule:evenodd;fill:#F7982D;" cx="56.001" cy="56.001" r="22"/>
-<g id="style-keyicon-main">
- <path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__popup__11.svg b/src/data/images/android/svg/godan__kana__support__popup__11.svg
deleted file mode 100644
index b7a499f..0000000
--- a/src/data/images/android/svg/godan__kana__support__popup__11.svg
+++ /dev/null
@@ -1,53 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="godan_x5F__x5F_kana_x5F__x5F_support_x5F__x5F_popup_x5F__x5F_11"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="112px" height="112px"
- viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<circle id="style-keypopup-highlight_10_" style="fill-rule:evenodd;clip-rule:evenodd;fill:#F7982D;" cx="56.001" cy="56.001" r="22"/>
-<g id="style-keyicon-main">
- <path d=""/>
-</g>
-<g id="style-keyicon-main_1_">
- <path d=""/>
-</g>
-<g id="style-keyicon-main_2_">
- <path d=""/>
-</g>
-<g id="style-keyicon-main_3_">
- <path d=""/>
-</g>
-<g id="style-keyicon-main_4_">
- <path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__popup__12.svg b/src/data/images/android/svg/godan__kana__support__popup__12.svg
deleted file mode 100644
index 8e13053..0000000
--- a/src/data/images/android/svg/godan__kana__support__popup__12.svg
+++ /dev/null
@@ -1,53 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="godan_x5F__x5F_kana_x5F__x5F_support_x5F__x5F_popup_x5F__x5F_12"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="112px" height="112px"
- viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<circle id="style-keypopup-highlight_11_" style="fill-rule:evenodd;clip-rule:evenodd;fill:#F7982D;" cx="56" cy="56" r="22"/>
-<g id="style-keyicon-main">
- <path d=""/>
-</g>
-<g id="style-keyicon-main_1_">
- <path d=""/>
-</g>
-<g id="style-keyicon-main_2_">
- <path d=""/>
-</g>
-<g id="style-keyicon-main_3_">
- <path d=""/>
-</g>
-<g id="style-keyicon-main_4_">
- <path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__popup__13.svg b/src/data/images/android/svg/godan__kana__support__popup__13.svg
deleted file mode 100644
index 41326f4..0000000
--- a/src/data/images/android/svg/godan__kana__support__popup__13.svg
+++ /dev/null
@@ -1,41 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="godan_x5F__x5F_kana_x5F__x5F_support_x5F__x5F_popup_x5F__x5F_13"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="112px" height="112px"
- viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<circle id="style-keypopup-highlight_12_" style="fill-rule:evenodd;clip-rule:evenodd;fill:#F7982D;" cx="56.001" cy="56.001" r="22"/>
-<g id="style-keyicon-main">
- <path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/godan__kana__support__popup__15.svg b/src/data/images/android/svg/godan__kana__support__popup__15.svg
deleted file mode 100644
index b9e5fac..0000000
--- a/src/data/images/android/svg/godan__kana__support__popup__15.svg
+++ /dev/null
@@ -1,50 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="godan_x5F__x5F_kana_x5F__x5F_support_x5F__x5F_popup_x5F__x5F_15"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="112px" height="112px"
- viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<circle id="style-keypopup-highlight_13_" style="fill-rule:evenodd;clip-rule:evenodd;fill:#F7982D;" cx="56" cy="56" r="22"/>
-<g id="style-keyicon-main">
- <path d=""/>
-</g>
-<g id="style-keyicon-main_1_">
- <path d=""/>
-</g>
-<g id="style-keyicon-main_2_">
- <path d=""/>
-</g>
-<g id="style-keyicon-main_3_">
- <path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/hardware__function__close.svg b/src/data/images/android/svg/hardware__function__close.svg
index fd13730..9262ef0 100644
--- a/src/data/images/android/svg/hardware__function__close.svg
+++ b/src/data/images/android/svg/hardware__function__close.svg
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!--
Copyright 2010-2014, Google Inc.
All rights reserved.
@@ -30,29 +30,15 @@
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-->
<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="hardware_x5F__x5F_function_x5F__x5F_close"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="64px" height="40px"
- viewBox="0 0 64 40" style="enable-background:new 0 0 64 40;" xml:space="preserve">
-<path id="" style="fill:#DDDDDC;" d="M50,32.147H14c-0.276,0-0.5-0.223-0.5-0.5V8.353
- c0-0.276,0.224-0.5,0.5-0.5h36c0.276,0,0.5,0.224,0.5,0.5v23.295C50.5,31.925,50.276,32.147,50,32.147z M14.5,31.147h35V8.853h-35
- V31.147z"/>
-<g id="style-keyicon-function">
- <g>
- <g>
- <rect x="19.753" y="11.458" style="fill-rule:evenodd;clip-rule:evenodd;fill:#DDDDDC;" width="4.341" height="4.658"/>
- <rect x="19.753" y="17.671" style="fill-rule:evenodd;clip-rule:evenodd;fill:#DDDDDC;" width="4.341" height="4.66"/>
- <rect x="19.753" y="23.882" style="fill-rule:evenodd;clip-rule:evenodd;fill:#DDDDDC;" width="4.341" height="4.66"/>
- <rect x="32.708" y="11.458" style="fill-rule:evenodd;clip-rule:evenodd;fill:#DDDDDC;" width="4.339" height="4.658"/>
- <rect x="32.708" y="17.671" style="fill-rule:evenodd;clip-rule:evenodd;fill:#DDDDDC;" width="4.339" height="4.66"/>
- <rect x="32.708" y="23.882" style="fill-rule:evenodd;clip-rule:evenodd;fill:#DDDDDC;" width="4.339" height="4.66"/>
- <rect x="26.247" y="11.458" style="fill-rule:evenodd;clip-rule:evenodd;fill:#DDDDDC;" width="4.307" height="4.658"/>
- <rect x="26.247" y="17.671" style="fill-rule:evenodd;clip-rule:evenodd;fill:#DDDDDC;" width="4.307" height="4.66"/>
- <rect x="26.247" y="23.882" style="fill-rule:evenodd;clip-rule:evenodd;fill:#DDDDDC;" width="4.307" height="4.66"/>
- <rect x="39.201" y="11.458" style="fill-rule:evenodd;clip-rule:evenodd;fill:#DDDDDC;" width="4.305" height="4.658"/>
- <rect x="39.201" y="17.671" style="fill-rule:evenodd;clip-rule:evenodd;fill:#DDDDDC;" width="4.305" height="4.66"/>
- <rect x="39.201" y="23.882" style="fill-rule:evenodd;clip-rule:evenodd;fill:#DDDDDC;" width="4.305" height="4.66"/>
- </g>
- </g>
-</g>
+<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ version="1.1"
+ width="68px"
+ height="56px">
+ <!-- Original size: 64 x 40 -->
+ <g transform="matrix(1.4,0,0,1.4,-10.8,0)">
+ <path id="style-keyicon-twelvekeys-function" d="m44.95005,16.300191-3.699804,0,0-3.699805,3.699804,0,0,3.699805zm0,5.549951-3.699804,0,0-3.699804,3.699804,0,0,3.699804zm-5.549951-5.549951-3.699804,0,0-3.699805,3.699804,0,0,3.699805zm0,5.549951-3.699804,0,0-3.699804,3.699804,0,0,3.699804zm0,7.400098-14.800195,0,0-3.699805,14.800195,0,0,3.699805zm-16.649853-12.950049-3.699805,0,0-3.699805,3.699805,0,0,3.699805zm0,5.549951-3.699805,0,0-3.699804,3.699805,0,0,3.699804zm1.849658-3.700293,3.699804,0,0,3.699804-3.699804,0,0-3.699804zm0-5.549951,3.699804,0,0,3.699804-3.699804,0,0-3.699804zm5.549951,5.549951,3.699804,0,0,3.699804-3.699804,0,0-3.699804zm0-5.549951,3.699804,0,0,3.699804-3.699804,0,0-3.699804zm16.650342-5.5499514-29.600391,0c-2.043176,0-3.680746,1.6566289-3.680746,3.6998044l-0.01906,18.500489c0,2.043175,1.656629,3.699804,3.699805,3.699804h29.600391c2.043175,0,3.699804-1.656629,3.699804-3.699804v-18.500489c0-2.0431755-1.656629-3.6998044-3.699804-3.6998044" fill-rule="nonzero" style="fill:#37474f"/>
+ </g>
</svg>
diff --git a/src/data/images/android/svg/keyboard_fold_tab_background_default.svg b/src/data/images/android/svg/keyboard_fold_tab_background_default.svg
new file mode 100644
index 0000000..db12913
--- /dev/null
+++ b/src/data/images/android/svg/keyboard_fold_tab_background_default.svg
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg id="svg3664" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="120" width="120" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <metadata id="metadata3669">
+ <rdf:RDF>
+ <cc:Work rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+ <dc:title/>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <path id="style-keyboard-folding-button-background-default" opacity="0.55" fill="#676767" d="M0,29.11464c0-16.01304,13.101495-29.11464,29.114433-29.11464h61.771127c16.01295,0,29.11444,13.1016,29.11444,29.11464v61.77096c0,16.01304-13.10149,29.1144-29.11444,29.1144h-61.771127c-16.012938,0-29.114433-13.10136-29.114433-29.1144v-61.77096z"/>
+</svg>
diff --git a/src/data/images/android/svg/keyboard_fold_tab_background_scrolled.svg b/src/data/images/android/svg/keyboard_fold_tab_background_scrolled.svg
new file mode 100644
index 0000000..cb59962
--- /dev/null
+++ b/src/data/images/android/svg/keyboard_fold_tab_background_scrolled.svg
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg id="svg3664" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="120" width="120" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <metadata id="metadata3669">
+ <rdf:RDF>
+ <cc:Work rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+ <dc:title/>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <path id="style-keyboard-folding-button-background-scrolled" opacity="0.55" fill="#676767" d="M0,29.11464c0-16.01304,13.101495-29.11464,29.114433-29.11464h61.771127c16.01295,0,29.11444,13.1016,29.11444,29.11464v61.77096c0,16.01304-13.10149,29.1144-29.11444,29.1144h-61.771127c-16.012938,0-29.114433-13.10136-29.114433-29.1144v-61.77096z"/>
+</svg>
diff --git a/src/data/images/android/svg/keyboard_fold_tab_down.svg b/src/data/images/android/svg/keyboard_fold_tab_down.svg
index d5a34ec..4680d55 100644
--- a/src/data/images/android/svg/keyboard_fold_tab_down.svg
+++ b/src/data/images/android/svg/keyboard_fold_tab_down.svg
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!--
Copyright 2010-2014, Google Inc.
All rights reserved.
@@ -29,13 +29,16 @@
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve">
-<g id="style-keyboard-folding-button-background" style="opacity:0.55;">
- <path style="fill:#676767;" d=""/>
-</g>
-<polygon style="fill:#FFFFFF;" points="8.007,11.904 11.968,7.941 10.862,6.835 8.79,8.907 8.79,4.096 7.226,4.096 7.226,8.923
- 5.138,6.836 4.03,7.941 "/>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg id="svg3664" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="120" width="120" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <metadata id="metadata3669">
+ <rdf:RDF>
+ <cc:Work rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+ <dc:title/>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <path id="style-keyicon-twelvekeys-function" fill-rule="nonzero" fill="#000" d="M59.650003,78.890867,90.138331,48.400866,82.848332,41.109133,59.375002,64.582467,36.388335,41.595799,29.861669,48.1242"/>
</svg>
diff --git a/src/data/images/android/svg/keyboard_fold_tab_up.svg b/src/data/images/android/svg/keyboard_fold_tab_up.svg
index 15b4187..6dff134 100644
--- a/src/data/images/android/svg/keyboard_fold_tab_up.svg
+++ b/src/data/images/android/svg/keyboard_fold_tab_up.svg
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!--
Copyright 2010-2014, Google Inc.
All rights reserved.
@@ -29,13 +29,16 @@
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve">
-<g id="style-keyboard-folding-button-background" style="opacity:0.55;">
- <path style="fill:#676767;" d=""/>
-</g>
-<polygon style="fill:#FFFFFF;" points="7.993,4.096 4.032,8.059 5.138,9.165 7.21,7.093 7.21,11.905 8.774,11.905 8.774,7.077
- 10.862,9.164 11.97,8.059 "/>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg id="svg3664" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="120" width="120" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <metadata id="metadata3669">
+ <rdf:RDF>
+ <cc:Work rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+ <dc:title/>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <path id="style-keyicon-twelvekeys-function" fill-rule="nonzero" fill="#000" d="m59.650003,41.109133,30.488328,30.49-7.289999,7.291734l-23.47333-23.473333-22.986667,22.986666-6.526666-6.528401"/>
</svg>
diff --git a/src/data/images/android/svg/magnifier.svg b/src/data/images/android/svg/magnifier.svg
deleted file mode 100644
index 4052d81..0000000
--- a/src/data/images/android/svg/magnifier.svg
+++ /dev/null
@@ -1,43 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!--
-Preprocesses for this file;
-- Imported .ai file into Inkscape.
-- Combine all pathes into one (Path > Combine).
-- Export as optimized .svg.
-- Removed following elements manually.
- - metadata
- - defs
-- Removed ignorable <g> elements.
-- Added id attribute.
--->
-<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" xml:space="preserve" height="123.94037" width="126.05875" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/"><g transform="matrix(1.25,0,0,-1.25,0,123.94037)"><g transform="translate(29.0244,46.3398)"><path id="" fill-rule="nonzero" fill="#373535" d="m0,0c-7.104,7.109-7.104,18.632,0,25.736,7.109,7.109,18.623,7.103,25.734,0,7.105-7.104,7.105-18.623,0-25.736-7.111-7.104-18.63-7.104-25.734,0m53.585-18.533-12.165,12.168c-1.07,1.068-3.008,0.967-4.95-0.045l-5.308,5.305c6.914,9.032,6.262,22.001-2.002,30.267-8.999,8.995-23.588,8.995-32.588,0-8.994-9-8.994-23.589,0-32.588,8.269-8.263,21.237-8.916,30.271-2l5.305-5.304c-1.011-1.946-1.115-3.881-0.046-4.952l12.166-12.168c1.537-1.535,4.875-0.691,7.44,1.883,2.571,2.569,3.416,5.899,1.877,7.434"/></g></g></svg>
diff --git a/src/data/images/android/svg/microphone.svg b/src/data/images/android/svg/microphone.svg
new file mode 100644
index 0000000..96fdbfe
--- /dev/null
+++ b/src/data/images/android/svg/microphone.svg
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg id="svg3631" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="100" width="100" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <path id="style-keyicon-twelvekeys-function" fill-rule="nonzero" style="fill:#000" d="m71.178551,46.471336c0,12.211625-9.498462,22.535729-21.214942,22.535729-11.710514,0-21.140968-10.324104-21.140968-22.535729h-8.472375c0,15.285113,11.214174,29.288813,25.364628,31.269399l0.04057,13.908249h8.467602l0.03699-13.876035c14.163572-1.979393,25.389678-16.0165,25.389678-31.301613h-8.471183zm-21.177954,14.119431c6.601556,0,12.70558-5.831991,12.70558-12.705579v-26.827399c0-6.878361-6.104024-12.7067731-12.70558-12.7067731-6.60275,0-12.706773,5.8284121-12.706773,12.7067731v26.827399c0,6.873588,6.104023,12.705579,12.706773,12.705579"/>
+</svg>
diff --git a/src/data/images/android/svg/qwerty__caps_on.svg b/src/data/images/android/svg/qwerty__caps_on.svg
index 75faf0c..b51d2b2 100644
--- a/src/data/images/android/svg/qwerty__caps_on.svg
+++ b/src/data/images/android/svg/qwerty__caps_on.svg
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!--
Copyright 2010-2014, Google Inc.
All rights reserved.
@@ -29,17 +29,20 @@
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="qwerty_x5F__x5F_caps_x5F_on"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="70px" height="74px"
- viewBox="0 0 70 74" style="enable-background:new 0 0 70 74;" xml:space="preserve">
-<polygon id="style-keyicon-qwerty-caps-on-arrow" style="fill:#C1F300;" points="38.032,58 38.032,49.299 42.5,49.299 42.5,48.2
- 34.065,38 33.766,38 25.5,48.334 25.767,49.299 29.966,49.299 29.966,58 "/>
-<g id="style-keyicon-function">
- <path style="fill:#DDDDDD;" d=""/>
- <path style="fill:#DDDDDD;" d=""/>
- <path style="fill:#DDDDDD;" d=""/>
- <path style="fill:#DDDDDD;" d=""/>
-</g>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ version="1.1"
+ width="68"
+ height="56">
+ <!-- Original size: 90 x 90 and matrix(0.98633121,0,0,1.0114943,29.865734,38.1287) -->
+ <g transform="matrix(0.535680,0,0,-0.549346,25.6399,24.2682)">
+ <path id="style-keyicon-qwerty-shift-on-arrow_0" d="m0,0,0-18.25,30.25,0,0,18.25,21.125-0.062-36.5,36.187l-35.562-36.063,20.687-0.062z" fill-rule="nonzero" style="fill:#000"/>
+ </g>
+ <!-- Original size: 90 x 90 -->
+ <g transform="matrix(0.543103,0,0,0.543103,9.41972,3.56034)">
+ <path id="style-keyicon-qwerty-shift-on-arrow_1" d="m20.946452,82.85799,48.107096,0,0,5.10709-48.107096,0,0-5.10709z" stroke-width="0.89290297" style="fill:#000; stroke:#000;"/>
+ </g>
</svg>
diff --git a/src/data/images/android/svg/qwerty__function__alphabet__icon.svg b/src/data/images/android/svg/qwerty__function__alphabet__icon.svg
index cb252ae..abcfc42 100644
--- a/src/data/images/android/svg/qwerty__function__alphabet__icon.svg
+++ b/src/data/images/android/svg/qwerty__function__alphabet__icon.svg
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!--
Copyright 2010-2014, Google Inc.
All rights reserved.
@@ -29,15 +29,19 @@
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="qwerty_x5F__x5F_function_x5F__x5F_alphabet_x5F__x5F_icon"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="70px" height="74px"
- viewBox="0 0 70 74" style="enable-background:new 0 0 70 74;" xml:space="preserve">
-<g id="style-keyicon-function-dark_1_">
- <path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-function">
- <path style="fill:#DDDDDD;" d=""/>
-</g>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ version="1.1"
+ width="68"
+ height="56">
+ <!-- Original size: 68 x 56 -->
+ <g transform="matrix(0.78,0,0,0.78,7.98,2.70)">
+ <path id="style-keyicon-function-dark" opacity="0.5" d="m16.555652,31.63854c-1.310925,0-2.715213,0.189612-4.2119,0.561137v3.650763l-0.420613,4.632512c1.870138-2.246475,3.41495-5.194612,4.632513-8.844412m-6.7384625,10.809837c-0.28105-1.590049-0.421575-3.881762-0.421575-6.878987v-2.387c-3.93085,1.965425-5.896275,4.49295-5.896275,7.581612,0,0.842188,0.3031875,1.614113,0.91245,2.315775,0.6073375,0.702626,1.2397,1.052975,1.8951625,1.052975,1.0289125,0,2.19835-0.561137,3.5102375-1.684375m5.7557495,6.0368c-0.28105-1.030837-0.656425-2.05975-1.123237-3.088662,7.392962-0.466813,11.090887-2.807612,11.090887-7.019512,0-3.180101-2.01355-5.286051-6.0368-6.316888-1.779662,5.148413-3.93085,8.938737-6.457412,11.370975-2.527525,2.435125-4.868325,3.6498-7.0195125,3.6498-1.4986125,0-2.785475-0.5852-3.8605875-1.754638-1.078-1.168475-1.615075-2.643025-1.615075-4.421725,0-4.865437,2.9481375-8.469037,8.8444125-10.809837,0-1.685338,0.0462-3.275388,0.140525-4.774h-7.58065v-3.0877c1.1232375,0.18865,2.6670875,0.280087,4.6325125,0.280087,0.9345875,0,2.011625-0.04524,3.2291875-0.140525,0-0.652575,0.140525-2.010662,0.4206125-4.070412l3.088662,0.139562-0.420612,3.791288,13.195875-0.28105,0.140525,2.948137-13.61745,0.420613c-0.09433,0.84315-0.140525,2.10595-0.140525,3.791287,1.309-0.28105,2.527525-0.421575,3.6498-0.421575,0.186725,0,0.607337,0.04909,1.263762,0.140525,0.0924-0.372487,0.186725-0.934587,0.28105-1.684375l3.088663,0.701663c0,0.18865-0.140525,0.656425-0.421575,1.403325,5.708587,1.404287,8.563363,4.49295,8.563363,9.265987,0,2.621851-0.982713,4.751863-2.948138,6.388113s-5.4285,2.82975-10.388263,3.579537" fill-rule="nonzero" fill="#000"/>
+ </g>
+ <g transform="matrix(0.76,0,0,0.76,7.66,6.72)">
+ <path id="style-keyicon-qwerty-function" opacity="0.80000299" d="m48.39496,43.654486c3.3418,0,5.607525-0.836413,8.053237-2.422613,2.445713-1.5862,3.682525-3.721025,4.55455-6.214862l0.0087-6.451638-9.010925-0.01829c-3.536225,0-5.826975,0.34265-8.12735,2.0251-2.301338,1.683412-3.239775,3.52275-3.239775,5.895312,0,2.229151,0.615037,3.805725,2.080925,5.160925,1.464925,1.356163,3.113688,2.026063,5.680675,2.026063m13.893687,3.716212c-0.282012-1.232962-0.537075-1.981787-0.7392-2.963537-0.205012-0.999075-0.290675-1.807575-0.290675-2.849-1.356162,2.131937-2.727725,3.094437-5.173437,4.486212-2.446675,1.392738-5.25525,2.088625-8.42765,2.088625-3.85,0-6.834713-1.022175-8.954138-3.069412-2.118462-2.045313-3.178175-4.82405-3.178175-8.33525s1.537113-6.594088,4.613263-8.77415c3.075187-2.1791,7.070525-3.26865,11.986975-3.26865h8.904087l-0.02695-4.443863c0-2.808575-0.668937-4.671012-2.4486-6.269725-1.780625-1.59775-3.456337-2.233-6.4218-2.253212-2.673825-0.01829-4.860625,0.389812-6.689375,1.843187-1.82875,1.452413-3.003962,3.119463-3.003962,5.322625l-4.803838,0.02021,0.0058-0.2387c-0.145399-2.953907,1.001901-5.550732,3.678613-7.791432,2.674788-2.239737,6.397738-3.360087,10.708775-3.360087,4.310075,0,7.77315,1.1020625,10.388263,3.305225,2.616075,2.204125,3.720062,5.160925,3.720062,9.277537l-0.0058,19.32315c0,1.380226,0.287788,2.755638,0.445638,4.063675,0.156888,1.307075,0.509162,2.603563,0.872025,3.886575h-5.159963z" fill-rule="nonzero" fill="#000"/>
+ </g>
</svg>
diff --git a/src/data/images/android/svg/qwerty__function__alphabet__popup.svg b/src/data/images/android/svg/qwerty__function__alphabet__popup.svg
deleted file mode 100644
index 92ab3bb..0000000
--- a/src/data/images/android/svg/qwerty__function__alphabet__popup.svg
+++ /dev/null
@@ -1,43 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="qwerty_x5F__x5F_function_x5F__x5F_alphabet_x5F__x5F_popup"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="70px" height="74px"
- viewBox="0 0 70 74" style="enable-background:new 0 0 70 74;" xml:space="preserve">
-<g id="style-keyicon-popup-function-dark_1_">
- <path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-popup-function">
- <path style="fill:#DDDDDD;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__function__alt__alted_icon.svg b/src/data/images/android/svg/qwerty__function__alt__alted_icon.svg
new file mode 100644
index 0000000..8d320aa
--- /dev/null
+++ b/src/data/images/android/svg/qwerty__function__alt__alted_icon.svg
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<svg version="1.1"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ width="68"
+ height="56">
+ <text id="style-keyicon-qwerty-function" x="13" y="28" style="font-size:30px;text-anchor:middle;dominant-baseline:central;">?</text>
+ <text id="style-keyicon-qwerty-function" x="26.8" y="28" style="font-size:30px;text-anchor:middle;dominant-baseline:central;">1</text>
+ <text id="style-keyicon-qwerty-function" x="39.3" y="28" style="font-size:30px;text-anchor:middle;dominant-baseline:central;">2</text>
+ <text id="style-keyicon-qwerty-function" x="54.5" y="28" style="font-size:30px;text-anchor:middle;dominant-baseline:central;">3</text>
+</svg>
diff --git a/src/data/images/android/svg/qwerty__function__alt__base_icon.svg b/src/data/images/android/svg/qwerty__function__alt__base_icon.svg
new file mode 100644
index 0000000..77798a0
--- /dev/null
+++ b/src/data/images/android/svg/qwerty__function__alt__base_icon.svg
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ width="68px"
+ height="56px">
+ <text id="style-keyicon-qwerty-function" x="34" y="28" style="font-size:30px;text-anchor:middle;dominant-baseline:central;">= \ <</text>
+</svg>
diff --git a/src/data/images/android/svg/qwerty__function__alt__icon.svg b/src/data/images/android/svg/qwerty__function__alt__icon.svg
deleted file mode 100644
index 3d385ad..0000000
--- a/src/data/images/android/svg/qwerty__function__alt__icon.svg
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="qwerty_x5F__x5F_function_x5F__x5F_alt_x5F__x5F_icon"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="70px" height="74px"
- viewBox="0 0 70 74" style="enable-background:new 0 0 70 74;" xml:space="preserve">
-<g id="style-keyicon-function">
- <path style="fill:#DDDDDD;" d=""/>
- <path style="fill:#DDDDDD;" d=""/>
- <path style="fill:#DDDDDD;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__function__comma.svg b/src/data/images/android/svg/qwerty__function__comma.svg
index 95f2fe3..8e0877a 100644
--- a/src/data/images/android/svg/qwerty__function__comma.svg
+++ b/src/data/images/android/svg/qwerty__function__comma.svg
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
<!--
Copyright 2010-2014, Google Inc.
All rights reserved.
@@ -30,10 +30,7 @@
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-->
<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-function" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
- x="0px" y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g id="shadow_1_">
- <path style="fill:#DDDDDD;" d=""/>
-</g>
+<svg version="1.1" id="style-keyicon-qwerty-function" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
+ x="0px" y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
+ <text x="24" y="36" style="font-size:50px;text-anchor:middle;dominant-baseline:central;fill:#DDDDDD;">,</text>
</svg>
diff --git a/src/data/images/android/svg/qwerty__function__commercial_at.svg b/src/data/images/android/svg/qwerty__function__commercial_at.svg
index 586c8f7..56de7ca 100644
--- a/src/data/images/android/svg/qwerty__function__commercial_at.svg
+++ b/src/data/images/android/svg/qwerty__function__commercial_at.svg
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
<!--
Copyright 2010-2014, Google Inc.
All rights reserved.
@@ -30,10 +30,7 @@
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-->
<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-function" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#DDDDDD;" d=""/>
-</g>
+<svg version="1.1" id="style-keyicon-qwerty-function" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
+ x="0px" y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
+ <text x="24" y="30" style="font-size:50px;text-anchor:middle;dominant-baseline:central;fill:#DDDDDD;">@</text>
</svg>
diff --git a/src/data/images/android/svg/qwerty__function__cursor__icon.svg b/src/data/images/android/svg/qwerty__function__cursor__icon.svg
deleted file mode 100644
index e290393..0000000
--- a/src/data/images/android/svg/qwerty__function__cursor__icon.svg
+++ /dev/null
@@ -1,41 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="qwerty_x5F__x5F_function_x5F__x5F_cursor_x5F__x5F_icon"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="70px" height="74px"
- viewBox="0 0 70 74" style="enable-background:new 0 0 70 74;" xml:space="preserve">
-<polygon id="style-keyicon-function_17_" style="fill-rule:evenodd;clip-rule:evenodd;fill:#DDDDDD;" points="47.881,35.445
- 39.029,29.5 38.236,30.226 38.236,41.6 38.961,42.358 47.947,36.343 "/>
-<polygon id="style-keyicon-function_16_" style="fill-rule:evenodd;clip-rule:evenodd;fill:#DDDDDD;" points="20.087,35.516
- 28.937,29.5 29.732,30.226 29.732,41.737 29.006,42.5 20.052,36.414 "/>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__function__delete__icon.svg b/src/data/images/android/svg/qwerty__function__delete__icon.svg
deleted file mode 100644
index eaf8822..0000000
--- a/src/data/images/android/svg/qwerty__function__delete__icon.svg
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="qwerty_x5F__x5F_function_x5F__x5F_delete_x5F__x5F_icon"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="70px" height="74px"
- viewBox="0 0 70 74" style="enable-background:new 0 0 70 74;" xml:space="preserve">
-<path id="" style="fill-rule:evenodd;clip-rule:evenodd;fill:#DDDDDD;" d="M42.434,38.667l-1.797,1.766
- l-2.702-2.666l-2.7,2.666l-1.801-1.766l2.7-2.667l-2.7-2.667l1.801-1.766l2.7,2.666l2.702-2.666l1.797,1.8L39.735,36L42.434,38.667z
- M27.233,24v0.066h-0.034L15,36.033L27.199,48l0.034-0.032V48h23.769L53,46.034V26.067L51.034,24H27.233z"/>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__function__delete__popup.svg b/src/data/images/android/svg/qwerty__function__delete__popup.svg
deleted file mode 100644
index 8c596f0..0000000
--- a/src/data/images/android/svg/qwerty__function__delete__popup.svg
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="qwerty_x5F__x5F_function_x5F__x5F_delete_x5F__x5F_popup"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="70px" height="74px"
- viewBox="0 0 70 74" style="enable-background:new 0 0 70 74;" xml:space="preserve">
-<path id="" style="fill-rule:evenodd;clip-rule:evenodd;fill:#DDDDDD;" d="M42.434,38.667
- l-1.797,1.766l-2.702-2.666l-2.7,2.666l-1.801-1.766l2.7-2.667l-2.7-2.667l1.801-1.766l2.7,2.666l2.702-2.666l1.797,1.8L39.735,36
- L42.434,38.667z M27.233,24v0.066h-0.034L15,36.033L27.199,48l0.034-0.032V48h23.769L53,46.034V26.067L51.034,24H27.233z"/>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__function__enter__icon.svg b/src/data/images/android/svg/qwerty__function__enter__icon.svg
deleted file mode 100644
index 46a54d2..0000000
--- a/src/data/images/android/svg/qwerty__function__enter__icon.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="qwerty_x5F__x5F_function_x5F__x5F_enter_x5F__x5F_icon"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="70px" height="74px"
- viewBox="0 0 70 74" style="enable-background:new 0 0 70 74;" xml:space="preserve">
-<polygon id="style-keyicon-function_12_" style="fill:#DDDDDD;" points="43.026,21.421 43.026,34.398 40.99,36.501 32.147,36.501
- 32.147,30.596 30.647,30.596 17,40.472 17,40.871 30.848,50.579 32.147,50.579 32.147,44.541 49.028,44.541 51,42.439 51,21.421 "/>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__function__enter__popup.svg b/src/data/images/android/svg/qwerty__function__enter__popup.svg
deleted file mode 100644
index 5e7c63f..0000000
--- a/src/data/images/android/svg/qwerty__function__enter__popup.svg
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="qwerty_x5F__x5F_function_x5F__x5F_enter_x5F__x5F_popup"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="70px" height="74px"
- viewBox="0 0 70 74" style="enable-background:new 0 0 70 74;" xml:space="preserve">
-<polygon id="style-keyicon-popup-function_9_" style="fill:#DDDDDD;" points="43.026,21.421 43.026,34.398 40.99,36.502
- 32.147,36.502 32.147,30.596 30.647,30.596 17,40.472 17,40.871 30.848,50.579 32.147,50.579 32.147,44.541 49.028,44.541
- 51,42.439 51,21.421 "/>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__function__exclamation_mark.svg b/src/data/images/android/svg/qwerty__function__exclamation_mark.svg
new file mode 100644
index 0000000..5542765
--- /dev/null
+++ b/src/data/images/android/svg/qwerty__function__exclamation_mark.svg
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<svg version="1.1" id="style-keyicon-qwerty-function" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
+ x="0px" y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
+ <text x="24" y="36" style="font-size:50px;text-anchor:middle;dominant-baseline:central;fill:#DDDDDD;">!</text>
+</svg>
diff --git a/src/data/images/android/svg/qwerty__function__full_stop.svg b/src/data/images/android/svg/qwerty__function__full_stop.svg
index 95f2fe3..5666f7a 100644
--- a/src/data/images/android/svg/qwerty__function__full_stop.svg
+++ b/src/data/images/android/svg/qwerty__function__full_stop.svg
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
<!--
Copyright 2010-2014, Google Inc.
All rights reserved.
@@ -30,10 +30,7 @@
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-->
<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-function" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
- x="0px" y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g id="shadow_1_">
- <path style="fill:#DDDDDD;" d=""/>
-</g>
+<svg version="1.1" id="style-keyicon-qwerty-function" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
+ x="0px" y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
+ <text x="24" y="36" style="font-size:50px;text-anchor:middle;dominant-baseline:central;fill:#DDDDDD;">.</text>
</svg>
diff --git a/src/data/images/android/svg/qwerty__function__ideographic_comma.svg b/src/data/images/android/svg/qwerty__function__ideographic_comma.svg
index d2e1c06..b290f58 100644
--- a/src/data/images/android/svg/qwerty__function__ideographic_comma.svg
+++ b/src/data/images/android/svg/qwerty__function__ideographic_comma.svg
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
<!--
Copyright 2010-2014, Google Inc.
All rights reserved.
@@ -30,10 +30,7 @@
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-->
<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g id="style-keyicon-function_1_">
- <path style="fill:#DDDDDD;" d=""/>
-</g>
+<svg version="1.1" id="style-keyicon-qwerty-function" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
+ x="0px" y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
+ <text x="39" y="36" style="font-size:45px;text-anchor:middle;dominant-baseline:central;fill:#DDDDDD;">、</text>
</svg>
diff --git a/src/data/images/android/svg/qwerty__function__ideographic_full_stop.svg b/src/data/images/android/svg/qwerty__function__ideographic_full_stop.svg
index d2e1c06..e9a7afe 100644
--- a/src/data/images/android/svg/qwerty__function__ideographic_full_stop.svg
+++ b/src/data/images/android/svg/qwerty__function__ideographic_full_stop.svg
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
<!--
Copyright 2010-2014, Google Inc.
All rights reserved.
@@ -30,10 +30,7 @@
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-->
<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g id="style-keyicon-function_1_">
- <path style="fill:#DDDDDD;" d=""/>
-</g>
+<svg version="1.1" id="style-keyicon-qwerty-function" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
+ x="0px" y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
+ <text x="39" y="36" style="font-size:45px;text-anchor:middle;dominant-baseline:central;fill:#DDDDDD;">。</text>
</svg>
diff --git a/src/data/images/android/svg/qwerty__function__kana__icon.svg b/src/data/images/android/svg/qwerty__function__kana__icon.svg
index 9e4fd2c..b6668bc 100644
--- a/src/data/images/android/svg/qwerty__function__kana__icon.svg
+++ b/src/data/images/android/svg/qwerty__function__kana__icon.svg
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!--
Copyright 2010-2014, Google Inc.
All rights reserved.
@@ -29,15 +29,17 @@
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="qwerty_x5F__x5F_function_x5F__x5F_kana_x5F__x5F_icon"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="70px" height="74px"
- viewBox="0 0 70 74" style="enable-background:new 0 0 70 74;" xml:space="preserve">
-<g id="style-keyicon-function">
- <path style="fill:#DDDDDD;" d=""/>
-</g>
-<g id="style-keyicon-function-dark">
- <path style="fill:#272727;" d=""/>
-</g>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ version="1.1"
+ width="68"
+ height="56">
+ <!-- Original size: 68 x 56 -->
+ <g transform="matrix(0.78,0,0,0.78,7.48,6.16)">
+ <path id="style-keyicon-qwerty-function" opacity="0.80000299" d="m22.730855,25.555342c-1.826825,0-3.782625,0.262762-5.866438,0.782512v5.083925l-0.587125,6.453563c2.60645-3.129088,4.757638-7.235113,6.453563-12.32m-9.3863,15.05735c-0.391738-2.214713-0.587125-5.407325-0.587125-9.581687v-3.324476c-5.4756625,2.737351-8.2130125,6.257213-8.2130125,10.559588,0,1.173287,0.421575,2.249362,1.2714625,3.227263,0.8460375,0.9779,1.7257625,1.465887,2.639175,1.465887,1.4331625,0,3.061713-0.78155,4.8895-2.346575m8.017625,8.409362c-0.391738-1.436049-0.913412-2.869212-1.565025-4.302375,10.297788-0.65065,15.449087-3.910637,15.449087-9.778037,0-4.429425-2.804724-7.363125-8.4084-8.799175-2.478437,7.170625-5.475662,12.4509-8.995525,15.839862-3.519862,3.39185-6.780812,5.083925-9.778037,5.083925-2.0867,0-3.8808-0.815237-5.3774875-2.44475-1.5005375-1.62855-2.2493625-3.681562-2.2493625-6.159999,0-6.776001,4.1069875-11.797363,12.32-15.057351,0-2.346575,0.06449-4.56225,0.195387-6.64895h-10.559587v-4.302374c1.5640625,0.263725,3.71525,0.391737,6.4535625,0.391737,1.3012995,0,2.8018375-0.06449,4.4977625-0.195387,0-0.910525,0.195387-2.8028005,0.586162-5.6710505l4.302375,0.1953875-0.587125,5.279313,18.382788-0.390776,0.195387,4.106988-18.96895,0.586162c-0.1309,1.173288-0.195387,2.9337-0.195387,5.280275,1.823937-0.390775,3.519862-0.587125,5.083925-0.587125,0.260837,0,0.847,0.06834,1.760412,0.19635,0.128013-0.51975,0.259875-1.3013,0.390775-2.347537l4.302375,0.9779c0,0.263725-0.195387,0.913412-0.586162,1.9558,7.95025,1.9558,11.928262,6.258175,11.928262,12.907125,0,3.650762-1.368675,6.61815-4.106025,8.89735-2.738312,2.280163-7.562362,3.9424-14.471187,4.986712" fill-rule="nonzero" fill="#000"/>
+ <path id="style-keyicon-function-dark" opacity="0.5" d="m54.6385,41.755662c2.266688,0,3.802838-0.567875,5.462188-1.642988,1.65935-1.076075,2.497687-2.523675,3.088662-4.21575l0.0068-4.375525-6.111875-0.01251c-2.39855,0-3.952987,0.232925-5.512237,1.37445-1.561175,1.141526-2.197388,2.388926-2.197388,3.998226,0,1.511125,0.416763,2.580462,1.411025,3.49965,0.9933,0.92015,2.111725,1.37445,3.852888,1.37445m9.423799,2.520787c-0.191538-0.836412-0.364788-1.344612-0.501463-2.0097-0.139562-0.678562-0.197312-1.226225-0.197312-1.9327-0.92015,1.445675-1.849925,2.099213-3.509275,3.042463-1.65935,0.944212-3.564138,1.4168-5.715325,1.4168-2.612225,0-4.636363-0.693-6.073375-2.081888-1.437013-1.386962-2.156-3.2725-2.156-5.653725s1.04335-4.472738,3.129087-5.950175c2.085738-1.4784,4.796138-2.2176,8.130238-2.2176h6.038725l-0.01829-3.013588c0-1.90575-0.453337-3.16855-1.660312-4.252325-1.207938-1.083775-2.34465-1.514975-4.356275-1.52845-1.81335-0.01251-3.296563,0.264688-4.536263,1.250288-1.240662,0.984637-2.037612,2.114612-2.037612,3.609375l-3.258063,0.01444,0.0038-0.162662c-0.09914-2.002963,0.679525-3.764338,2.4948-5.284125,1.814313-1.518825,4.339913-2.2792,7.263988-2.2792,2.923112,0,5.271612,0.747862,7.0455,2.242625,1.773887,1.4938,2.522712,3.49965,2.522712,6.291862l-0.0038,13.105401c0,0.936512,0.195388,1.869175,0.302225,2.7566,0.106838,0.886462,0.345538,1.766187,0.591938,2.636287h-3.49965z" fill-rule="nonzero" fill="#000"/>
+ </g>
</svg>
diff --git a/src/data/images/android/svg/qwerty__function__kana__popup.svg b/src/data/images/android/svg/qwerty__function__kana__popup.svg
deleted file mode 100644
index 9f678de..0000000
--- a/src/data/images/android/svg/qwerty__function__kana__popup.svg
+++ /dev/null
@@ -1,43 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="qwerty_x5F__x5F_function_x5F__x5F_kana_x5F__x5F_popup"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="70px" height="74px"
- viewBox="0 0 70 74" style="enable-background:new 0 0 70 74;" xml:space="preserve">
-<g id="style-keyicon-popup-function">
- <path style="fill:#DDDDDD;" d=""/>
-</g>
-<g id="style-keyicon-popup-function-dark">
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__function__left_arrow__icon.svg b/src/data/images/android/svg/qwerty__function__left_arrow__icon.svg
new file mode 100644
index 0000000..59d3024
--- /dev/null
+++ b/src/data/images/android/svg/qwerty__function__left_arrow__icon.svg
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns="http://www.w3.org/2000/svg"
+ version="1.1"
+ width="48"
+ height="56">
+ <!-- Original: translate(-16,-15) -->
+ <g transform="matrix(0.984375,0,0,0.984375,-15.2,-14.2)">
+ <polygon id="style-keyicon-qwerty-function" points="48,52.035 46.798,53.238 32,43.684 32.101,42.245 46.731,32.762 48,33.931" fill="#DDD" fill-rule="evenodd"/>
+ </g>
+</svg>
diff --git a/src/data/images/android/svg/qwerty__function__number_alphabet__icon.svg b/src/data/images/android/svg/qwerty__function__number_alphabet__icon.svg
index 422ce28..a0280f7 100644
--- a/src/data/images/android/svg/qwerty__function__number_alphabet__icon.svg
+++ b/src/data/images/android/svg/qwerty__function__number_alphabet__icon.svg
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!--
Copyright 2010-2014, Google Inc.
All rights reserved.
@@ -29,18 +29,16 @@
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="qwerty_x5F__x5F_function_x5F__x5F_number_x5F_alphabet_x5F__x5F_icon"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="70px" height="74px"
- viewBox="0 0 70 74" style="enable-background:new 0 0 70 74;" xml:space="preserve">
-<g id="style-keyicon-function">
- <path style="fill:#DDDDDD;" d=""/>
- <path style="fill:#DDDDDD;" d=""/>
- <path style="fill:#DDDDDD;" d=""/>
-</g>
-<g id="style-keyicon-function_1_">
- <path style="fill:#DDDDDD;" d=""/>
- <path style="fill:#DDDDDD;" d=""/>
-</g>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ version="1.1"
+ width="68"
+ height="56">
+ <text id="style-keyicon-qwerty-function" x="13" y="28" style="font-size:30px;text-anchor:middle;dominant-baseline:central;">?</text>
+ <text id="style-keyicon-qwerty-function" x="26.8" y="28" style="font-size:30px;text-anchor:middle;dominant-baseline:central;">1</text>
+ <text id="style-keyicon-qwerty-function" x="39.3" y="28" style="font-size:30px;text-anchor:middle;dominant-baseline:central;">2</text>
+ <text id="style-keyicon-qwerty-function" x="54.5" y="28" style="font-size:30px;text-anchor:middle;dominant-baseline:central;">3</text>
</svg>
diff --git a/src/data/images/android/svg/qwerty__function__number_alphabet__popup.svg b/src/data/images/android/svg/qwerty__function__number_alphabet__popup.svg
deleted file mode 100644
index 3be07b5..0000000
--- a/src/data/images/android/svg/qwerty__function__number_alphabet__popup.svg
+++ /dev/null
@@ -1,46 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="qwerty_x5F__x5F_function_x5F__x5F_number_x5F_alphabet_x5F__x5F_popup"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="70px" height="74px"
- viewBox="0 0 70 74" style="enable-background:new 0 0 70 74;" xml:space="preserve">
-<g id="style-keyicon-popup-function">
- <path style="fill:#DDDDDD;" d=""/>
- <path style="fill:#DDDDDD;" d=""/>
- <path style="fill:#DDDDDD;" d=""/>
-</g>
-<g id="style-keyicon-popup-function_1_">
- <path style="fill:#DDDDDD;" d=""/>
- <path style="fill:#DDDDDD;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__function__number_kana__icon.svg b/src/data/images/android/svg/qwerty__function__number_kana__icon.svg
deleted file mode 100644
index 0445bed..0000000
--- a/src/data/images/android/svg/qwerty__function__number_kana__icon.svg
+++ /dev/null
@@ -1,46 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="qwerty_x5F__x5F_function_x5F__x5F_number_x5F_kana_x5F__x5F_icon"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="70px" height="74px"
- viewBox="0 0 70 74" style="enable-background:new 0 0 70 74;" xml:space="preserve">
-<g id="style-keyicon-function">
- <path style="fill:#DDDDDD;" d=""/>
- <path style="fill:#DDDDDD;" d=""/>
- <path style="fill:#DDDDDD;" d=""/>
-</g>
-<g id="style-keyicon-function_1_">
- <path style="fill:#DDDDDD;" d=""/>
- <path style="fill:#DDDDDD;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__function__number_kana__popup.svg b/src/data/images/android/svg/qwerty__function__number_kana__popup.svg
deleted file mode 100644
index fd8ff98..0000000
--- a/src/data/images/android/svg/qwerty__function__number_kana__popup.svg
+++ /dev/null
@@ -1,46 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="qwerty_x5F__x5F_function_x5F__x5F_number_x5F_kana_x5F__x5F_popup"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="70px" height="74px"
- viewBox="0 0 70 74" style="enable-background:new 0 0 70 74;" xml:space="preserve">
-<g id="style-keyicon-popup-function">
- <path style="fill:#DDDDDD;" d=""/>
- <path style="fill:#DDDDDD;" d=""/>
- <path style="fill:#DDDDDD;" d=""/>
-</g>
-<g id="style-keyicon-popup-function_1_">
- <path style="fill:#DDDDDD;" d=""/>
- <path style="fill:#DDDDDD;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__function__question_mark.svg b/src/data/images/android/svg/qwerty__function__question_mark.svg
new file mode 100644
index 0000000..b445213
--- /dev/null
+++ b/src/data/images/android/svg/qwerty__function__question_mark.svg
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<svg version="1.1" id="style-keyicon-qwerty-function" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
+ x="0px" y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
+ <text x="24" y="36" style="font-size:50px;text-anchor:middle;dominant-baseline:central;fill:#DDDDDD;">?</text>
+</svg>
diff --git a/src/data/images/android/svg/qwerty__function__right_arrow__icon.svg b/src/data/images/android/svg/qwerty__function__right_arrow__icon.svg
new file mode 100644
index 0000000..588a5ff
--- /dev/null
+++ b/src/data/images/android/svg/qwerty__function__right_arrow__icon.svg
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns="http://www.w3.org/2000/svg"
+ version="1.1"
+ width="48"
+ height="56">
+ <!-- Original: translate(-16,-15) -->
+ <g transform="matrix(0.984375,0,0,0.984375,-15.2,-14.2)">
+ <polygon id="style-keyicon-qwerty-function" points="32,52.035 33.202,53.238 48,43.684 47.9,42.245 33.269,32.762 32,33.931" fill="#DDD" fill-rule="evenodd"/>
+ </g>
+</svg>
diff --git a/src/data/images/android/svg/qwerty__function__solidus.svg b/src/data/images/android/svg/qwerty__function__solidus.svg
index 586c8f7..a686e20 100644
--- a/src/data/images/android/svg/qwerty__function__solidus.svg
+++ b/src/data/images/android/svg/qwerty__function__solidus.svg
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
<!--
Copyright 2010-2014, Google Inc.
All rights reserved.
@@ -30,10 +30,7 @@
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-->
<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-function" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#DDDDDD;" d=""/>
-</g>
+<svg version="1.1" id="style-keyicon-qwerty-function" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
+ x="0px" y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
+ <text x="24" y="36" style="font-size:50px;text-anchor:middle;dominant-baseline:central;fill:#DDDDDD;">/</text>
</svg>
diff --git a/src/data/images/android/svg/qwerty__function__space__icon.svg b/src/data/images/android/svg/qwerty__function__space__icon.svg
index 940fab0..263bcc6 100644
--- a/src/data/images/android/svg/qwerty__function__space__icon.svg
+++ b/src/data/images/android/svg/qwerty__function__space__icon.svg
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!--
Copyright 2010-2014, Google Inc.
All rights reserved.
@@ -29,11 +29,16 @@
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="qwerty_x5F__x5F_function_x5F__x5F_space_x5F__x5F_icon"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="70px" height="74px"
- viewBox="0 0 70 74" style="enable-background:new 0 0 70 74;" xml:space="preserve">
-<polygon id="style-keyicon-function_7_" style="fill:#DDDDDD;" points="45.634,36 45.634,43.266 22.367,43.266 22.367,36 17.5,36
- 17.5,47.999 50.5,47.999 50.5,36 "/>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg id="svg3674" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" width="285" height="122" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <metadata id="metadata3679">
+ <rdf:RDF>
+ <cc:Work rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+ <dc:title/>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <text id="style-keyicon-qwerty-function" x="142.5" y="61" style="font-size:45px;text-anchor:middle;dominant-baseline:central;">日本語</text>
</svg>
diff --git a/src/data/images/android/svg/qwerty__function__space__popup.svg b/src/data/images/android/svg/qwerty__function__space__popup.svg
deleted file mode 100644
index 0480e19..0000000
--- a/src/data/images/android/svg/qwerty__function__space__popup.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="qwerty_x5F__x5F_function_x5F__x5F_space_x5F__x5F_popup"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="70px" height="74px"
- viewBox="0 0 70 74" style="enable-background:new 0 0 70 74;" xml:space="preserve">
-<polygon id="style-keyicon-popup-function_4_" style="fill:#DDDDDD;" points="45.634,36 45.634,43.266 22.367,43.266 22.367,36
- 17.5,36 17.5,47.999 50.5,47.999 50.5,36 "/>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__function__symbol__icon.svg b/src/data/images/android/svg/qwerty__function__symbol__icon.svg
index f4e69af..8356fc5 100644
--- a/src/data/images/android/svg/qwerty__function__symbol__icon.svg
+++ b/src/data/images/android/svg/qwerty__function__symbol__icon.svg
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!--
Copyright 2010-2014, Google Inc.
All rights reserved.
@@ -29,21 +29,23 @@
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="qwerty_x5F__x5F_function_x5F__x5F_symbol_x5F__x5F_icon"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="70px" height="74px"
- viewBox="0 0 70 74" style="enable-background:new 0 0 70 74;" xml:space="preserve">
-<g id="style-keyicon-function_6_">
- <circle style="fill:#DDDDDD;" cx="28.54" cy="22.736" r="2.21"/>
- <circle style="fill:#DDDDDD;" cx="39.31" cy="22.736" r="2.21"/>
- <path style="fill:#DDDDDD;" d=""/>
- <g>
- <path style="fill-rule:evenodd;clip-rule:evenodd;fill:#DDDDDD;" d=""/>
- </g>
-</g>
-<g id="style-keyicon-function">
- <path style="fill:#DDDDDD;" d=""/>
- <path style="fill:#DDDDDD;" d=""/>
-</g>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ version="1.1"
+ width="68"
+ height="56">
+ <text id="style-keyicon-twelvekeys-function_0" x="26.7228" y="28" style="font-size:30px;dominant-baseline:central">1</text>
+ <text id="style-keyicon-twelvekeys-function_1" x="38.1754" y="28" style="font-size:30px;dominant-baseline:central">2</text>
+ <text id="style-keyicon-twelvekeys-function_2" x="53.1000" y="28" style="font-size:30px;dominant-baseline:central">3</text>
+ <!-- Original size: 114 x 80 -->
+ <g id="style-keyicon-qwerty-function_3" transform="matrix(0.597,0,0,0.597,0,4.14035)" fill-rule="nonzero" fill="#37474f">
+ <path d="m24.9,58.967776c-10.459333,0-18.9672032-8.509016-18.9672032-18.967203,0-10.459333,8.5078702-18.968349,18.9672032-18.968349s18.967203,8.509016,18.967203,18.968349c0,10.458187-8.50787,18.967203-18.967203,18.967203m0-42.466059c-12.958212,0-23.5000006,10.540644-23.5000006,23.498856,0,12.957066,10.5417886,23.49771,23.5000006,23.49771s23.500001-10.540644,23.500001-23.49771c0-12.958212-10.541789-23.498856-23.500001-23.498856"/>
+ <path d="m16.354451,37.583921c1.975512,0,3.57768-1.601023,3.57768-3.57768,0-1.975512-1.602168-3.576536-3.57768-3.576536s-3.57768,1.601024-3.57768,3.576536c0,1.976657,1.602168,3.57768,3.57768,3.57768"/>
+ <path d="m33.445434,30.429591c-1.975512,0-3.57768,1.601023-3.57768,3.57768,0,1.975512,1.602168,3.576536,3.57768,3.576536s3.57768-1.601024,3.57768-3.576536c0-1.976657-1.602168-3.57768-3.57768-3.57768"/>
+ <path d="m24.9,53.035286c8.968251,0,11.898879-8.247905,11.898879-8.247905h-23.797758s2.930628,8.247905,11.898879,8.247905"/>
+ </g>
</svg>
+
diff --git a/src/data/images/android/svg/qwerty__function__symbol__popup.svg b/src/data/images/android/svg/qwerty__function__symbol__popup.svg
deleted file mode 100644
index 400f2db..0000000
--- a/src/data/images/android/svg/qwerty__function__symbol__popup.svg
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="qwerty_x5F__x5F_function_x5F__x5F_symbol_x5F__x5F_popup"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="70px" height="74px"
- viewBox="0 0 70 74" style="enable-background:new 0 0 70 74;" xml:space="preserve">
-<g id="style-keyicon-popup-function_3_">
- <circle style="fill:#DDDDDD;" cx="28.54" cy="22.736" r="2.21"/>
- <circle style="fill:#DDDDDD;" cx="39.31" cy="22.736" r="2.21"/>
- <path style="fill:#DDDDDD;" d=""/>
- <g>
- <path style="fill-rule:evenodd;clip-rule:evenodd;fill:#DDDDDD;" d=""/>
- </g>
-</g>
-<g id="style-keyicon-popup-function">
- <path style="fill:#DDDDDD;" d=""/>
- <path style="fill:#DDDDDD;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__function__text_alphabet__icon.svg b/src/data/images/android/svg/qwerty__function__text_alphabet__icon.svg
index a3efc0e..fb2e775 100644
--- a/src/data/images/android/svg/qwerty__function__text_alphabet__icon.svg
+++ b/src/data/images/android/svg/qwerty__function__text_alphabet__icon.svg
@@ -30,13 +30,10 @@
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-->
<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="qwerty_x5F__x5F_function_x5F__x5F_text_x5F_alphabet_x5F__x5F_icon"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="70px" height="74px"
- viewBox="0 0 70 74" style="enable-background:new 0 0 70 74;" xml:space="preserve">
-<g id="style-keyicon-function">
- <path style="fill:#DDDDDD;" d=""/>
- <path style="fill:#DDDDDD;" d=""/>
- <path style="fill:#DDDDDD;" d=""/>
-</g>
+<svg version="1.1"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ width="148"
+ height="56">
+ <text id="style-keyicon-qwerty-function" x="74" y="28" style="font-size:30px;text-anchor:middle;dominant-baseline:central;">abc</text>
</svg>
diff --git a/src/data/images/android/svg/qwerty__function__text_alphabet__popup.svg b/src/data/images/android/svg/qwerty__function__text_alphabet__popup.svg
deleted file mode 100644
index 4ab4c03..0000000
--- a/src/data/images/android/svg/qwerty__function__text_alphabet__popup.svg
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="qwerty_x5F__x5F_function_x5F__x5F_text_x5F_alphabet_x5F__x5F_popup"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="70px" height="74px"
- viewBox="0 0 70 74" style="enable-background:new 0 0 70 74;" xml:space="preserve">
-<g id="style-keyicon-popup-function">
- <path style="fill:#DDDDDD;" d=""/>
- <path style="fill:#DDDDDD;" d=""/>
- <path style="fill:#DDDDDD;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__function__text_kana__icon.svg b/src/data/images/android/svg/qwerty__function__text_kana__icon.svg
deleted file mode 100644
index 16485fc..0000000
--- a/src/data/images/android/svg/qwerty__function__text_kana__icon.svg
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="qwerty_x5F__x5F_function_x5F__x5F_text_x5F_kana_x5F__x5F_icon"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="70px" height="74px"
- viewBox="0 0 70 74" style="enable-background:new 0 0 70 74;" xml:space="preserve">
-<g id="style-keyicon-function">
- <path style="fill:#DDDDDD;" d=""/>
- <path style="fill:#DDDDDD;" d=""/>
- <path style="fill:#DDDDDD;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__function__text_kana__popup.svg b/src/data/images/android/svg/qwerty__function__text_kana__popup.svg
deleted file mode 100644
index 8a40496..0000000
--- a/src/data/images/android/svg/qwerty__function__text_kana__popup.svg
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="qwerty_x5F__x5F_function_x5F__x5F_text_x5F_kana_x5F__x5F_popup"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="70px" height="74px"
- viewBox="0 0 70 74" style="enable-background:new 0 0 70 74;" xml:space="preserve">
-<g id="style-keyicon-popup-function_1_">
- <path style="fill:#DDDDDD;" d=""/>
- <path style="fill:#DDDDDD;" d=""/>
- <path style="fill:#DDDDDD;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__ampersand.svg b/src/data/images/android/svg/qwerty__keyicon__ampersand.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__ampersand.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__apostrophe.svg b/src/data/images/android/svg/qwerty__keyicon__apostrophe.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__apostrophe.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__asterisk.svg b/src/data/images/android/svg/qwerty__keyicon__asterisk.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__asterisk.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__black_heart_suit.svg b/src/data/images/android/svg/qwerty__keyicon__black_heart_suit.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__black_heart_suit.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__black_star.svg b/src/data/images/android/svg/qwerty__keyicon__black_star.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__black_star.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__circumflex_accent.svg b/src/data/images/android/svg/qwerty__keyicon__circumflex_accent.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__circumflex_accent.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__cjk_day.svg b/src/data/images/android/svg/qwerty__keyicon__cjk_day.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__cjk_day.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__cjk_hour.svg b/src/data/images/android/svg/qwerty__keyicon__cjk_hour.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__cjk_hour.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__cjk_minute.svg b/src/data/images/android/svg/qwerty__keyicon__cjk_minute.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__cjk_minute.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__cjk_month.svg b/src/data/images/android/svg/qwerty__keyicon__cjk_month.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__cjk_month.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__colon.svg b/src/data/images/android/svg/qwerty__keyicon__colon.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__colon.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__comma.svg b/src/data/images/android/svg/qwerty__keyicon__comma.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__comma.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__commercial_at.svg b/src/data/images/android/svg/qwerty__keyicon__commercial_at.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__commercial_at.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__digit_eight.svg b/src/data/images/android/svg/qwerty__keyicon__digit_eight.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__digit_eight.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__digit_five.svg b/src/data/images/android/svg/qwerty__keyicon__digit_five.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__digit_five.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__digit_four.svg b/src/data/images/android/svg/qwerty__keyicon__digit_four.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__digit_four.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__digit_nine.svg b/src/data/images/android/svg/qwerty__keyicon__digit_nine.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__digit_nine.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__digit_one.svg b/src/data/images/android/svg/qwerty__keyicon__digit_one.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__digit_one.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__digit_seven.svg b/src/data/images/android/svg/qwerty__keyicon__digit_seven.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__digit_seven.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__digit_six.svg b/src/data/images/android/svg/qwerty__keyicon__digit_six.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__digit_six.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__digit_three.svg b/src/data/images/android/svg/qwerty__keyicon__digit_three.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__digit_three.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__digit_two.svg b/src/data/images/android/svg/qwerty__keyicon__digit_two.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__digit_two.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__digit_zero.svg b/src/data/images/android/svg/qwerty__keyicon__digit_zero.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__digit_zero.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__division_sign.svg b/src/data/images/android/svg/qwerty__keyicon__division_sign.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__division_sign.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__dollar_sign.svg b/src/data/images/android/svg/qwerty__keyicon__dollar_sign.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__dollar_sign.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__eighth_note.svg b/src/data/images/android/svg/qwerty__keyicon__eighth_note.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__eighth_note.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__equals_sign.svg b/src/data/images/android/svg/qwerty__keyicon__equals_sign.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__equals_sign.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__exclamation_mark.svg b/src/data/images/android/svg/qwerty__keyicon__exclamation_mark.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__exclamation_mark.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__full_stop.svg b/src/data/images/android/svg/qwerty__keyicon__full_stop.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__full_stop.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__fullwidth_colon.svg b/src/data/images/android/svg/qwerty__keyicon__fullwidth_colon.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__fullwidth_colon.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__fullwidth_equals_sign.svg b/src/data/images/android/svg/qwerty__keyicon__fullwidth_equals_sign.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__fullwidth_equals_sign.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__fullwidth_exclamation_mark.svg b/src/data/images/android/svg/qwerty__keyicon__fullwidth_exclamation_mark.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__fullwidth_exclamation_mark.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__fullwidth_left_curly_bracket.svg b/src/data/images/android/svg/qwerty__keyicon__fullwidth_left_curly_bracket.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__fullwidth_left_curly_bracket.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__fullwidth_left_parenthesis.svg b/src/data/images/android/svg/qwerty__keyicon__fullwidth_left_parenthesis.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__fullwidth_left_parenthesis.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__fullwidth_plus_sign.svg b/src/data/images/android/svg/qwerty__keyicon__fullwidth_plus_sign.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__fullwidth_plus_sign.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__fullwidth_question_mark.svg b/src/data/images/android/svg/qwerty__keyicon__fullwidth_question_mark.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__fullwidth_question_mark.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__fullwidth_right_curly_bracket.svg b/src/data/images/android/svg/qwerty__keyicon__fullwidth_right_curly_bracket.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__fullwidth_right_curly_bracket.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__fullwidth_right_parenthesis.svg b/src/data/images/android/svg/qwerty__keyicon__fullwidth_right_parenthesis.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__fullwidth_right_parenthesis.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__fullwidth_semicolon.svg b/src/data/images/android/svg/qwerty__keyicon__fullwidth_semicolon.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__fullwidth_semicolon.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__fullwidth_solidus.svg b/src/data/images/android/svg/qwerty__keyicon__fullwidth_solidus.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__fullwidth_solidus.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__grave_accent.svg b/src/data/images/android/svg/qwerty__keyicon__grave_accent.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__grave_accent.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__greater_than_sign.svg b/src/data/images/android/svg/qwerty__keyicon__greater_than_sign.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__greater_than_sign.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__horizontal_ellipsis.svg b/src/data/images/android/svg/qwerty__keyicon__horizontal_ellipsis.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__horizontal_ellipsis.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__hyphen_minus.svg b/src/data/images/android/svg/qwerty__keyicon__hyphen_minus.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__hyphen_minus.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__ideographic_comma.svg b/src/data/images/android/svg/qwerty__keyicon__ideographic_comma.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__ideographic_comma.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__ideographic_full_stop.svg b/src/data/images/android/svg/qwerty__keyicon__ideographic_full_stop.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__ideographic_full_stop.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__katakana_middle_dot.svg b/src/data/images/android/svg/qwerty__keyicon__katakana_middle_dot.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__katakana_middle_dot.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_a.svg b/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_a.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_a.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_b.svg b/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_b.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_b.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_c.svg b/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_c.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_c.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_d.svg b/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_d.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_d.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_e.svg b/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_e.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_e.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_f.svg b/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_f.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_f.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_g.svg b/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_g.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_g.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_h.svg b/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_h.svg
deleted file mode 100644
index e25d36e..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_h.svg
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""
- />
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_i.svg b/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_i.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_i.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_j.svg b/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_j.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_j.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_k.svg b/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_k.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_k.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_l.svg b/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_l.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_l.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_m.svg b/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_m.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_m.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_n.svg b/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_n.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_n.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_o.svg b/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_o.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_o.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_p.svg b/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_p.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_p.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_q.svg b/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_q.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_q.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_r.svg b/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_r.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_r.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_s.svg b/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_s.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_s.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_t.svg b/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_t.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_t.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_u.svg b/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_u.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_u.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_v.svg b/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_v.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_v.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_w.svg b/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_w.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_w.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_x.svg b/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_x.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_x.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_y.svg b/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_y.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_y.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_z.svg b/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_z.svg
deleted file mode 100644
index e25d36e..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__latin_capital_letter_z.svg
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""
- />
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_a.svg b/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_a.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_a.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_b.svg b/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_b.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_b.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_c.svg b/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_c.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_c.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_d.svg b/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_d.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_d.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_e.svg b/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_e.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_e.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_f.svg b/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_f.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_f.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_g.svg b/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_g.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_g.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_h.svg b/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_h.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_h.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_i.svg b/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_i.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_i.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_j.svg b/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_j.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_j.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_k.svg b/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_k.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_k.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_l.svg b/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_l.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_l.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_m.svg b/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_m.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_m.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_n.svg b/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_n.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_n.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_o.svg b/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_o.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_o.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_p.svg b/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_p.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_p.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_q.svg b/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_q.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_q.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_r.svg b/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_r.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_r.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_s.svg b/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_s.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_s.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_t.svg b/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_t.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_t.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_u.svg b/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_u.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_u.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_v.svg b/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_v.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_v.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_w.svg b/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_w.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_w.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_x.svg b/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_x.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_x.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_y.svg b/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_y.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_y.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_z.svg b/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_z.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__latin_small_letter_z.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__left_black_lenticular_bracket.svg b/src/data/images/android/svg/qwerty__keyicon__left_black_lenticular_bracket.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__left_black_lenticular_bracket.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__left_corner_bracket.svg b/src/data/images/android/svg/qwerty__keyicon__left_corner_bracket.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__left_corner_bracket.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__left_curly_bracket.svg b/src/data/images/android/svg/qwerty__keyicon__left_curly_bracket.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__left_curly_bracket.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__left_parenthesis.svg b/src/data/images/android/svg/qwerty__keyicon__left_parenthesis.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__left_parenthesis.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__left_square_bracket.svg b/src/data/images/android/svg/qwerty__keyicon__left_square_bracket.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__left_square_bracket.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__less_than_sign.svg b/src/data/images/android/svg/qwerty__keyicon__less_than_sign.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__less_than_sign.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__low_line.svg b/src/data/images/android/svg/qwerty__keyicon__low_line.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__low_line.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__minus_sign.svg b/src/data/images/android/svg/qwerty__keyicon__minus_sign.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__minus_sign.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__multiplication_sign.svg b/src/data/images/android/svg/qwerty__keyicon__multiplication_sign.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__multiplication_sign.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__number_sign.svg b/src/data/images/android/svg/qwerty__keyicon__number_sign.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__number_sign.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__parenthesized_friday.svg b/src/data/images/android/svg/qwerty__keyicon__parenthesized_friday.svg
deleted file mode 100644
index 9a7a0b6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__parenthesized_friday.svg
+++ /dev/null
@@ -1,41 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
- <path style="fill:#272727;" d=""/>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__parenthesized_monday.svg b/src/data/images/android/svg/qwerty__keyicon__parenthesized_monday.svg
deleted file mode 100644
index 9a7a0b6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__parenthesized_monday.svg
+++ /dev/null
@@ -1,41 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
- <path style="fill:#272727;" d=""/>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__parenthesized_saturday.svg b/src/data/images/android/svg/qwerty__keyicon__parenthesized_saturday.svg
deleted file mode 100644
index 9a7a0b6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__parenthesized_saturday.svg
+++ /dev/null
@@ -1,41 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
- <path style="fill:#272727;" d=""/>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__parenthesized_sunday.svg b/src/data/images/android/svg/qwerty__keyicon__parenthesized_sunday.svg
deleted file mode 100644
index 9a7a0b6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__parenthesized_sunday.svg
+++ /dev/null
@@ -1,41 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
- <path style="fill:#272727;" d=""/>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__parenthesized_thursday.svg b/src/data/images/android/svg/qwerty__keyicon__parenthesized_thursday.svg
deleted file mode 100644
index 9a7a0b6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__parenthesized_thursday.svg
+++ /dev/null
@@ -1,41 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
- <path style="fill:#272727;" d=""/>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__parenthesized_tuesday.svg b/src/data/images/android/svg/qwerty__keyicon__parenthesized_tuesday.svg
deleted file mode 100644
index 9a7a0b6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__parenthesized_tuesday.svg
+++ /dev/null
@@ -1,41 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
- <path style="fill:#272727;" d=""/>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__parenthesized_wednesday.svg b/src/data/images/android/svg/qwerty__keyicon__parenthesized_wednesday.svg
deleted file mode 100644
index 9a7a0b6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__parenthesized_wednesday.svg
+++ /dev/null
@@ -1,41 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
- <path style="fill:#272727;" d=""/>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__percent_sign.svg b/src/data/images/android/svg/qwerty__keyicon__percent_sign.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__percent_sign.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__plus_sign.svg b/src/data/images/android/svg/qwerty__keyicon__plus_sign.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__plus_sign.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__postal_mark.svg b/src/data/images/android/svg/qwerty__keyicon__postal_mark.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__postal_mark.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__question_mark.svg b/src/data/images/android/svg/qwerty__keyicon__question_mark.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__question_mark.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__quotation_mark.svg b/src/data/images/android/svg/qwerty__keyicon__quotation_mark.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__quotation_mark.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__reference_mark.svg b/src/data/images/android/svg/qwerty__keyicon__reference_mark.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__reference_mark.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__reverse_solidus.svg b/src/data/images/android/svg/qwerty__keyicon__reverse_solidus.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__reverse_solidus.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__right_black_lenticular_bracket.svg b/src/data/images/android/svg/qwerty__keyicon__right_black_lenticular_bracket.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__right_black_lenticular_bracket.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__right_corner_bracket.svg b/src/data/images/android/svg/qwerty__keyicon__right_corner_bracket.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__right_corner_bracket.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__right_curly_bracket.svg b/src/data/images/android/svg/qwerty__keyicon__right_curly_bracket.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__right_curly_bracket.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__right_parenthesis.svg b/src/data/images/android/svg/qwerty__keyicon__right_parenthesis.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__right_parenthesis.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__right_square_bracket.svg b/src/data/images/android/svg/qwerty__keyicon__right_square_bracket.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__right_square_bracket.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__semicolon.svg b/src/data/images/android/svg/qwerty__keyicon__semicolon.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__semicolon.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__solidus.svg b/src/data/images/android/svg/qwerty__keyicon__solidus.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__solidus.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__tilde.svg b/src/data/images/android/svg/qwerty__keyicon__tilde.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__tilde.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__two_dot_leader.svg b/src/data/images/android/svg/qwerty__keyicon__two_dot_leader.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__two_dot_leader.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__vertical_line.svg b/src/data/images/android/svg/qwerty__keyicon__vertical_line.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__vertical_line.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__keyicon__wave_dash.svg b/src/data/images/android/svg/qwerty__keyicon__wave_dash.svg
deleted file mode 100644
index 5a0c1d6..0000000
--- a/src/data/images/android/svg/qwerty__keyicon__wave_dash.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="style-keyicon-main" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
- y="0px" width="48px" height="74px" viewBox="0 0 48 74" style="enable-background:new 0 0 48 74;" xml:space="preserve">
-<g>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/qwerty__shift_off.svg b/src/data/images/android/svg/qwerty__shift_off.svg
index a2b38ad..7aaa6a0 100644
--- a/src/data/images/android/svg/qwerty__shift_off.svg
+++ b/src/data/images/android/svg/qwerty__shift_off.svg
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!--
Copyright 2010-2014, Google Inc.
All rights reserved.
@@ -29,18 +29,20 @@
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="qwerty_x5F__x5F_shift_x5F_off"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="70px" height="74px"
- viewBox="0 0 70 74" style="enable-background:new 0 0 70 74;" xml:space="preserve">
-<polygon id="shadow_18_" style="fill:#424242;" points="38.035,57.998 38.035,49.298 42.5,49.298 42.5,48.199 34.067,38 33.766,38
- 25.5,48.333 25.5,49.298 29.967,49.298 29.967,57.998 "/>
-<g id="style-keyicon-function_1_">
- <path style="fill:#DDDDDD;" d=""/>
- <path style="fill:#DDDDDD;" d=""/>
- <path style="fill:#DDDDDD;" d=""/>
- <path style="fill:#DDDDDD;" d=""/>
- <path style="fill:#DDDDDD;" d=""/>
-</g>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ version="1.1"
+ width="68"
+ height="56">
+ <!-- Original size: 90 x 90 and matrix(0.98633121,0,0,-1.0114943,29.865734,38.1287) -->
+ <g transform="matrix(0.535680,0,0,-0.549346,25.6399,24.2682)">
+ <path id="style-keyicon-qwerty-function" d="m0,0,0-18.25,30.25,0,0,18.25,21.125,0,-36.25,36.25,-35.25,-36.25,21.125,0z" fill-rule="nonzero" style="fill:#000"/>
+ </g>
+ <!-- Original size: 90 x 90 -->
+ <g transform="matrix(0.543103,0,0,0.543103,9.41972,3.56034)">
+ <path id="style-keyicon-qwerty-function" d="m20.946452,82.85799,48.107096,0,0,5.10709-48.107096,0,0-5.10709z" stroke-width="0.89290297" style="fill:none; stroke:#000;"/>
+ </g>
</svg>
diff --git a/src/data/images/android/svg/qwerty__shift_on.svg b/src/data/images/android/svg/qwerty__shift_on.svg
index 8d9823f..5e1dfce 100644
--- a/src/data/images/android/svg/qwerty__shift_on.svg
+++ b/src/data/images/android/svg/qwerty__shift_on.svg
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!--
Copyright 2010-2014, Google Inc.
All rights reserved.
@@ -29,18 +29,20 @@
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="qwerty_x5F__x5F_shift_x5F_on"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="70px" height="74px"
- viewBox="0 0 70 74" style="enable-background:new 0 0 70 74;" xml:space="preserve">
-<polygon id="style-keyicon-qwerty-shift-on-arrow" style="fill:#FFB005;" points="38.035,57.998 38.035,49.298 42.5,49.298
- 42.5,48.199 34.067,38 33.766,38 25.5,48.333 25.5,49.298 29.967,49.298 29.967,57.998 "/>
-<g id="style-keyicon-function">
- <path style="fill:#DDDDDD;" d=""/>
- <path style="fill:#DDDDDD;" d=""/>
- <path style="fill:#DDDDDD;" d=""/>
- <path style="fill:#DDDDDD;" d=""/>
- <path style="fill:#DDDDDD;" d=""/>
-</g>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ version="1.1"
+ width="68"
+ height="56">
+ <!-- Original size: 90 x 90 and matrix(0.98633121,0,0,-1.0114943,29.865734,38.1287) -->
+ <g transform="matrix(0.535680,0,0,-0.549346,25.6399,24.2682)">
+ <path id="style-keyicon-qwerty-shift-on-arrow" d="m0,0,0-18.25,30.25,0,0,18.25,21.125,0,-36.25,36.25,-35.25,-36.25,21.125,0z" fill-rule="nonzero" style="fill:#000"/>
+ </g>
+ <!-- Original size: 90 x 90 -->
+ <g transform="matrix(0.543103,0,0,0.543103,9.41972,3.56034)">
+ <path id="style-keyicon-qwerty-function" d="m20.946452,82.85799,48.107096,0,0,5.10709-48.107096,0,0-5.10709z" stroke-width="0.89290297" style="fill:none;stroke:#000;"/>
+ </g>
</svg>
diff --git a/src/data/images/android/svg/symbol__function__close.svg b/src/data/images/android/svg/symbol__function__close.svg
index 459a6a2..5888ac0 100644
--- a/src/data/images/android/svg/symbol__function__close.svg
+++ b/src/data/images/android/svg/symbol__function__close.svg
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!--
Copyright 2010-2014, Google Inc.
All rights reserved.
@@ -29,35 +29,16 @@
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="symbol_x5F__x5F_function_x5F__x5F_close"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="51px" height="70px"
- viewBox="0 0 51 70" style="enable-background:new 0 0 51 70;" xml:space="preserve">
-<g id="style-keyicon-function">
- <path style="fill:#DDDDDD;" d=""/>
- <path style="fill:#DDDDDD;" d=""/>
- <path style="fill:#DDDDDD;" d=""/>
-</g>
-<path id="" style="fill:#DDDDDD;" d="M43.5,34.795h-36c-0.276,0-0.5-0.224-0.5-0.5V11
- c0-0.276,0.224-0.5,0.5-0.5h36c0.276,0,0.5,0.224,0.5,0.5v23.295C44,34.572,43.776,34.795,43.5,34.795z M8,33.795h35V11.5H8V33.795z
- "/>
-<g id="style-keyicon-function_2_">
- <g>
- <g>
- <rect x="13.253" y="14.105" style="fill-rule:evenodd;clip-rule:evenodd;fill:#DDDDDD;" width="4.341" height="4.658"/>
- <rect x="13.253" y="20.318" style="fill-rule:evenodd;clip-rule:evenodd;fill:#DDDDDD;" width="4.341" height="4.66"/>
- <rect x="13.253" y="26.529" style="fill-rule:evenodd;clip-rule:evenodd;fill:#DDDDDD;" width="4.341" height="4.66"/>
- <rect x="26.208" y="14.105" style="fill-rule:evenodd;clip-rule:evenodd;fill:#DDDDDD;" width="4.339" height="4.658"/>
- <rect x="26.208" y="20.318" style="fill-rule:evenodd;clip-rule:evenodd;fill:#DDDDDD;" width="4.339" height="4.66"/>
- <rect x="26.208" y="26.529" style="fill-rule:evenodd;clip-rule:evenodd;fill:#DDDDDD;" width="4.339" height="4.66"/>
- <rect x="19.747" y="14.105" style="fill-rule:evenodd;clip-rule:evenodd;fill:#DDDDDD;" width="4.307" height="4.658"/>
- <rect x="19.747" y="20.318" style="fill-rule:evenodd;clip-rule:evenodd;fill:#DDDDDD;" width="4.307" height="4.66"/>
- <rect x="19.747" y="26.529" style="fill-rule:evenodd;clip-rule:evenodd;fill:#DDDDDD;" width="4.307" height="4.66"/>
- <rect x="32.701" y="14.105" style="fill-rule:evenodd;clip-rule:evenodd;fill:#DDDDDD;" width="4.305" height="4.658"/>
- <rect x="32.701" y="20.318" style="fill-rule:evenodd;clip-rule:evenodd;fill:#DDDDDD;" width="4.305" height="4.66"/>
- <rect x="32.701" y="26.529" style="fill-rule:evenodd;clip-rule:evenodd;fill:#DDDDDD;" width="4.305" height="4.66"/>
- </g>
- </g>
-</g>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg id="svg3351" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="28.394531" width="71.260742" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <metadata id="metadata3356">
+ <rdf:RDF>
+ <cc:Work rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+ <dc:title/>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <text id="style-symbol-minor-selected" y="23.985352" x="37.258789" style="text-anchor:middle;font-size:26px;">あいう</text>
</svg>
diff --git a/src/data/images/android/svg/symbol__function__delete.svg b/src/data/images/android/svg/symbol__function__delete.svg
deleted file mode 100644
index e52b765..0000000
--- a/src/data/images/android/svg/symbol__function__delete.svg
+++ /dev/null
@@ -1,44 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="symbol_x5F__x5F_function_x5F__x5F_delete"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="51px" height="70px"
- viewBox="0 0 51 70" style="enable-background:new 0 0 51 70;" xml:space="preserve">
-<g id="style-keyicon-function_2_">
- <path style="fill:#DDDDDD;" d=""/>
- <path style="fill:#DDDDDD;" d=""/>
-</g>
-<path id="" style="fill-rule:evenodd;clip-rule:evenodd;fill:#DDDDDD;" d="M32.601,25.833L31.1,27.367
- l-2.302-2.334l-2.266,2.334l-1.497-1.533l2.266-2.334l-2.266-2.334l1.497-1.531l2.266,2.332l2.302-2.332l1.501,1.563L30.335,23.5
- L32.601,25.833z M19.801,13v0.067l-0.034-0.033L9.5,23.536L19.767,34l0.034-0.035V34h20l1.699-1.734V14.8L39.833,13H19.801z"/>
-</svg>
diff --git a/src/data/images/android/svg/symbol__major__emoji.svg b/src/data/images/android/svg/symbol__major__emoji.svg
index 12375cd..bffb64f 100644
--- a/src/data/images/android/svg/symbol__major__emoji.svg
+++ b/src/data/images/android/svg/symbol__major__emoji.svg
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!--
Copyright 2010-2014, Google Inc.
All rights reserved.
@@ -29,17 +29,16 @@
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="symbol_x5F__x5F_major_x5F__x5F_emoji"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="37px" height="66px"
- viewBox="0 0 37 66" style="enable-background:new 0 0 37 66;" xml:space="preserve">
-<g id="style-symbol-major">
- <circle style="fill:#333333;" cx="12.13" cy="29.582" r="2.578"/>
- <circle style="fill:#333333;" cx="24.694" cy="29.582" r="2.578"/>
- <path style="fill:#333333;" d=""/>
- <g>
- <path style="fill-rule:evenodd;clip-rule:evenodd;fill:#333333;" d=""/>
- </g>
-</g>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg id="svg3191" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="77" width="77" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <metadata id="metadata3196">
+ <rdf:RDF>
+ <cc:Work rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+ <dc:title/>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <path id="style-symbol-major" fill-rule="nonzero" fill="#000" d="m38.5,59.301797c14.310181,0,18.988765-13.160478,18.988765-13.160478h-37.97753s4.678584,13.160478,18.988765,13.160478m13.636803-36.074056c-3.152906,0-5.708598,2.555692-5.708598,5.708598s2.555692,5.708598,5.708598,5.708598c3.152907,0,5.708598-2.555692,5.708598-5.708598s-2.555691-5.708598-5.708598-5.708598m-27.273606,11.416838c3.152906,0,5.708598-2.555691,5.708598-5.708598,0-3.152906-2.555692-5.708598-5.708598-5.708598-3.152907,0-5.708598,2.555692-5.708598,5.708598,0,3.152907,2.555691,5.708598,5.708598,5.708598m13.636803,34.124168c-16.690577,0-30.268142-13.578777-30.268142-30.268145,0-16.690577,13.577565-30.2693503,30.268142-30.2693503s30.26814,13.5787733,30.26814,30.2693503c0,16.689368-13.577563,30.268145-30.26814,30.268145m0-67.7681443c-20.677649,0-37.5,16.8223503-37.5,37.4999993,0,20.676435,16.822351,37.498795,37.5,37.498795,20.67765,0,37.5-16.82236,37.5-37.498795,0-20.677649-16.82235-37.4999993-37.5-37.4999993"/>
</svg>
diff --git a/src/data/images/android/svg/symbol__major__emoji_selected.svg b/src/data/images/android/svg/symbol__major__emoji_selected.svg
index aa771a2..9957e18 100644
--- a/src/data/images/android/svg/symbol__major__emoji_selected.svg
+++ b/src/data/images/android/svg/symbol__major__emoji_selected.svg
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!--
Copyright 2010-2014, Google Inc.
All rights reserved.
@@ -29,17 +29,16 @@
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="symbol_x5F__x5F_major_x5F__x5F_emoji_x5F_selected"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="37px" height="66px"
- viewBox="0 0 37 66" style="enable-background:new 0 0 37 66;" xml:space="preserve">
-<g id="style-symbol-major-selected">
- <circle style="fill:#F9F9F9;" cx="12.13" cy="29.582" r="2.578"/>
- <circle style="fill:#F9F9F9;" cx="24.694" cy="29.582" r="2.578"/>
- <path style="fill:#F9F9F9;" d=""/>
- <g>
- <path style="fill-rule:evenodd;clip-rule:evenodd;fill:#F9F9F9;" d=""/>
- </g>
-</g>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg id="svg3191" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="77" width="77" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <metadata id="metadata3196">
+ <rdf:RDF>
+ <cc:Work rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+ <dc:title/>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <path id="style-symbol-major-selected" fill-rule="nonzero" fill="#000" d="m38.5,59.301797c14.310181,0,18.988765-13.160478,18.988765-13.160478h-37.97753s4.678584,13.160478,18.988765,13.160478m13.636803-36.074056c-3.152906,0-5.708598,2.555692-5.708598,5.708598s2.555692,5.708598,5.708598,5.708598c3.152907,0,5.708598-2.555692,5.708598-5.708598s-2.555691-5.708598-5.708598-5.708598m-27.273606,11.416838c3.152906,0,5.708598-2.555691,5.708598-5.708598,0-3.152906-2.555692-5.708598-5.708598-5.708598-3.152907,0-5.708598,2.555692-5.708598,5.708598,0,3.152907,2.555691,5.708598,5.708598,5.708598m13.636803,34.124168c-16.690577,0-30.268142-13.578777-30.268142-30.268145,0-16.690577,13.577565-30.2693503,30.268142-30.2693503s30.26814,13.5787733,30.26814,30.2693503c0,16.689368-13.577563,30.268145-30.26814,30.268145m0-67.7681443c-20.677649,0-37.5,16.8223503-37.5,37.4999993,0,20.676435,16.822351,37.498795,37.5,37.498795,20.67765,0,37.5-16.82236,37.5-37.498795,0-20.677649-16.82235-37.4999993-37.5-37.4999993"/>
</svg>
diff --git a/src/data/images/android/svg/symbol__major__emoticon.svg b/src/data/images/android/svg/symbol__major__emoticon.svg
index b0ac2e9..fbc7c18 100644
--- a/src/data/images/android/svg/symbol__major__emoticon.svg
+++ b/src/data/images/android/svg/symbol__major__emoticon.svg
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!--
Copyright 2010-2014, Google Inc.
All rights reserved.
@@ -29,15 +29,16 @@
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="symbol_x5F__x5F_major_x5F__x5F_emoticon"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="61px" height="66px"
- viewBox="0 0 61 66" style="enable-background:new 0 0 61 66;" xml:space="preserve">
-<g id="style-symbol-major_1_">
- <path style="fill:#333333;" d=""/>
- <path style="fill:#333333;" d=""/>
- <path style="fill:#333333;" d=""/>
- <path style="fill:#333333;" d=""/>
-</g>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg id="svg3351" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="32.71875" width="74.540039" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <metadata id="metadata3356">
+ <rdf:RDF>
+ <cc:Work rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+ <dc:title/>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <text id="style-symbol-major" y="25.763672" x="37.277344" style="text-anchor:middle;font-size:30px;">(^^)</text>
</svg>
diff --git a/src/data/images/android/svg/symbol__major__emoticon_selected.svg b/src/data/images/android/svg/symbol__major__emoticon_selected.svg
index bfd7ed2..9b56f19 100644
--- a/src/data/images/android/svg/symbol__major__emoticon_selected.svg
+++ b/src/data/images/android/svg/symbol__major__emoticon_selected.svg
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!--
Copyright 2010-2014, Google Inc.
All rights reserved.
@@ -29,15 +29,16 @@
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="symbol_x5F__x5F_major_x5F__x5F_emoticon_x5F_selected"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="61px" height="66px"
- viewBox="0 0 61 66" style="enable-background:new 0 0 61 66;" xml:space="preserve">
-<g id="style-symbol-major-selected_1_">
- <path style="fill:#FFFFFF;" d=""/>
- <path style="fill:#FFFFFF;" d=""/>
- <path style="fill:#FFFFFF;" d=""/>
- <path style="fill:#FFFFFF;" d=""/>
-</g>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg id="svg3351" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="32.71875" width="74.540039" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <metadata id="metadata3356">
+ <rdf:RDF>
+ <cc:Work rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+ <dc:title/>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <text id="style-symbol-major-selected" y="25.763672" x="37.277344" style="text-anchor:middle;font-size:30px;">(^^)</text>
</svg>
diff --git a/src/data/images/android/svg/symbol__major__number.svg b/src/data/images/android/svg/symbol__major__number.svg
new file mode 100644
index 0000000..f7cef5f
--- /dev/null
+++ b/src/data/images/android/svg/symbol__major__number.svg
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg id="svg3351" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="28.69043" width="57.591797" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <metadata id="metadata3356">
+ <rdf:RDF>
+ <cc:Work rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+ <dc:title/>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <text id="style-symbol-major" y="25.265625" x="28.356445" style="text-anchor:middle;font-size:30px;">123</text>
+</svg>
diff --git a/src/data/images/android/svg/symbol__major__number_selected.svg b/src/data/images/android/svg/symbol__major__number_selected.svg
new file mode 100644
index 0000000..519db6b
--- /dev/null
+++ b/src/data/images/android/svg/symbol__major__number_selected.svg
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg id="svg3351" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="28.69043" width="57.591797" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <metadata id="metadata3356">
+ <rdf:RDF>
+ <cc:Work rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+ <dc:title/>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <text id="style-symbol-major-selected" y="25.265625" x="28.356445" style="text-anchor:middle;font-size:30px;">123</text>
+</svg>
diff --git a/src/data/images/android/svg/symbol__major__symbol.svg b/src/data/images/android/svg/symbol__major__symbol.svg
index c7479f8..42f22be 100644
--- a/src/data/images/android/svg/symbol__major__symbol.svg
+++ b/src/data/images/android/svg/symbol__major__symbol.svg
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!--
Copyright 2010-2014, Google Inc.
All rights reserved.
@@ -29,15 +29,7 @@
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="symbol_x5F__x5F_major_x5F__x5F_symbol"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="85px" height="66px"
- viewBox="0 0 85 66" style="enable-background:new 0 0 85 66;" xml:space="preserve">
-<g id="style-symbol-major_1_">
- <path style="fill:#333333;" d=""/>
- <path style="fill:#333333;" d=""/>
- <path style="fill:#333333;" d=""/>
- <path style="fill:#333333;" d=""/>
-</g>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="32.879883" width="54" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <text id="style-symbol-major" y="27.84375" x="28" style="text-anchor:middle;font-size:30px;">「」♪</text>
</svg>
diff --git a/src/data/images/android/svg/symbol__major__symbol_selected.svg b/src/data/images/android/svg/symbol__major__symbol_selected.svg
index 929641c..8d7a423 100644
--- a/src/data/images/android/svg/symbol__major__symbol_selected.svg
+++ b/src/data/images/android/svg/symbol__major__symbol_selected.svg
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!--
Copyright 2010-2014, Google Inc.
All rights reserved.
@@ -29,15 +29,7 @@
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="symbol_x5F__x5F_major_x5F__x5F_symbol_x5F_selected"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="85px" height="66px"
- viewBox="0 0 85 66" style="enable-background:new 0 0 85 66;" xml:space="preserve">
-<g id="style-symbol-major-selected_1_">
- <path style="fill:#FFFFFF;" d=""/>
- <path style="fill:#FFFFFF;" d=""/>
- <path style="fill:#FFFFFF;" d=""/>
- <path style="fill:#FFFFFF;" d=""/>
-</g>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="32.879883" width="54" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <text id="style-symbol-major-selected" y="27.84375" x="28" style="text-anchor:middle;font-size:30px;">「」♪</text>
</svg>
diff --git a/src/data/images/android/svg/symbol__minor__activity.svg b/src/data/images/android/svg/symbol__minor__activity.svg
new file mode 100644
index 0000000..496025a
--- /dev/null
+++ b/src/data/images/android/svg/symbol__minor__activity.svg
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg id="svg3507" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="80" width="80" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <metadata id="metadata3512">
+ <rdf:RDF>
+ <cc:Work rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+ <dc:title/>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g id="layer1" transform="translate(0,-972.36218)">
+ <g id="g224" transform="matrix(1.25,0,0,-1.25,65.22575,1048.3876)">
+ <path id="style-symbol-minor" d="m0,0c0-0.664-0.539-1.203-1.203-1.203h-38.11c-0.665,0-1.203,0.539-1.203,1.203v1.286c0,0.663,0.538,1.202,1.203,1.202h38.11c0.664,0,1.203-0.539,1.203-1.202v-1.286zm-6.5723,9.3829c-1.358,0-2.46,1.102-2.46,2.461,0,1.357,1.102,2.459,2.46,2.459,1.357,0,2.459-1.102,2.459-2.459,0-1.359-1.102-2.461-2.459-2.461m-13.646,0c-1.754,0-3.176,1.422-3.176,3.175s1.422,3.175,3.176,3.175c1.752,0,3.173-1.422,3.173-3.175s-1.421-3.175-3.173-3.175m-12.928,0c-1.36,0-2.461,1.102-2.461,2.461,0,1.357,1.101,2.459,2.461,2.459,1.357,0,2.459-1.102,2.459-2.459,0-1.359-1.102-2.461-2.459-2.461m30.457,9.645-35.498,0c-1.285,0-2.328-1.043-2.328-2.329v-9.31c0-1.285,1.043-2.328,2.328-2.328h35.498c1.285,0,2.326,1.043,2.326,2.328v9.31c0,1.286-1.041,2.329-2.326,2.329m6.8592,28.4087,1.477-0.675c-0.126-1.076-0.565-2.394-1.211-3.817-2.686-5.905-8.969-13.603-11.501-13.236-3.593,0.52-3.404,3.682-3.515,6.494-0.213,5.391,0.165,9.891,1.465,14.883,0.002,0.01,0.002,0.016,0.006,0.026l2.011-0.371-1.824,8.103-4.801-7.022,1.957-0.255c0.031-0.76,0.031-1.803-0.096-3.197-0.427-4.681-1.206-8.047-3.42-11.888-3.048-5.287-6.825-5.39-9.588-0.067-2.164,4.167-4.009,10.472-3.281,15.328,0.008,0.061,0.014,0.103,0.023,0.158l1.421,0.262-4.672,6.681-1.566-7.832,1.746,0.322c1.998-5.55,2.252-12.421,0.242-18.117-1.588-4.504-3.35-5.041-7.047-1.957-3.035,2.531-4.752,6.137-6.526,9.46-0.794,1.878-1.132,3.15-1.609,4.685l1.609,0.734-5.978,5.392,0.58-7.855,1.328,0.606c1.319-1.375,1.969-3.834,2.957-5.748,1.235-3.76,2.637-7.473,3.649-11.289,0.932-3.514,1.03-5.036,4.701-4.973,8.096,0.139,25.082,0.029,33.18,0.029,2.082,0,3.76,0.397,4.716,3.199,1.963,5.754,4.549,13.598,5.678,16.323,0.594,1.437,1.201,3.033,1.727,3.852l1.558-0.701,0.581,7.855-5.977-5.392z" fill-rule="nonzero" style="fill:#777"/>
+ </g>
+ </g>
+</svg>
diff --git a/src/data/images/android/svg/symbol__minor__activity_selected.svg b/src/data/images/android/svg/symbol__minor__activity_selected.svg
new file mode 100644
index 0000000..e843c3d
--- /dev/null
+++ b/src/data/images/android/svg/symbol__minor__activity_selected.svg
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg id="svg3507" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="80" width="80" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <metadata id="metadata3512">
+ <rdf:RDF>
+ <cc:Work rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+ <dc:title/>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g id="layer1" transform="translate(0,-972.36218)">
+ <g id="g224" transform="matrix(1.25,0,0,-1.25,65.22575,1048.3876)">
+ <path id="style-symbol-minor-selected" d="m0,0c0-0.664-0.539-1.203-1.203-1.203h-38.11c-0.665,0-1.203,0.539-1.203,1.203v1.286c0,0.663,0.538,1.202,1.203,1.202h38.11c0.664,0,1.203-0.539,1.203-1.202v-1.286zm-6.5723,9.3829c-1.358,0-2.46,1.102-2.46,2.461,0,1.357,1.102,2.459,2.46,2.459,1.357,0,2.459-1.102,2.459-2.459,0-1.359-1.102-2.461-2.459-2.461m-13.646,0c-1.754,0-3.176,1.422-3.176,3.175s1.422,3.175,3.176,3.175c1.752,0,3.173-1.422,3.173-3.175s-1.421-3.175-3.173-3.175m-12.928,0c-1.36,0-2.461,1.102-2.461,2.461,0,1.357,1.101,2.459,2.461,2.459,1.357,0,2.459-1.102,2.459-2.459,0-1.359-1.102-2.461-2.459-2.461m30.457,9.645-35.498,0c-1.285,0-2.328-1.043-2.328-2.329v-9.31c0-1.285,1.043-2.328,2.328-2.328h35.498c1.285,0,2.326,1.043,2.326,2.328v9.31c0,1.286-1.041,2.329-2.326,2.329m6.8592,28.4087,1.477-0.675c-0.126-1.076-0.565-2.394-1.211-3.817-2.686-5.905-8.969-13.603-11.501-13.236-3.593,0.52-3.404,3.682-3.515,6.494-0.213,5.391,0.165,9.891,1.465,14.883,0.002,0.01,0.002,0.016,0.006,0.026l2.011-0.371-1.824,8.103-4.801-7.022,1.957-0.255c0.031-0.76,0.031-1.803-0.096-3.197-0.427-4.681-1.206-8.047-3.42-11.888-3.048-5.287-6.825-5.39-9.588-0.067-2.164,4.167-4.009,10.472-3.281,15.328,0.008,0.061,0.014,0.103,0.023,0.158l1.421,0.262-4.672,6.681-1.566-7.832,1.746,0.322c1.998-5.55,2.252-12.421,0.242-18.117-1.588-4.504-3.35-5.041-7.047-1.957-3.035,2.531-4.752,6.137-6.526,9.46-0.794,1.878-1.132,3.15-1.609,4.685l1.609,0.734-5.978,5.392,0.58-7.855,1.328,0.606c1.319-1.375,1.969-3.834,2.957-5.748,1.235-3.76,2.637-7.473,3.649-11.289,0.932-3.514,1.03-5.036,4.701-4.973,8.096,0.139,25.082,0.029,33.18,0.029,2.082,0,3.76,0.397,4.716,3.199,1.963,5.754,4.549,13.598,5.678,16.323,0.594,1.437,1.201,3.033,1.727,3.852l1.558-0.701,0.581,7.855-5.977-5.392z" fill-rule="nonzero" style="fill:#777"/>
+ </g>
+ </g>
+</svg>
diff --git a/src/data/images/android/svg/symbol__minor__arrow.svg b/src/data/images/android/svg/symbol__minor__arrow.svg
new file mode 100644
index 0000000..8105bfe
--- /dev/null
+++ b/src/data/images/android/svg/symbol__minor__arrow.svg
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg id="svg3398" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="80" width="100" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <metadata id="metadata3403">
+ <rdf:RDF>
+ <cc:Work rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+ <dc:title/>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g id="layer1" transform="translate(0,-972.36218)">
+ <path id="style-symbol-minor" d="m10.206875,1000.7484,0,22.5638,41.655,0,0,15.935,37.93125-28.2038-37.93125-25.56623,0,15.55503-41.655-0.2838z" fill-rule="nonzero" style="fill:#000"/>
+ </g>
+</svg>
diff --git a/src/data/images/android/svg/symbol__minor__arrow_selected.svg b/src/data/images/android/svg/symbol__minor__arrow_selected.svg
new file mode 100644
index 0000000..cf18903
--- /dev/null
+++ b/src/data/images/android/svg/symbol__minor__arrow_selected.svg
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg id="svg3398" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="80" width="100" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <metadata id="metadata3403">
+ <rdf:RDF>
+ <cc:Work rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+ <dc:title/>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g id="layer1" transform="translate(0,-972.36218)">
+ <path id="style-symbol-minor-selected" d="m10.206875,1000.7484,0,22.5638,41.655,0,0,15.935,37.93125-28.2038-37.93125-25.56623,0,15.55503-41.655-0.2838z" fill-rule="nonzero" style="fill:#000"/>
+ </g>
+</svg>
diff --git a/src/data/images/android/svg/symbol__minor__city.svg b/src/data/images/android/svg/symbol__minor__city.svg
new file mode 100644
index 0000000..d6e8a11
--- /dev/null
+++ b/src/data/images/android/svg/symbol__minor__city.svg
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg id="svg3556" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="80" width="80" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <metadata id="metadata3561">
+ <rdf:RDF>
+ <cc:Work rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+ <dc:title/>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <path id="style-symbol-minor" fill-rule="nonzero" fill="#000" d="m63.495858,47.667609c-3.674569,0-6.65334-2.978771-6.65334-6.65334s2.978771-6.652155,6.65334-6.652155,6.652155,2.977586,6.652155,6.652155-2.977586,6.65334-6.652155,6.65334m-45.621551,0c-3.674569,0-6.652155-2.978771-6.652155-6.65334s2.977586-6.652155,6.652155-6.652155,6.653341,2.977586,6.653341,6.652155-2.978772,6.65334-6.653341,6.65334m1.901293-29.663254c0.950647-1.901293,2.85194-1.901293,2.85194-1.901293h35.165624c1.901293,0,1.901293,1.901293,1.901293,1.901293l5.701509,12.89181h-50.372413s3.801401-10.990517,4.752047-12.89181m43.720258-2.651616s-0.950647-3.801401-4.752047-3.801401h-37.066918c-3.802586,0-4.752047,3.801401-4.752047,3.801401l-9.9248919,22.810775v14.256142h65.9999989v-14.256142l-9.504095-22.810775zm-56.4959039,49.830236c0,2.846013,3.4137929,3.265625,3.4137929,3.265625h6.615409c2.846013,0,2.488039-3.265625,2.488039-3.265625v-5.837823h41.15043v5.837823c0,2.846013,2.846013,3.265625,2.846013,3.265625h6.640302c2.846013,0,2.846013-3.265625,2.846013-3.265625v-9.251616h-65.9999989v9.251616z"/>
+</svg>
diff --git a/src/data/images/android/svg/symbol__minor__city_selected.svg b/src/data/images/android/svg/symbol__minor__city_selected.svg
new file mode 100644
index 0000000..b0c32b8
--- /dev/null
+++ b/src/data/images/android/svg/symbol__minor__city_selected.svg
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg id="svg3556" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="80" width="80" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <metadata id="metadata3561">
+ <rdf:RDF>
+ <cc:Work rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+ <dc:title/>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <path id="style-symbol-minor-selected" fill-rule="nonzero" fill="#000" d="m63.495858,47.667609c-3.674569,0-6.65334-2.978771-6.65334-6.65334s2.978771-6.652155,6.65334-6.652155,6.652155,2.977586,6.652155,6.652155-2.977586,6.65334-6.652155,6.65334m-45.621551,0c-3.674569,0-6.652155-2.978771-6.652155-6.65334s2.977586-6.652155,6.652155-6.652155,6.653341,2.977586,6.653341,6.652155-2.978772,6.65334-6.653341,6.65334m1.901293-29.663254c0.950647-1.901293,2.85194-1.901293,2.85194-1.901293h35.165624c1.901293,0,1.901293,1.901293,1.901293,1.901293l5.701509,12.89181h-50.372413s3.801401-10.990517,4.752047-12.89181m43.720258-2.651616s-0.950647-3.801401-4.752047-3.801401h-37.066918c-3.802586,0-4.752047,3.801401-4.752047,3.801401l-9.9248919,22.810775v14.256142h65.9999989v-14.256142l-9.504095-22.810775zm-56.4959039,49.830236c0,2.846013,3.4137929,3.265625,3.4137929,3.265625h6.615409c2.846013,0,2.488039-3.265625,2.488039-3.265625v-5.837823h41.15043v5.837823c0,2.846013,2.846013,3.265625,2.846013,3.265625h6.640302c2.846013,0,2.846013-3.265625,2.846013-3.265625v-9.251616h-65.9999989v9.251616z"/>
+</svg>
diff --git a/src/data/images/android/svg/symbol__minor__displeasure.svg b/src/data/images/android/svg/symbol__minor__displeasure.svg
new file mode 100644
index 0000000..108b2e0
--- /dev/null
+++ b/src/data/images/android/svg/symbol__minor__displeasure.svg
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg id="svg3351" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="80" width="100" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <metadata id="metadata3356">
+ <rdf:RDF>
+ <cc:Work rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+ <dc:title/>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <text id="style-symbol-minor" y="40" x="50" style="font-size:76px;dominant-baseline:central;text-anchor:middle;">怒</text>
+</svg>
diff --git a/src/data/images/android/svg/symbol__minor__displeasure_selected.svg b/src/data/images/android/svg/symbol__minor__displeasure_selected.svg
new file mode 100644
index 0000000..2d6cc49
--- /dev/null
+++ b/src/data/images/android/svg/symbol__minor__displeasure_selected.svg
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg id="svg3351" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="80" width="100" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <metadata id="metadata3356">
+ <rdf:RDF>
+ <cc:Work rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+ <dc:title/>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <text id="style-symbol-minor-selected" y="40" x="50" style="font-size:76px;dominant-baseline:central;text-anchor:middle;">怒</text>
+</svg>
diff --git a/src/data/images/android/svg/symbol__minor__face.svg b/src/data/images/android/svg/symbol__minor__face.svg
new file mode 100644
index 0000000..7d93d36
--- /dev/null
+++ b/src/data/images/android/svg/symbol__minor__face.svg
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg id="svg3338" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="80" width="80" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <metadata id="metadata3343">
+ <rdf:RDF>
+ <cc:Work rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+ <dc:title/>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g id="layer1" transform="translate(0,-972.36217)">
+ <path id="style-symbol-minor" d="m62.461706,1021.0934c-1.49375,2.99-9.87125,12.6912-21.15375,12.6912-10.9275,0-15.51125-4.23-19.7425-8.4612-6.0575-6.0575-2.1925-6.765-2.1925-6.765s20.375,16.3512,38.8575,1.125c2.8175-2.3213,5.64125-1.4113,4.23125,1.41m-35.96125-25.16752c2.72625,0,4.9375,3.1575,4.9375,7.05122,0,3.8938-2.21125,7.05-4.9375,7.05-2.725,0-4.935-3.1562-4.935-7.05,0-3.89372,2.21-7.05122,4.935-7.05122m27.49875,0c2.72625,0,4.9375,3.1575,4.9375,7.05122,0,3.8938-2.21125,7.05-4.9375,7.05-2.725,0-4.935-3.1562-4.935-7.05,0-3.89372,2.21-7.05122,4.935-7.05122m-13.24125-16.05c-40.63624018-1.80625-37.9274902,51.47002-37.9274902,51.47002s9.2475002,13.5475,35.7762402,13.5475c27.85625,0,38.4675-11.9388,38.4675-11.9388s4.32-51.27372-36.31625-53.07872" fill-rule="nonzero" style="fill:#000"/>
+ </g>
+</svg>
diff --git a/src/data/images/android/svg/symbol__minor__face_selected.svg b/src/data/images/android/svg/symbol__minor__face_selected.svg
new file mode 100644
index 0000000..e95d39f
--- /dev/null
+++ b/src/data/images/android/svg/symbol__minor__face_selected.svg
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg id="svg3338" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="80" width="80" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <metadata id="metadata3343">
+ <rdf:RDF>
+ <cc:Work rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+ <dc:title/>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g id="layer1" transform="translate(0,-972.36217)">
+ <path id="style-symbol-minor-selected" d="m62.461706,1021.0934c-1.49375,2.99-9.87125,12.6912-21.15375,12.6912-10.9275,0-15.51125-4.23-19.7425-8.4612-6.0575-6.0575-2.1925-6.765-2.1925-6.765s20.375,16.3512,38.8575,1.125c2.8175-2.3213,5.64125-1.4113,4.23125,1.41m-35.96125-25.16752c2.72625,0,4.9375,3.1575,4.9375,7.05122,0,3.8938-2.21125,7.05-4.9375,7.05-2.725,0-4.935-3.1562-4.935-7.05,0-3.89372,2.21-7.05122,4.935-7.05122m27.49875,0c2.72625,0,4.9375,3.1575,4.9375,7.05122,0,3.8938-2.21125,7.05-4.9375,7.05-2.725,0-4.935-3.1562-4.935-7.05,0-3.89372,2.21-7.05122,4.935-7.05122m-13.24125-16.05c-40.63624018-1.80625-37.9274902,51.47002-37.9274902,51.47002s9.2475002,13.5475,35.7762402,13.5475c27.85625,0,38.4675-11.9388,38.4675-11.9388s4.32-51.27372-36.31625-53.07872" fill-rule="nonzero" style="fill:#000"/>
+ </g>
+</svg>
diff --git a/src/data/images/android/svg/symbol__minor__food.svg b/src/data/images/android/svg/symbol__minor__food.svg
new file mode 100644
index 0000000..eb5be7a
--- /dev/null
+++ b/src/data/images/android/svg/symbol__minor__food.svg
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg id="svg3403" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="80" width="80" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <metadata id="metadata3408">
+ <rdf:RDF>
+ <cc:Work rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+ <dc:title/>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g id="layer1" transform="translate(0,-972.36218)">
+ <g id="g212" style="fill:#000" transform="matrix(1.25,0,0,-1.25,50.274198,1020.5943)">
+ <path id="style-symbol-minor" d="m0,0c-1.971-2.592-5.055-4.291-8.563-4.291-3.534,0-6.642,1.723-8.609,4.35-1.35,1.8-2.18,4.015-2.18,6.441,0,2.439,0.84,4.666,2.206,6.473,1.97,2.606,5.065,4.316,8.583,4.316,3.488,0,6.556-1.682,8.528-4.248,1.398-1.82,2.263-4.07,2.263-6.541,0-2.453-0.85-4.688-2.228-6.5m12.927,0.033c4.555,0.05,8.891,3.14,8.709,6.721-0.173,3.363-4.378,6.418-8.638,6.134-1.461-0.097-2.893-0.583-4.352-0.824-1.328-0.216-3.292-0.758-3.792,0.278-0.499,1.037,4.035,3.397,6.013,5.028,3.737,3.078,4.303,7.263,1.674,10.17-2.719,3.007-6.517,2.593-10.012-1.282-1.772-1.963-4.137-6.781-5.377-6.373-1.236,0.408,0.223,4.838,0.346,6.982,0.189,3.238,0.138,6.354-2.871,8.456-1.826,1.276-3.856,1.494-5.738,0.298-3.232-2.055-3.592-5.317-3.424-8.795,0.104-2.159,1.424-6.307,0.205-6.836-1.221-0.529-4.012,5.045-6.096,7.075-2.562,2.497-5.664,3.847-8.788,0.789-3.165-3.097-2.397-6.473,0.198-9.372,2.079-2.318,7.83-4.774,7.045-5.998-0.787-1.223-4.98,0.366-7.437,0.428-3.167,0.078-5.913-0.512-7.7-3.271-1.298-2.004-1.296-4.274,0.004-6.274,1.79-2.757,4.555-3.585,7.702-3.174,1.453,0.192,2.881,0.593,4.322,0.896,1.213,0.254,2.931,0.532,3.25-0.434,0.322-0.967-4.758-3.613-6.797-5.702-2.871-2.938-3.971-6.449-0.582-9.769,3.361-3.294,6.538-1.528,9.188,1.142,1.716,1.729,2.517,3.523,4.345,5.91,0.3,0.392,1.086,1.67,1.945,1.203,0.857-0.466-1.612-7.669-0.643-11.115,0.862-3.061,2.31-5.638,5.923-5.56,3.476,0.076,5.451,2.311,5.829,5.584,0.246,2.155-0.267,4.392-0.38,6.595-0.057,1.095-0.926,2.848,0.074,3.371,1,0.524,4.227-4.317,6.309-6.351,2.564-2.506,5.664-3.852,8.797-0.799,3.179,3.1,2.382,6.463-0.194,9.384-2.07,2.35-7.951,4.856-7.062,6.345,0.889,1.486,5.488-0.887,8.005-0.86" fill-rule="nonzero" style="fill:#000"/>
+ </g>
+ </g>
+</svg>
diff --git a/src/data/images/android/svg/symbol__minor__food_selected.svg b/src/data/images/android/svg/symbol__minor__food_selected.svg
new file mode 100644
index 0000000..53c3305
--- /dev/null
+++ b/src/data/images/android/svg/symbol__minor__food_selected.svg
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg id="svg3403" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="80" width="80" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <metadata id="metadata3408">
+ <rdf:RDF>
+ <cc:Work rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+ <dc:title/>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g id="layer1" transform="translate(0,-972.36218)">
+ <g id="g212" style="fill:#000" transform="matrix(1.25,0,0,-1.25,50.274198,1020.5943)">
+ <path id="style-symbol-minor-selected" d="m0,0c-1.971-2.592-5.055-4.291-8.563-4.291-3.534,0-6.642,1.723-8.609,4.35-1.35,1.8-2.18,4.015-2.18,6.441,0,2.439,0.84,4.666,2.206,6.473,1.97,2.606,5.065,4.316,8.583,4.316,3.488,0,6.556-1.682,8.528-4.248,1.398-1.82,2.263-4.07,2.263-6.541,0-2.453-0.85-4.688-2.228-6.5m12.927,0.033c4.555,0.05,8.891,3.14,8.709,6.721-0.173,3.363-4.378,6.418-8.638,6.134-1.461-0.097-2.893-0.583-4.352-0.824-1.328-0.216-3.292-0.758-3.792,0.278-0.499,1.037,4.035,3.397,6.013,5.028,3.737,3.078,4.303,7.263,1.674,10.17-2.719,3.007-6.517,2.593-10.012-1.282-1.772-1.963-4.137-6.781-5.377-6.373-1.236,0.408,0.223,4.838,0.346,6.982,0.189,3.238,0.138,6.354-2.871,8.456-1.826,1.276-3.856,1.494-5.738,0.298-3.232-2.055-3.592-5.317-3.424-8.795,0.104-2.159,1.424-6.307,0.205-6.836-1.221-0.529-4.012,5.045-6.096,7.075-2.562,2.497-5.664,3.847-8.788,0.789-3.165-3.097-2.397-6.473,0.198-9.372,2.079-2.318,7.83-4.774,7.045-5.998-0.787-1.223-4.98,0.366-7.437,0.428-3.167,0.078-5.913-0.512-7.7-3.271-1.298-2.004-1.296-4.274,0.004-6.274,1.79-2.757,4.555-3.585,7.702-3.174,1.453,0.192,2.881,0.593,4.322,0.896,1.213,0.254,2.931,0.532,3.25-0.434,0.322-0.967-4.758-3.613-6.797-5.702-2.871-2.938-3.971-6.449-0.582-9.769,3.361-3.294,6.538-1.528,9.188,1.142,1.716,1.729,2.517,3.523,4.345,5.91,0.3,0.392,1.086,1.67,1.945,1.203,0.857-0.466-1.612-7.669-0.643-11.115,0.862-3.061,2.31-5.638,5.923-5.56,3.476,0.076,5.451,2.311,5.829,5.584,0.246,2.155-0.267,4.392-0.38,6.595-0.057,1.095-0.926,2.848,0.074,3.371,1,0.524,4.227-4.317,6.309-6.351,2.564-2.506,5.664-3.852,8.797-0.799,3.179,3.1,2.382,6.463-0.194,9.384-2.07,2.35-7.951,4.856-7.062,6.345,0.889,1.486,5.488-0.887,8.005-0.86" fill-rule="nonzero" style="fill:#000"/>
+ </g>
+ </g>
+</svg>
diff --git a/src/data/images/android/svg/symbol__minor__fullhalf.svg b/src/data/images/android/svg/symbol__minor__fullhalf.svg
new file mode 100644
index 0000000..92f585c
--- /dev/null
+++ b/src/data/images/android/svg/symbol__minor__fullhalf.svg
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg id="svg3351" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="80" width="120" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <metadata id="metadata3356">
+ <rdf:RDF>
+ <cc:Work rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+ <dc:title/>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <text id="style-symbol-minor" y="40" x="60" style="font-size:48px;dominant-baseline:central;text-anchor:middle;">全/半</text>
+</svg>
diff --git a/src/data/images/android/svg/symbol__minor__fullhalf_selected.svg b/src/data/images/android/svg/symbol__minor__fullhalf_selected.svg
new file mode 100644
index 0000000..8e49ee8
--- /dev/null
+++ b/src/data/images/android/svg/symbol__minor__fullhalf_selected.svg
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg id="svg3351" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="80" width="120" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <metadata id="metadata3356">
+ <rdf:RDF>
+ <cc:Work rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+ <dc:title/>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <text id="style-symbol-minor-selected" y="40" x="60" style="font-size:48px;dominant-baseline:central;text-anchor:middle;">全/半</text>
+</svg>
diff --git a/src/data/images/android/svg/symbol__minor__general.svg b/src/data/images/android/svg/symbol__minor__general.svg
new file mode 100644
index 0000000..76caf1b
--- /dev/null
+++ b/src/data/images/android/svg/symbol__minor__general.svg
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg id="svg3303" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="80" width="100" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <metadata id="metadata3308">
+ <rdf:RDF>
+ <cc:Work rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+ <dc:title/>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <text id="style-symbol-minor" y="40" x="50" style="font-size:76px;dominant-baseline:central;text-anchor:middle;">♥</text>
+</svg>
diff --git a/src/data/images/android/svg/symbol__minor__general_selected.svg b/src/data/images/android/svg/symbol__minor__general_selected.svg
new file mode 100644
index 0000000..f28df05
--- /dev/null
+++ b/src/data/images/android/svg/symbol__minor__general_selected.svg
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg id="svg3303" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="80" width="100" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <metadata id="metadata3308">
+ <rdf:RDF>
+ <cc:Work rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+ <dc:title/>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <text id="style-symbol-minor-selected" y="40" x="50" style="font-size:76px;dominant-baseline:central;text-anchor:middle;">♥</text>
+</svg>
diff --git a/src/data/images/android/svg/symbol__minor__history.svg b/src/data/images/android/svg/symbol__minor__history.svg
new file mode 100644
index 0000000..74f5f0f
--- /dev/null
+++ b/src/data/images/android/svg/symbol__minor__history.svg
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg id="svg3195" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="80" width="100" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <metadata id="metadata3200">
+ <rdf:RDF>
+ <cc:Work rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+ <dc:title/>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g id="layer1" transform="translate(0,-972.3622)">
+ <g id="g164" style="fill:#000" transform="matrix(1.25,0,0,-1.25,71.251875,1025.9501)">
+ <path id="style-symbol-minor" fill-rule="nonzero" style="fill:#000" d="m0,0-19,10.87-2-4,19-10l2,3.13zm-20,30.87008-0.646-23.963,5,1-1.041,23.025-3.313-0.062zm2.998,5.6172c-14.126,0-25.62-11.49-25.62-25.617s11.494-25.617,25.62-25.617,25.62,11.49,25.62,25.617-11.494,25.617-25.62,25.617m0-55.617c-16.541,0-29.998,13.459-29.998,30s13.457,30,29.998,30,29.999-13.459,29.999-30-13.458-30-29.999-30"/>
+ </g>
+ </g>
+</svg>
diff --git a/src/data/images/android/svg/symbol__minor__history_selected.svg b/src/data/images/android/svg/symbol__minor__history_selected.svg
new file mode 100644
index 0000000..91236ab
--- /dev/null
+++ b/src/data/images/android/svg/symbol__minor__history_selected.svg
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg id="svg3195" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="80" width="100" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <metadata id="metadata3200">
+ <rdf:RDF>
+ <cc:Work rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+ <dc:title/>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g id="layer1" transform="translate(0,-972.3622)">
+ <g id="g164" style="fill:#000" transform="matrix(1.25,0,0,-1.25,71.251875,1025.9501)">
+ <path id="style-symbol-minor-selected" fill-rule="nonzero" style="fill:#000" d="m0,0-19,10.87-2-4,19-10l2,3.13zm-20,30.87008-0.646-23.963,5,1-1.041,23.025-3.313-0.062zm2.998,5.6172c-14.126,0-25.62-11.49-25.62-25.617s11.494-25.617,25.62-25.617,25.62,11.49,25.62,25.617-11.494,25.617-25.62,25.617m0-55.617c-16.541,0-29.998,13.459-29.998,30s13.457,30,29.998,30,29.999-13.459,29.999-30-13.458-30-29.999-30"/>
+ </g>
+ </g>
+</svg>
diff --git a/src/data/images/android/svg/symbol__minor__math.svg b/src/data/images/android/svg/symbol__minor__math.svg
new file mode 100644
index 0000000..0493128
--- /dev/null
+++ b/src/data/images/android/svg/symbol__minor__math.svg
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg id="svg3175" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="80" width="100" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <metadata id="metadata3180">
+ <rdf:RDF>
+ <cc:Work rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+ <dc:title/>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <path id="style-symbol-minor" fill-rule="nonzero" fill="#000" d="m69.810889,77.500001,7.075445,0,0-7.075445-7.075445,0,0,7.075445zm-12.735801-14.15089,32.547047,0,0-5.660356-32.547047,0,0,5.660356zm19.811246-18.396157-7.075445,0,0,7.075445,7.075445,0,0-7.075445zm-39.621784,2.829895-9.905623,11.320712-9.905623-11.320712-4.245267,4.245267,10.388168,10.689582-10.167414,10.383923,4.024513,4.398097,9.905623-9.905623,10.290527,9.427323,3.918382-3.919797l-10.198547-10.383923,10.198547-10.385338-4.303286-4.549511zm46.697229-31.131675-19.811246,0,0,5.660356,19.811246,0,0-5.660356zm-53.772674-14.1511729h-7.075445v14.1508899h-12.735801v5.660356h12.735801v14.15089h7.075445v-14.15089h12.735801v-5.660356h-12.735801v-14.1508899z"/>
+</svg>
diff --git a/src/data/images/android/svg/symbol__minor__math_selected.svg b/src/data/images/android/svg/symbol__minor__math_selected.svg
new file mode 100644
index 0000000..b629d36
--- /dev/null
+++ b/src/data/images/android/svg/symbol__minor__math_selected.svg
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg id="svg3175" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="80" width="100" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <metadata id="metadata3180">
+ <rdf:RDF>
+ <cc:Work rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+ <dc:title/>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <path id="style-symbol-minor-selected" fill-rule="nonzero" fill="#000" d="m69.810889,77.500001,7.075445,0,0-7.075445-7.075445,0,0,7.075445zm-12.735801-14.15089,32.547047,0,0-5.660356-32.547047,0,0,5.660356zm19.811246-18.396157-7.075445,0,0,7.075445,7.075445,0,0-7.075445zm-39.621784,2.829895-9.905623,11.320712-9.905623-11.320712-4.245267,4.245267,10.388168,10.689582-10.167414,10.383923,4.024513,4.398097,9.905623-9.905623,10.290527,9.427323,3.918382-3.919797l-10.198547-10.383923,10.198547-10.385338-4.303286-4.549511zm46.697229-31.131675-19.811246,0,0,5.660356,19.811246,0,0-5.660356zm-53.772674-14.1511729h-7.075445v14.1508899h-12.735801v5.660356h12.735801v14.15089h7.075445v-14.15089h12.735801v-5.660356h-12.735801v-14.1508899z"/>
+</svg>
diff --git a/src/data/images/android/svg/symbol__minor__nature.svg b/src/data/images/android/svg/symbol__minor__nature.svg
new file mode 100644
index 0000000..50a5384
--- /dev/null
+++ b/src/data/images/android/svg/symbol__minor__nature.svg
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg id="svg3623" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="80" width="80" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <metadata id="metadata3628">
+ <rdf:RDF>
+ <cc:Work rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+ <dc:title/>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g id="layer1" transform="translate(0,-972.36218)">
+ <g id="g236" transform="matrix(1.25,0,0,-1.25,38.75,983.61218)">
+ <path id="style-symbol-minor" fill-rule="nonzero" style="fill:#777" d="M0,0-28-46,30-46,0,0z"/>
+ </g>
+ </g>
+</svg>
diff --git a/src/data/images/android/svg/symbol__minor__nature_selected.svg b/src/data/images/android/svg/symbol__minor__nature_selected.svg
new file mode 100644
index 0000000..0b43dc2
--- /dev/null
+++ b/src/data/images/android/svg/symbol__minor__nature_selected.svg
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg id="svg3623" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="80" width="80" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <metadata id="metadata3628">
+ <rdf:RDF>
+ <cc:Work rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+ <dc:title/>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g id="layer1" transform="translate(0,-972.36218)">
+ <g id="g236" transform="matrix(1.25,0,0,-1.25,38.75,983.61218)">
+ <path id="style-symbol-minor-selected" fill-rule="nonzero" style="fill:#777777" d="M0,0-28-46,30-46,0,0z"/>
+ </g>
+ </g>
+</svg>
diff --git a/src/data/images/android/svg/symbol__minor__parenthesis.svg b/src/data/images/android/svg/symbol__minor__parenthesis.svg
new file mode 100644
index 0000000..723fdc5
--- /dev/null
+++ b/src/data/images/android/svg/symbol__minor__parenthesis.svg
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg id="svg3351" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="80" width="100" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <metadata id="metadata3356">
+ <rdf:RDF>
+ <cc:Work rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+ <dc:title/>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <text id="style-symbol-minor" y="40" x="50" style="font-size:55px;dominant-baseline:central;text-anchor:middle;">( )</text>
+</svg>
diff --git a/src/data/images/android/svg/symbol__minor__parenthesis_selected.svg b/src/data/images/android/svg/symbol__minor__parenthesis_selected.svg
new file mode 100644
index 0000000..68f3c67
--- /dev/null
+++ b/src/data/images/android/svg/symbol__minor__parenthesis_selected.svg
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg id="svg3351" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="80" width="100" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <metadata id="metadata3356">
+ <rdf:RDF>
+ <cc:Work rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+ <dc:title/>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <text id="style-symbol-minor-selected" y="40" x="50" style="font-size:55px;dominant-baseline:central;text-anchor:middle;">( )</text>
+</svg>
diff --git a/src/data/images/android/svg/symbol__minor__sadness.svg b/src/data/images/android/svg/symbol__minor__sadness.svg
new file mode 100644
index 0000000..0fc3d9e
--- /dev/null
+++ b/src/data/images/android/svg/symbol__minor__sadness.svg
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg id="svg3351" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="80" width="100" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <metadata id="metadata3356">
+ <rdf:RDF>
+ <cc:Work rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+ <dc:title/>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <text id="style-symbol-minor" y="40" x="50" style="font-size:76px;dominant-baseline:central;text-anchor:middle;">悲</text>
+</svg>
diff --git a/src/data/images/android/svg/symbol__minor__sadness_selected.svg b/src/data/images/android/svg/symbol__minor__sadness_selected.svg
new file mode 100644
index 0000000..9953245
--- /dev/null
+++ b/src/data/images/android/svg/symbol__minor__sadness_selected.svg
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg id="svg3351" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="80" width="100" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <metadata id="metadata3356">
+ <rdf:RDF>
+ <cc:Work rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+ <dc:title/>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <text id="style-symbol-minor-selected" y="40" x="50" style="font-size:76px;dominant-baseline:central;text-anchor:middle;">悲</text>
+</svg>
diff --git a/src/data/images/android/svg/symbol__minor__smile.svg b/src/data/images/android/svg/symbol__minor__smile.svg
new file mode 100644
index 0000000..fb2cba4
--- /dev/null
+++ b/src/data/images/android/svg/symbol__minor__smile.svg
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg id="svg3351" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="80" width="100" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <metadata id="metadata3356">
+ <rdf:RDF>
+ <cc:Work rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+ <dc:title/>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <text id="style-symbol-minor" y="40" x="50" style="font-size:76px;dominant-baseline:central;text-anchor:middle;">喜</text>
+</svg>
diff --git a/src/data/images/android/svg/symbol__minor__smile_selected.svg b/src/data/images/android/svg/symbol__minor__smile_selected.svg
new file mode 100644
index 0000000..3b24ea3
--- /dev/null
+++ b/src/data/images/android/svg/symbol__minor__smile_selected.svg
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg id="svg3351" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="80" width="100" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <metadata id="metadata3356">
+ <rdf:RDF>
+ <cc:Work rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+ <dc:title/>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <text id="style-symbol-minor-selected" y="40" x="50" style="font-size:76px;dominant-baseline:central;text-anchor:middle;">喜</text>
+</svg>
diff --git a/src/data/images/android/svg/symbol__minor__surprise.svg b/src/data/images/android/svg/symbol__minor__surprise.svg
new file mode 100644
index 0000000..c0bfaea
--- /dev/null
+++ b/src/data/images/android/svg/symbol__minor__surprise.svg
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg id="svg3351" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="80" width="100" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <metadata id="metadata3356">
+ <rdf:RDF>
+ <cc:Work rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+ <dc:title/>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <text id="style-symbol-minor" y="40" x="50" style="font-size:76px;dominant-baseline:central;text-anchor:middle;">驚</text>
+</svg>
diff --git a/src/data/images/android/svg/symbol__minor__surprise_selected.svg b/src/data/images/android/svg/symbol__minor__surprise_selected.svg
new file mode 100644
index 0000000..df1ad2e
--- /dev/null
+++ b/src/data/images/android/svg/symbol__minor__surprise_selected.svg
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg id="svg3351" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="80" width="100" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <metadata id="metadata3356">
+ <rdf:RDF>
+ <cc:Work rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+ <dc:title/>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <text id="style-symbol-minor-selected" y="40" x="50" style="font-size:76px;dominant-baseline:central;text-anchor:middle;">驚</text>
+</svg>
diff --git a/src/data/images/android/svg/symbol__minor__sweat.svg b/src/data/images/android/svg/symbol__minor__sweat.svg
new file mode 100644
index 0000000..cb6893f
--- /dev/null
+++ b/src/data/images/android/svg/symbol__minor__sweat.svg
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg id="svg3351" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="80" width="100" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <metadata id="metadata3356">
+ <rdf:RDF>
+ <cc:Work rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+ <dc:title/>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <text id="style-symbol-minor" y="40" x="50" style="font-size:76px;dominant-baseline:central;text-anchor:middle;">焦</text>
+</svg>
diff --git a/src/data/images/android/svg/symbol__minor__sweat_selected.svg b/src/data/images/android/svg/symbol__minor__sweat_selected.svg
new file mode 100644
index 0000000..81d2b64
--- /dev/null
+++ b/src/data/images/android/svg/symbol__minor__sweat_selected.svg
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg id="svg3351" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="80" width="100" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <metadata id="metadata3356">
+ <rdf:RDF>
+ <cc:Work rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+ <dc:title/>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <text id="style-symbol-minor-selected" y="40" x="50" style="font-size:76px;dominant-baseline:central;text-anchor:middle;">焦</text>
+</svg>
diff --git a/src/data/images/android/svg/twelvekeys__alphabet__01.svg b/src/data/images/android/svg/twelvekeys__alphabet__01.svg
deleted file mode 100644
index d0e4803..0000000
--- a/src/data/images/android/svg/twelvekeys__alphabet__01.svg
+++ /dev/null
@@ -1,46 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="twelvekeys_x5F__x5F_alphabet_x5F__x5F_01"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="105px" height="87px"
- viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main">
- <path style="fill:#272727;" d=""/>
- <path style="fill:#272727;" d=""/>
- <path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-main_1_">
- <path style="fill:#272727;" d=""/>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__alphabet__02.svg b/src/data/images/android/svg/twelvekeys__alphabet__02.svg
deleted file mode 100644
index ad2b47a..0000000
--- a/src/data/images/android/svg/twelvekeys__alphabet__02.svg
+++ /dev/null
@@ -1,41 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="release" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
- <path style="fill:#272727;" d=""/>
- <path style="fill:#272727;" d=""/>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__alphabet__03.svg b/src/data/images/android/svg/twelvekeys__alphabet__03.svg
deleted file mode 100644
index ad2b47a..0000000
--- a/src/data/images/android/svg/twelvekeys__alphabet__03.svg
+++ /dev/null
@@ -1,41 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="release" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
- <path style="fill:#272727;" d=""/>
- <path style="fill:#272727;" d=""/>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__alphabet__04.svg b/src/data/images/android/svg/twelvekeys__alphabet__04.svg
deleted file mode 100644
index ad2b47a..0000000
--- a/src/data/images/android/svg/twelvekeys__alphabet__04.svg
+++ /dev/null
@@ -1,41 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="release" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
- <path style="fill:#272727;" d=""/>
- <path style="fill:#272727;" d=""/>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__alphabet__05.svg b/src/data/images/android/svg/twelvekeys__alphabet__05.svg
deleted file mode 100644
index ad2b47a..0000000
--- a/src/data/images/android/svg/twelvekeys__alphabet__05.svg
+++ /dev/null
@@ -1,41 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="release" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
- <path style="fill:#272727;" d=""/>
- <path style="fill:#272727;" d=""/>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__alphabet__06.svg b/src/data/images/android/svg/twelvekeys__alphabet__06.svg
deleted file mode 100644
index ad2b47a..0000000
--- a/src/data/images/android/svg/twelvekeys__alphabet__06.svg
+++ /dev/null
@@ -1,41 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="release" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
- <path style="fill:#272727;" d=""/>
- <path style="fill:#272727;" d=""/>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__alphabet__07.svg b/src/data/images/android/svg/twelvekeys__alphabet__07.svg
deleted file mode 100644
index 4fb7dbf..0000000
--- a/src/data/images/android/svg/twelvekeys__alphabet__07.svg
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="release" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
- <path style="fill:#272727;" d=""/>
- <path style="fill:#272727;" d=""/>
- <path style="fill:#272727;" d=""/>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__alphabet__08.svg b/src/data/images/android/svg/twelvekeys__alphabet__08.svg
deleted file mode 100644
index ad2b47a..0000000
--- a/src/data/images/android/svg/twelvekeys__alphabet__08.svg
+++ /dev/null
@@ -1,41 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="release" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
- <path style="fill:#272727;" d=""/>
- <path style="fill:#272727;" d=""/>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__alphabet__09.svg b/src/data/images/android/svg/twelvekeys__alphabet__09.svg
deleted file mode 100644
index 4fb7dbf..0000000
--- a/src/data/images/android/svg/twelvekeys__alphabet__09.svg
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="release" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
- <path style="fill:#272727;" d=""/>
- <path style="fill:#272727;" d=""/>
- <path style="fill:#272727;" d=""/>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__alphabet__10.svg b/src/data/images/android/svg/twelvekeys__alphabet__10.svg
index b3fc5ef..b55eb8c 100644
--- a/src/data/images/android/svg/twelvekeys__alphabet__10.svg
+++ b/src/data/images/android/svg/twelvekeys__alphabet__10.svg
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
<!--
Copyright 2010-2014, Google Inc.
All rights reserved.
@@ -30,17 +30,14 @@
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-->
<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="twelvekeys_x5F__x5F_alphabet_x5F__x5F_10"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="105px" height="87px"
- viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main">
- <path style="fill:#272727;" d=""/>
-</g>
+<svg version="1.1" id="twelvekeys_alphabet_10" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
<g id="style-keyicon-main_1_">
- <path style="fill:#272727;" d=""/>
+ <text x="33" y="43.5" style="font-size:26px;text-anchor:middle;dominant-baseline:central;fill:#272727;">a</text>
</g>
<g id="style-keyicon-main_2_">
- <path style="fill:#272727;" d=""/>
+ <text x="52.5" y="43.5" style="font-size:20px;text-anchor:middle;dominant-baseline:central;fill:#272727;">⇔</text>
+</g>
+<g id="style-keyicon-main_3_">
+ <text x="72" y="43.5" style="font-size:26px;text-anchor:middle;dominant-baseline:central;fill:#272727;">A</text>
</g>
</svg>
diff --git a/src/data/images/android/svg/twelvekeys__alphabet__11.svg b/src/data/images/android/svg/twelvekeys__alphabet__11.svg
deleted file mode 100644
index 7f1a0fc..0000000
--- a/src/data/images/android/svg/twelvekeys__alphabet__11.svg
+++ /dev/null
@@ -1,45 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="twelvekeys_x5F__x5F_alphabet_x5F__x5F_11"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="105px" height="87px"
- viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main">
- <path style="fill:#272727;" d=""/>
- <path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-main_1_">
- <path style="fill:#272727;" d=""/>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__alphabet__12.svg b/src/data/images/android/svg/twelvekeys__alphabet__12.svg
deleted file mode 100644
index 88c9dc5..0000000
--- a/src/data/images/android/svg/twelvekeys__alphabet__12.svg
+++ /dev/null
@@ -1,45 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="twelvekeys_x5F__x5F_alphabet_x5F__x5F_12"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="105px" height="87px"
- viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main">
- <path style="fill:#272727;" d=""/>
- <path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-main_1_">
- <path style="fill:#272727;" d=""/>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__alphabet__popup__10.svg b/src/data/images/android/svg/twelvekeys__alphabet__popup__10.svg
new file mode 100644
index 0000000..6ee950e
--- /dev/null
+++ b/src/data/images/android/svg/twelvekeys__alphabet__popup__10.svg
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<svg xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xml:space="preserve"
+ version="1.1"
+ width="87px"
+ height="87px">
+ <!-- Original size: 105 x 87 -->
+ <g id="style-keyicon-main" transform="matrix(1.2,0,0,1.2,-19.5,-8.7)">
+ <text x="33" y="43.5" style="font-size:26px;text-anchor:middle;dominant-baseline:central;fill:#272727;">a</text>
+ <text x="52.5" y="43.5" style="font-size:20px;text-anchor:middle;dominant-baseline:central;fill:#272727;">⇔</text>
+ <text x="72" y="43.5" style="font-size:26px;text-anchor:middle;dominant-baseline:central;fill:#272727;">A</text>
+ </g>
+</svg>
diff --git a/src/data/images/android/svg/twelvekeys__alphabet__support__popup__01.svg b/src/data/images/android/svg/twelvekeys__alphabet__support__popup__01.svg
deleted file mode 100644
index 472a72d..0000000
--- a/src/data/images/android/svg/twelvekeys__alphabet__support__popup__01.svg
+++ /dev/null
@@ -1,52 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<circle id="style-keypopup-highlight" style="fill-rule:evenodd;clip-rule:evenodd;fill:#F7982D;" cx="56" cy="56" r="22"/>
-<g id="style-keyicon-main_5_">
- <path d=""/>
-</g>
-<g id="style-keyicon-main_6_">
- <path d=""/>
-</g>
-<g id="style-keyicon-main_7_">
- <path d=""/>
-</g>
-<g id="style-keyicon-main_8_">
- <path d=""/>
-</g>
-<g id="style-keyicon-main_9_">
- <path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__alphabet__support__popup__02.svg b/src/data/images/android/svg/twelvekeys__alphabet__support__popup__02.svg
deleted file mode 100644
index 0454021..0000000
--- a/src/data/images/android/svg/twelvekeys__alphabet__support__popup__02.svg
+++ /dev/null
@@ -1,50 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<circle id="style-keypopup-highlight" style="fill-rule:evenodd;clip-rule:evenodd;fill:#F7982D;" cx="56" cy="56" r="22"/>
-<g id="style-keyicon-main_5_">
- <path d=""/>
-</g>
-<g id="style-keyicon-main_6_">
-</g>
-<g id="style-keyicon-main_7_">
- <path d=""/>
-</g>
-<g id="style-keyicon-main_8_">
-</g>
-<g id="style-keyicon-main_9_">
- <path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__alphabet__support__popup__03.svg b/src/data/images/android/svg/twelvekeys__alphabet__support__popup__03.svg
deleted file mode 100644
index 0454021..0000000
--- a/src/data/images/android/svg/twelvekeys__alphabet__support__popup__03.svg
+++ /dev/null
@@ -1,50 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<circle id="style-keypopup-highlight" style="fill-rule:evenodd;clip-rule:evenodd;fill:#F7982D;" cx="56" cy="56" r="22"/>
-<g id="style-keyicon-main_5_">
- <path d=""/>
-</g>
-<g id="style-keyicon-main_6_">
-</g>
-<g id="style-keyicon-main_7_">
- <path d=""/>
-</g>
-<g id="style-keyicon-main_8_">
-</g>
-<g id="style-keyicon-main_9_">
- <path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__alphabet__support__popup__04.svg b/src/data/images/android/svg/twelvekeys__alphabet__support__popup__04.svg
deleted file mode 100644
index 0454021..0000000
--- a/src/data/images/android/svg/twelvekeys__alphabet__support__popup__04.svg
+++ /dev/null
@@ -1,50 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<circle id="style-keypopup-highlight" style="fill-rule:evenodd;clip-rule:evenodd;fill:#F7982D;" cx="56" cy="56" r="22"/>
-<g id="style-keyicon-main_5_">
- <path d=""/>
-</g>
-<g id="style-keyicon-main_6_">
-</g>
-<g id="style-keyicon-main_7_">
- <path d=""/>
-</g>
-<g id="style-keyicon-main_8_">
-</g>
-<g id="style-keyicon-main_9_">
- <path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__alphabet__support__popup__05.svg b/src/data/images/android/svg/twelvekeys__alphabet__support__popup__05.svg
deleted file mode 100644
index 0454021..0000000
--- a/src/data/images/android/svg/twelvekeys__alphabet__support__popup__05.svg
+++ /dev/null
@@ -1,50 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<circle id="style-keypopup-highlight" style="fill-rule:evenodd;clip-rule:evenodd;fill:#F7982D;" cx="56" cy="56" r="22"/>
-<g id="style-keyicon-main_5_">
- <path d=""/>
-</g>
-<g id="style-keyicon-main_6_">
-</g>
-<g id="style-keyicon-main_7_">
- <path d=""/>
-</g>
-<g id="style-keyicon-main_8_">
-</g>
-<g id="style-keyicon-main_9_">
- <path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__alphabet__support__popup__06.svg b/src/data/images/android/svg/twelvekeys__alphabet__support__popup__06.svg
deleted file mode 100644
index 0454021..0000000
--- a/src/data/images/android/svg/twelvekeys__alphabet__support__popup__06.svg
+++ /dev/null
@@ -1,50 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<circle id="style-keypopup-highlight" style="fill-rule:evenodd;clip-rule:evenodd;fill:#F7982D;" cx="56" cy="56" r="22"/>
-<g id="style-keyicon-main_5_">
- <path d=""/>
-</g>
-<g id="style-keyicon-main_6_">
-</g>
-<g id="style-keyicon-main_7_">
- <path d=""/>
-</g>
-<g id="style-keyicon-main_8_">
-</g>
-<g id="style-keyicon-main_9_">
- <path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__alphabet__support__popup__07.svg b/src/data/images/android/svg/twelvekeys__alphabet__support__popup__07.svg
deleted file mode 100644
index 19016bd..0000000
--- a/src/data/images/android/svg/twelvekeys__alphabet__support__popup__07.svg
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<circle id="style-keypopup-highlight" style="fill-rule:evenodd;clip-rule:evenodd;fill:#F7982D;" cx="56" cy="56" r="22"/>
-<g id="style-keyicon-main_5_">
- <path d=""/>
-</g>
-<g id="style-keyicon-main_6_">
- <path d=""/>
-</g>
-<g id="style-keyicon-main_7_">
- <path d=""/>
-</g>
-<g id="style-keyicon-main_8_">
-</g>
-<g id="style-keyicon-main_9_">
- <path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__alphabet__support__popup__08.svg b/src/data/images/android/svg/twelvekeys__alphabet__support__popup__08.svg
deleted file mode 100644
index 372346f..0000000
--- a/src/data/images/android/svg/twelvekeys__alphabet__support__popup__08.svg
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<circle id="style-keypopup-highlight" style="fill-rule:evenodd;clip-rule:evenodd;fill:#F7982D;" cx="56" cy="56" r="22"/>
-<g id="style-keyicon-main_5_">
- <path d=""
- />
-</g>
-<g id="style-keyicon-main_6_">
-</g>
-<g id="style-keyicon-main_7_">
- <path d=""/>
-</g>
-<g id="style-keyicon-main_8_">
-</g>
-<g id="style-keyicon-main_9_">
- <path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__alphabet__support__popup__09.svg b/src/data/images/android/svg/twelvekeys__alphabet__support__popup__09.svg
deleted file mode 100644
index 19016bd..0000000
--- a/src/data/images/android/svg/twelvekeys__alphabet__support__popup__09.svg
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<circle id="style-keypopup-highlight" style="fill-rule:evenodd;clip-rule:evenodd;fill:#F7982D;" cx="56" cy="56" r="22"/>
-<g id="style-keyicon-main_5_">
- <path d=""/>
-</g>
-<g id="style-keyicon-main_6_">
- <path d=""/>
-</g>
-<g id="style-keyicon-main_7_">
- <path d=""/>
-</g>
-<g id="style-keyicon-main_8_">
-</g>
-<g id="style-keyicon-main_9_">
- <path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__alphabet__support__popup__11.svg b/src/data/images/android/svg/twelvekeys__alphabet__support__popup__11.svg
deleted file mode 100644
index 19016bd..0000000
--- a/src/data/images/android/svg/twelvekeys__alphabet__support__popup__11.svg
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<circle id="style-keypopup-highlight" style="fill-rule:evenodd;clip-rule:evenodd;fill:#F7982D;" cx="56" cy="56" r="22"/>
-<g id="style-keyicon-main_5_">
- <path d=""/>
-</g>
-<g id="style-keyicon-main_6_">
- <path d=""/>
-</g>
-<g id="style-keyicon-main_7_">
- <path d=""/>
-</g>
-<g id="style-keyicon-main_8_">
-</g>
-<g id="style-keyicon-main_9_">
- <path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__alphabet__support__popup__12.svg b/src/data/images/android/svg/twelvekeys__alphabet__support__popup__12.svg
deleted file mode 100644
index 8fff803..0000000
--- a/src/data/images/android/svg/twelvekeys__alphabet__support__popup__12.svg
+++ /dev/null
@@ -1,52 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<circle id="style-keypopup-highlight" style="fill-rule:evenodd;clip-rule:evenodd;fill:#F7982D;" cx="56" cy="56" r="22"/>
-<g id="style-keyicon-main_5_">
- <path d=""
- />
-</g>
-<g id="style-keyicon-main_6_">
- <path d=""/>
-</g>
-<g id="style-keyicon-main_7_">
- <path d=""/>
-</g>
-<g id="style-keyicon-main_8_">
-</g>
-<g id="style-keyicon-main_9_">
- <path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__function__alphabet__icon.svg b/src/data/images/android/svg/twelvekeys__function__alphabet__icon.svg
index 316ba4a..31548a9 100644
--- a/src/data/images/android/svg/twelvekeys__function__alphabet__icon.svg
+++ b/src/data/images/android/svg/twelvekeys__function__alphabet__icon.svg
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!--
Copyright 2010-2014, Google Inc.
All rights reserved.
@@ -29,18 +29,19 @@
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="twelvekeys_x5F__x5F_function_x5F__x5F_alphabet_x5F__x5F_icon"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="82px" height="87px"
- viewBox="0 0 82 87" style="enable-background:new 0 0 82 87;" xml:space="preserve">
-<g id="style-keyicon-function-dark">
- <path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-function">
- <path style="fill:#DDDDDD;" d=""/>
-</g>
-<g id="style-keyicon-function-dark_1_">
- <path style="fill:#272727;" d=""/>
-</g>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ version="1.1"
+ width="68"
+ height="56">
+ <!-- Original size: 68 x 56 -->
+ <g transform="matrix(0.78,0,0,0.78,7.98,2.70)">
+ <path id="style-keyicon-function-dark" opacity="0.5" d="m16.555652,31.63854c-1.310925,0-2.715213,0.189612-4.2119,0.561137v3.650763l-0.420613,4.632512c1.870138-2.246475,3.41495-5.194612,4.632513-8.844412m-6.7384625,10.809837c-0.28105-1.590049-0.421575-3.881762-0.421575-6.878987v-2.387c-3.93085,1.965425-5.896275,4.49295-5.896275,7.581612,0,0.842188,0.3031875,1.614113,0.91245,2.315775,0.6073375,0.702626,1.2397,1.052975,1.8951625,1.052975,1.0289125,0,2.19835-0.561137,3.5102375-1.684375m5.7557495,6.0368c-0.28105-1.030837-0.656425-2.05975-1.123237-3.088662,7.392962-0.466813,11.090887-2.807612,11.090887-7.019512,0-3.180101-2.01355-5.286051-6.0368-6.316888-1.779662,5.148413-3.93085,8.938737-6.457412,11.370975-2.527525,2.435125-4.868325,3.6498-7.0195125,3.6498-1.4986125,0-2.785475-0.5852-3.8605875-1.754638-1.078-1.168475-1.615075-2.643025-1.615075-4.421725,0-4.865437,2.9481375-8.469037,8.8444125-10.809837,0-1.685338,0.0462-3.275388,0.140525-4.774h-7.58065v-3.0877c1.1232375,0.18865,2.6670875,0.280087,4.6325125,0.280087,0.9345875,0,2.011625-0.04524,3.2291875-0.140525,0-0.652575,0.140525-2.010662,0.4206125-4.070412l3.088662,0.139562-0.420612,3.791288,13.195875-0.28105,0.140525,2.948137-13.61745,0.420613c-0.09433,0.84315-0.140525,2.10595-0.140525,3.791287,1.309-0.28105,2.527525-0.421575,3.6498-0.421575,0.186725,0,0.607337,0.04909,1.263762,0.140525,0.0924-0.372487,0.186725-0.934587,0.28105-1.684375l3.088663,0.701663c0,0.18865-0.140525,0.656425-0.421575,1.403325,5.708587,1.404287,8.563363,4.49295,8.563363,9.265987,0,2.621851-0.982713,4.751863-2.948138,6.388113s-5.4285,2.82975-10.388263,3.579537" fill-rule="nonzero" fill="#000"/>
+ </g>
+ <g transform="matrix(0.76,0,0,0.76,7.66,6.72)">
+ <path id="style-keyicon-twelvekeys-function" opacity="0.80000299" d="m48.39496,43.654486c3.3418,0,5.607525-0.836413,8.053237-2.422613,2.445713-1.5862,3.682525-3.721025,4.55455-6.214862l0.0087-6.451638-9.010925-0.01829c-3.536225,0-5.826975,0.34265-8.12735,2.0251-2.301338,1.683412-3.239775,3.52275-3.239775,5.895312,0,2.229151,0.615037,3.805725,2.080925,5.160925,1.464925,1.356163,3.113688,2.026063,5.680675,2.026063m13.893687,3.716212c-0.282012-1.232962-0.537075-1.981787-0.7392-2.963537-0.205012-0.999075-0.290675-1.807575-0.290675-2.849-1.356162,2.131937-2.727725,3.094437-5.173437,4.486212-2.446675,1.392738-5.25525,2.088625-8.42765,2.088625-3.85,0-6.834713-1.022175-8.954138-3.069412-2.118462-2.045313-3.178175-4.82405-3.178175-8.33525s1.537113-6.594088,4.613263-8.77415c3.075187-2.1791,7.070525-3.26865,11.986975-3.26865h8.904087l-0.02695-4.443863c0-2.808575-0.668937-4.671012-2.4486-6.269725-1.780625-1.59775-3.456337-2.233-6.4218-2.253212-2.673825-0.01829-4.860625,0.389812-6.689375,1.843187-1.82875,1.452413-3.003962,3.119463-3.003962,5.322625l-4.803838,0.02021,0.0058-0.2387c-0.145399-2.953907,1.001901-5.550732,3.678613-7.791432,2.674788-2.239737,6.397738-3.360087,10.708775-3.360087,4.310075,0,7.77315,1.1020625,10.388263,3.305225,2.616075,2.204125,3.720062,5.160925,3.720062,9.277537l-0.0058,19.32315c0,1.380226,0.287788,2.755638,0.445638,4.063675,0.156888,1.307075,0.509162,2.603563,0.872025,3.886575h-5.159963z" fill-rule="nonzero" fill="#000"/>
+ </g>
</svg>
diff --git a/src/data/images/android/svg/twelvekeys__function__alphabet__popup.svg b/src/data/images/android/svg/twelvekeys__function__alphabet__popup.svg
deleted file mode 100644
index f47ef89..0000000
--- a/src/data/images/android/svg/twelvekeys__function__alphabet__popup.svg
+++ /dev/null
@@ -1,46 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="twelvekeys_x5F__x5F_function_x5F__x5F_alphabet_x5F__x5F_popup"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="82px" height="87px"
- viewBox="0 0 82 87" style="enable-background:new 0 0 82 87;" xml:space="preserve">
-<g id="style-keyicon-function-popup-dark_1_">
- <path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-popup-function">
- <path style="fill:#DDDDDD;" d=""/>
-</g>
-<g id="style-keyicon-popup-function-dark">
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__function__delete__icon.svg b/src/data/images/android/svg/twelvekeys__function__delete__icon.svg
deleted file mode 100644
index 8a4291f..0000000
--- a/src/data/images/android/svg/twelvekeys__function__delete__icon.svg
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="twelvekeys_x5F__x5F_function_x5F__x5F_delete_x5F__x5F_icon"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="82px" height="87px"
- viewBox="0 0 82 87" style="enable-background:new 0 0 82 87;" xml:space="preserve">
-<path id="" style="fill-rule:evenodd;clip-rule:evenodd;fill:#DDDDDD;" d="M57.03,31H33.234v0.066H33.2
- L21,43.032L33.2,55l0.034-0.032V55h23.764L59,53.033V33.064L57.03,31z M48.431,45.666l-1.797,1.766l-2.702-2.667l-2.698,2.667
- l-1.801-1.766l2.702-2.668l-2.702-2.666l1.801-1.766l2.698,2.665l2.702-2.665l1.797,1.798l-2.695,2.634L48.431,45.666z"/>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__function__enter__icon.svg b/src/data/images/android/svg/twelvekeys__function__enter__icon.svg
deleted file mode 100644
index 0c93169..0000000
--- a/src/data/images/android/svg/twelvekeys__function__enter__icon.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="twelvekeys_x5F__x5F_function_x5F__x5F_enter_x5F__x5F_icon"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="82px" height="87px"
- viewBox="0 0 82 87" style="enable-background:new 0 0 82 87;" xml:space="preserve">
-<polygon id="style-keyicon-function_9_" style="fill:#DDDDDD;" points="49.026,28.419 49.026,41.398 46.99,43.5 38.148,43.5
- 38.148,37.595 36.647,37.595 23,47.471 23,47.872 36.846,57.581 38.148,57.581 38.148,51.542 55.031,51.542 57,49.44 57,28.419 "/>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__function__kana__icon.svg b/src/data/images/android/svg/twelvekeys__function__kana__icon.svg
index 74a3136..46d50a4 100644
--- a/src/data/images/android/svg/twelvekeys__function__kana__icon.svg
+++ b/src/data/images/android/svg/twelvekeys__function__kana__icon.svg
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!--
Copyright 2010-2014, Google Inc.
All rights reserved.
@@ -29,18 +29,17 @@
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="twelvekeys_x5F__x5F_function_x5F__x5F_kana_x5F__x5F_icon"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="82px" height="87px"
- viewBox="0 0 82 87" style="enable-background:new 0 0 82 87;" xml:space="preserve">
-<g id="style-keyicon-function">
- <path style="fill:#DDDDDD;" d=""/>
-</g>
-<g id="style-keyicon-function-dark">
- <path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-function-dark_1_">
- <path style="fill:#272727;" d=""/>
-</g>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ version="1.1"
+ width="68"
+ height="56">
+ <!-- Original size: 68 x 56 -->
+ <g transform="matrix(0.78,0,0,0.78,7.48,6.16)">
+ <path id="style-keyicon-twelvekeys-function" opacity="0.80000299" d="m22.730855,25.555342c-1.826825,0-3.782625,0.262762-5.866438,0.782512v5.083925l-0.587125,6.453563c2.60645-3.129088,4.757638-7.235113,6.453563-12.32m-9.3863,15.05735c-0.391738-2.214713-0.587125-5.407325-0.587125-9.581687v-3.324476c-5.4756625,2.737351-8.2130125,6.257213-8.2130125,10.559588,0,1.173287,0.421575,2.249362,1.2714625,3.227263,0.8460375,0.9779,1.7257625,1.465887,2.639175,1.465887,1.4331625,0,3.061713-0.78155,4.8895-2.346575m8.017625,8.409362c-0.391738-1.436049-0.913412-2.869212-1.565025-4.302375,10.297788-0.65065,15.449087-3.910637,15.449087-9.778037,0-4.429425-2.804724-7.363125-8.4084-8.799175-2.478437,7.170625-5.475662,12.4509-8.995525,15.839862-3.519862,3.39185-6.780812,5.083925-9.778037,5.083925-2.0867,0-3.8808-0.815237-5.3774875-2.44475-1.5005375-1.62855-2.2493625-3.681562-2.2493625-6.159999,0-6.776001,4.1069875-11.797363,12.32-15.057351,0-2.346575,0.06449-4.56225,0.195387-6.64895h-10.559587v-4.302374c1.5640625,0.263725,3.71525,0.391737,6.4535625,0.391737,1.3012995,0,2.8018375-0.06449,4.4977625-0.195387,0-0.910525,0.195387-2.8028005,0.586162-5.6710505l4.302375,0.1953875-0.587125,5.279313,18.382788-0.390776,0.195387,4.106988-18.96895,0.586162c-0.1309,1.173288-0.195387,2.9337-0.195387,5.280275,1.823937-0.390775,3.519862-0.587125,5.083925-0.587125,0.260837,0,0.847,0.06834,1.760412,0.19635,0.128013-0.51975,0.259875-1.3013,0.390775-2.347537l4.302375,0.9779c0,0.263725-0.195387,0.913412-0.586162,1.9558,7.95025,1.9558,11.928262,6.258175,11.928262,12.907125,0,3.650762-1.368675,6.61815-4.106025,8.89735-2.738312,2.280163-7.562362,3.9424-14.471187,4.986712" fill-rule="nonzero" fill="#000"/>
+ <path id="style-keyicon-function-dark" opacity="0.5" d="m54.6385,41.755662c2.266688,0,3.802838-0.567875,5.462188-1.642988,1.65935-1.076075,2.497687-2.523675,3.088662-4.21575l0.0068-4.375525-6.111875-0.01251c-2.39855,0-3.952987,0.232925-5.512237,1.37445-1.561175,1.141526-2.197388,2.388926-2.197388,3.998226,0,1.511125,0.416763,2.580462,1.411025,3.49965,0.9933,0.92015,2.111725,1.37445,3.852888,1.37445m9.423799,2.520787c-0.191538-0.836412-0.364788-1.344612-0.501463-2.0097-0.139562-0.678562-0.197312-1.226225-0.197312-1.9327-0.92015,1.445675-1.849925,2.099213-3.509275,3.042463-1.65935,0.944212-3.564138,1.4168-5.715325,1.4168-2.612225,0-4.636363-0.693-6.073375-2.081888-1.437013-1.386962-2.156-3.2725-2.156-5.653725s1.04335-4.472738,3.129087-5.950175c2.085738-1.4784,4.796138-2.2176,8.130238-2.2176h6.038725l-0.01829-3.013588c0-1.90575-0.453337-3.16855-1.660312-4.252325-1.207938-1.083775-2.34465-1.514975-4.356275-1.52845-1.81335-0.01251-3.296563,0.264688-4.536263,1.250288-1.240662,0.984637-2.037612,2.114612-2.037612,3.609375l-3.258063,0.01444,0.0038-0.162662c-0.09914-2.002963,0.679525-3.764338,2.4948-5.284125,1.814313-1.518825,4.339913-2.2792,7.263988-2.2792,2.923112,0,5.271612,0.747862,7.0455,2.242625,1.773887,1.4938,2.522712,3.49965,2.522712,6.291862l-0.0038,13.105401c0,0.936512,0.195388,1.869175,0.302225,2.7566,0.106838,0.886462,0.345538,1.766187,0.591938,2.636287h-3.49965z" fill-rule="nonzero" fill="#000"/>
+ </g>
</svg>
diff --git a/src/data/images/android/svg/twelvekeys__function__kana__popup.svg b/src/data/images/android/svg/twelvekeys__function__kana__popup.svg
deleted file mode 100644
index 92c34bd..0000000
--- a/src/data/images/android/svg/twelvekeys__function__kana__popup.svg
+++ /dev/null
@@ -1,46 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="twelvekeys_x5F__x5F_function_x5F__x5F_kana_x5F__x5F_popup"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="82px" height="87px"
- viewBox="0 0 82 87" style="enable-background:new 0 0 82 87;" xml:space="preserve">
-<g id="style-keyicon-popup-function">
- <path style="fill:#DDDDDD;" d=""/>
-</g>
-<g id="style-keyicon-popup-function-dark">
- <path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-popup-function-dark_1_">
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__function__left_arrow__icon.svg b/src/data/images/android/svg/twelvekeys__function__left_arrow__icon.svg
index 33320d9..07eacad 100644
--- a/src/data/images/android/svg/twelvekeys__function__left_arrow__icon.svg
+++ b/src/data/images/android/svg/twelvekeys__function__left_arrow__icon.svg
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!--
Copyright 2010-2014, Google Inc.
All rights reserved.
@@ -30,10 +30,15 @@
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-->
<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="twelvekeys_x5F__x5F_function_x5F__x5F_left_x5F_arrow_x5F__x5F_icon"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="82px" height="87px"
- viewBox="0 0 82 87" style="enable-background:new 0 0 82 87;" xml:space="preserve">
-<polygon id="style-keyicon-function_8_" style="fill-rule:evenodd;clip-rule:evenodd;fill:#DDDDDD;" points="32.101,42.245
- 46.731,32.762 48,33.931 48,52.035 46.798,53.238 32,43.684 "/>
+<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns="http://www.w3.org/2000/svg"
+ version="1.1"
+ width="68"
+ height="56">
+ <!-- Original: translate(-16,-15) -->
+ <g transform="matrix(0.984375,0,0,0.984375,-5.2,-14.2)">
+ <polygon id="style-keyicon-twelvekeys-function" points="48,52.035 46.798,53.238 32,43.684 32.101,42.245 46.731,32.762 48,33.931" fill="#DDD" fill-rule="evenodd"/>
+ </g>
</svg>
diff --git a/src/data/images/android/svg/twelvekeys__function__left_arrow__popup.svg b/src/data/images/android/svg/twelvekeys__function__left_arrow__popup.svg
deleted file mode 100644
index dda085e..0000000
--- a/src/data/images/android/svg/twelvekeys__function__left_arrow__popup.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="twelvekeys_x5F__x5F_function_x5F__x5F_left_x5F_arrow_x5F__x5F_popup"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="82px" height="87px"
- viewBox="0 0 82 87" style="enable-background:new 0 0 82 87;" xml:space="preserve">
-<polygon id="style-keyicon-popup-function_6_" style="fill-rule:evenodd;clip-rule:evenodd;fill:#DDDDDD;" points="32.101,42.245
- 46.731,32.762 48,33.931 48,52.035 46.798,53.238 32,43.684 "/>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__function__number__icon.svg b/src/data/images/android/svg/twelvekeys__function__number__icon.svg
deleted file mode 100644
index 95e9006..0000000
--- a/src/data/images/android/svg/twelvekeys__function__number__icon.svg
+++ /dev/null
@@ -1,46 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="twelvekeys_x5F__x5F_function_x5F__x5F_number_x5F__x5F_icon"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="82px" height="87px"
- viewBox="0 0 82 87" style="enable-background:new 0 0 82 87;" xml:space="preserve">
-<g id="style-keyicon-function-dark_2_">
- <path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-function-dark_3_">
- <path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-function_1_">
- <path style="fill:#DDDDDD;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__function__number__popup.svg b/src/data/images/android/svg/twelvekeys__function__number__popup.svg
deleted file mode 100644
index 4c81992..0000000
--- a/src/data/images/android/svg/twelvekeys__function__number__popup.svg
+++ /dev/null
@@ -1,46 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="twelvekeys_x5F__x5F_function_x5F__x5F_number_x5F__x5F_popup"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="82px" height="87px"
- viewBox="0 0 82 87" style="enable-background:new 0 0 82 87;" xml:space="preserve">
-<g id="style-keyicon-popup-function-dark_2_">
- <path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-popup-function-dark_3_">
- <path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-popup-function_1_">
- <path style="fill:#DDDDDD;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__function__right_arrow__icon.svg b/src/data/images/android/svg/twelvekeys__function__right_arrow__icon.svg
index 3d9061b..0839c84 100644
--- a/src/data/images/android/svg/twelvekeys__function__right_arrow__icon.svg
+++ b/src/data/images/android/svg/twelvekeys__function__right_arrow__icon.svg
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!--
Copyright 2010-2014, Google Inc.
All rights reserved.
@@ -30,10 +30,16 @@
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-->
<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="twelvekeys_x5F__x5F_function_x5F__x5F_right_x5F_arrow_x5F__x5F_icon"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="82px" height="87px"
- viewBox="0 0 82 87" style="enable-background:new 0 0 82 87;" xml:space="preserve">
-<polygon id="style-keyicon-function_7_" style="fill-rule:evenodd;clip-rule:evenodd;fill:#DDDDDD;" points="47.9,42.245
- 33.269,32.762 32,33.931 32,52.035 33.202,53.238 48,43.684 "/>
+<!-- 10% width key on qwerty keyboard. -->
+<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns="http://www.w3.org/2000/svg"
+ version="1.1"
+ width="68"
+ height="56">
+ <!-- Original: transform="translate(-16,-15) -->
+ <g transform="matrix(0.984375,0,0,0.984375,-5.2,-14.2)">
+ <polygon id="style-keyicon-twelvekeys-function" points="32,52.035 33.202,53.238 48,43.684 47.9,42.245 33.269,32.762 32,33.931" fill="#DDD" fill-rule="evenodd"/>
+ </g>
</svg>
diff --git a/src/data/images/android/svg/twelvekeys__function__right_arrow__popup.svg b/src/data/images/android/svg/twelvekeys__function__right_arrow__popup.svg
deleted file mode 100644
index 3b7833f..0000000
--- a/src/data/images/android/svg/twelvekeys__function__right_arrow__popup.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="twelvekeys_x5F__x5F_function_x5F__x5F_right_x5F_arrow_x5F__x5F_popup"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="82px" height="87px"
- viewBox="0 0 82 87" style="enable-background:new 0 0 82 87;" xml:space="preserve">
-<polygon id="style-keyicon-popup-function_5_" style="fill-rule:evenodd;clip-rule:evenodd;fill:#DDDDDD;" points="47.9,42.245
- 33.269,32.762 32,33.931 32,52.035 33.202,53.238 48,43.684 "/>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__function__space__icon.svg b/src/data/images/android/svg/twelvekeys__function__space__icon.svg
index e1a2914..0631d4a 100644
--- a/src/data/images/android/svg/twelvekeys__function__space__icon.svg
+++ b/src/data/images/android/svg/twelvekeys__function__space__icon.svg
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!--
Copyright 2010-2014, Google Inc.
All rights reserved.
@@ -30,10 +30,15 @@
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-->
<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="twelvekeys_x5F__x5F_function_x5F__x5F_space_x5F__x5F_icon"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="82px" height="87px"
- viewBox="0 0 82 87" style="enable-background:new 0 0 82 87;" xml:space="preserve">
-<polygon id="style-keyicon-function_6_" style="fill:#DDDDDD;" points="51.633,43 51.633,50.266 28.366,50.266 28.366,43 23.5,43
- 23.5,55.002 56.5,55.002 56.5,43 "/>
+<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ version="1.1"
+ width="68"
+ height="56">
+ <!-- Original size: 51.5 x 13.773256 -->
+ <g transform="matrix(0.985437,0,0,0.985437,8.625,21.2137)">
+ <path id="style-keyicon-twelvekeys-function" fill-rule="nonzero" fill="#000" d="m47.906977,0,0,9.581395-44.313954,0v-9.581395h-3.593023v13.773256h51.5v-13.773256h-3.593023z"/>
+ </g>
</svg>
diff --git a/src/data/images/android/svg/twelvekeys__function__symbol__icon.svg b/src/data/images/android/svg/twelvekeys__function__symbol__icon.svg
index cfcdccb..87a6e0b 100644
--- a/src/data/images/android/svg/twelvekeys__function__symbol__icon.svg
+++ b/src/data/images/android/svg/twelvekeys__function__symbol__icon.svg
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!--
Copyright 2010-2014, Google Inc.
All rights reserved.
@@ -29,21 +29,22 @@
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="twelvekeys_x5F__x5F_function_x5F__x5F_symbol_x5F__x5F_icon"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="82px" height="87px"
- viewBox="0 0 82 87" style="enable-background:new 0 0 82 87;" xml:space="preserve">
-<g id="style-keyicon-function_3_">
- <circle style="fill:#DDDDDD;" cx="34.54" cy="29.736" r="2.21"/>
- <circle style="fill:#DDDDDD;" cx="45.31" cy="29.736" r="2.21"/>
- <path style="fill:#DDDDDD;" d=""/>
- <g>
- <path style="fill-rule:evenodd;clip-rule:evenodd;fill:#DDDDDD;" d=""/>
- </g>
-</g>
-<g id="style-keyicon-function">
- <path style="fill:#DDDDDD;" d=""/>
- <path style="fill:#DDDDDD;" d=""/>
-</g>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ version="1.1"
+ width="68"
+ height="56">
+ <text id="style-keyicon-twelvekeys-function_0" x="26.7228" y="28" style="font-size:30px;dominant-baseline:central">1</text>
+ <text id="style-keyicon-twelvekeys-function_1" x="38.1754" y="28" style="font-size:30px;dominant-baseline:central">2</text>
+ <text id="style-keyicon-twelvekeys-function_2" x="53.1000" y="28" style="font-size:30px;dominant-baseline:central">3</text>
+ <!-- Original size: 114 x 80 -->
+ <g id="style-keyicon-twelvekeys-function_3" transform="matrix(0.597,0,0,0.597,0,4.14035)" fill-rule="nonzero" fill="#37474f">
+ <path d="m24.9,58.967776c-10.459333,0-18.9672032-8.509016-18.9672032-18.967203,0-10.459333,8.5078702-18.968349,18.9672032-18.968349s18.967203,8.509016,18.967203,18.968349c0,10.458187-8.50787,18.967203-18.967203,18.967203m0-42.466059c-12.958212,0-23.5000006,10.540644-23.5000006,23.498856,0,12.957066,10.5417886,23.49771,23.5000006,23.49771s23.500001-10.540644,23.500001-23.49771c0-12.958212-10.541789-23.498856-23.500001-23.498856"/>
+ <path d="m16.354451,37.583921c1.975512,0,3.57768-1.601023,3.57768-3.57768,0-1.975512-1.602168-3.576536-3.57768-3.576536s-3.57768,1.601024-3.57768,3.576536c0,1.976657,1.602168,3.57768,3.57768,3.57768"/>
+ <path d="m33.445434,30.429591c-1.975512,0-3.57768,1.601023-3.57768,3.57768,0,1.975512,1.602168,3.576536,3.57768,3.576536s3.57768-1.601024,3.57768-3.576536c0-1.976657-1.602168-3.57768-3.57768-3.57768"/>
+ <path d="m24.9,53.035286c8.968251,0,11.898879-8.247905,11.898879-8.247905h-23.797758s2.930628,8.247905,11.898879,8.247905"/>
+ </g>
</svg>
diff --git a/src/data/images/android/svg/twelvekeys__function__undo__icon.svg b/src/data/images/android/svg/twelvekeys__function__undo__icon.svg
index f6af645..15a45b1 100644
--- a/src/data/images/android/svg/twelvekeys__function__undo__icon.svg
+++ b/src/data/images/android/svg/twelvekeys__function__undo__icon.svg
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!--
Copyright 2010-2014, Google Inc.
All rights reserved.
@@ -29,15 +29,16 @@
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="twelvekeys_x5F__x5F_function_x5F__x5F_undo_x5F__x5F_icon"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="82px" height="87px"
- viewBox="0 0 82 87" style="enable-background:new 0 0 82 87;" xml:space="preserve">
-<polygon id="style-keyicon-function_5_" style="fill:#DDDDDD;" points="51.661,42.086 51.661,35.813 49.827,33.912 33.844,33.912
- 33.844,38.35 32.542,39.251 23,32.143 23,30.875 32.676,24.869 33.844,25.803 33.844,29.407 55.232,29.407 57,31.309 57,42.086 "/>
-<g id="style-keyicon-function">
- <path style="fill:#DDDDDD;" d=""/>
- <path style="fill:#DDDDDD;" d=""/>
-</g>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ version="1.1"
+ width="68"
+ height="56">
+ <!-- Original size: 45 x 21.778248 matrix(0.7142517,0,0,-0.7142517,42.2737011,21.77824647) -->
+ <g fill="#000" transform="matrix(0.753656,0,0,-0.753656,54.8647,39.4899)">
+ <path id="style-keyicon-twelvekeys-function" fill-rule="nonzero" fill="#000" d="m0,0,0,13.337-38.133,0,0-13.337-21.053,15.245,21.053,15.246,0-13.345,41.95,0v-17.146h-3.817z"/>
+ </g>
</svg>
diff --git a/src/data/images/android/svg/twelvekeys__function__undo__popup.svg b/src/data/images/android/svg/twelvekeys__function__undo__popup.svg
deleted file mode 100644
index 7b233ee..0000000
--- a/src/data/images/android/svg/twelvekeys__function__undo__popup.svg
+++ /dev/null
@@ -1,44 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="twelvekeys_x5F__x5F_function_x5F__x5F_undo_x5F__x5F_popup"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="82px" height="87px"
- viewBox="0 0 82 87" style="enable-background:new 0 0 82 87;" xml:space="preserve">
-<polygon id="style-keyicon-popup-function_4_" style="fill:#DDDDDD;" points="51.661,42.086 51.661,35.813 49.827,33.912
- 33.844,33.912 33.844,38.35 32.542,39.251 23,32.143 23,30.875 32.676,24.869 33.844,25.803 33.844,29.407 55.232,29.407 57,31.309
- 57,42.086 "/>
-<g id="style-keyicon-popup-function">
- <path style="fill:#DDDDDD;" d=""/>
- <path style="fill:#DDDDDD;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__10.svg b/src/data/images/android/svg/twelvekeys__kana__10.svg
index 27b275f..39e3ac1 100644
--- a/src/data/images/android/svg/twelvekeys__kana__10.svg
+++ b/src/data/images/android/svg/twelvekeys__kana__10.svg
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
<!--
Copyright 2010-2014, Google Inc.
All rights reserved.
@@ -30,27 +30,22 @@
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-->
<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="twelvekeys_x5F__x5F_kana_x5F__x5F_10"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="105px" height="87px"
- viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main">
- <path style="fill:#272727;" d=""/>
-</g>
+<svg version="1.1" id="twelvekeys_kana_10" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
+<polyline id="style-keyicon-bound_1_" style="fill:none;stroke:#CCCBCB;stroke-miterlimit:10;" points="32.499,24.998 27.499,24.998 27.499,41.998 44.499,41.998 44.499,33.498 "/>
<g id="style-keyicon-main_1_">
- <path style="fill:#272727;" d=""/>
+ <text x="32.5" y="40" style="font-size:48px;text-anchor:middle;dominant-baseline:central;fill:#272727;">゛</text>
</g>
-<polyline id="style-keyicon-bound_1_" style="fill:none;stroke:#CCCBCB;stroke-miterlimit:10;" points="31.999,24.998
- 26.999,24.998 26.999,41.998 43.999,41.998 43.999,33.498 "/>
-<polyline id="style-keyicon-bound" style="fill:none;stroke:#CCCBCB;stroke-miterlimit:10;" points="65,25 60,25 60,42 77,42
- 77,33.5 "/>
+<polyline id="style-keyicon-bound_2_" style="fill:none;stroke:#CCCBCB;stroke-miterlimit:10;" points="65,25 60,25 60,42 77,42 77,33.5 "/>
<g id="style-keyicon-main_2_">
- <path style="fill:#272727;" d=""/>
+ <text x="62.5" y="40" style="font-size:48px;text-anchor:middle;dominant-baseline:central;fill:#272727;">゜</text>
</g>
<g id="style-keyicon-main_3_">
- <path style="fill:#272727;" d=""/>
+ <text x="35" y="57.5" style="font-size:16px;text-anchor:middle;dominant-baseline:central;fill:#272727;">大</text>
</g>
<g id="style-keyicon-main_4_">
- <path style="fill:#272727;" d=""/>
+ <text x="52.5" y="57.5" style="font-size:16px;text-anchor:middle;dominant-baseline:central;fill:#272727;">⇔</text>
+</g>
+<g id="style-keyicon-main_5_">
+ <text x="70" y="57.5" style="font-size:16px;text-anchor:middle;dominant-baseline:central;fill:#272727;">小</text>
</g>
</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__a.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__a.svg
deleted file mode 100644
index 5436ed4..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__a.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
- <path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__an.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__an.svg
deleted file mode 100644
index 665f900..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__an.svg
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
- <path d=""/>
- <path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__axtu.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__axtu.svg
deleted file mode 100644
index 665f900..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__axtu.svg
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
- <path d=""/>
- <path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__chi.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__chi.svg
deleted file mode 100644
index 5436ed4..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__chi.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
- <path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__e.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__e.svg
deleted file mode 100644
index 5436ed4..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__e.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
- <path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__en.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__en.svg
deleted file mode 100644
index 665f900..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__en.svg
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
- <path d=""/>
- <path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__exclamation_mark.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__exclamation_mark.svg
deleted file mode 100644
index 5436ed4..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__exclamation_mark.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
- <path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__extu.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__extu.svg
deleted file mode 100644
index 665f900..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__extu.svg
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
- <path d=""/>
- <path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__fu.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__fu.svg
deleted file mode 100644
index 5436ed4..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__fu.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
- <path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__ha.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__ha.svg
deleted file mode 100644
index 5436ed4..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__ha.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
- <path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__he.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__he.svg
deleted file mode 100644
index 5436ed4..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__he.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
- <path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__hi.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__hi.svg
deleted file mode 100644
index 5436ed4..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__hi.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
- <path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__ho.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__ho.svg
deleted file mode 100644
index 5436ed4..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__ho.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
- <path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__i.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__i.svg
deleted file mode 100644
index 5436ed4..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__i.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
- <path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__ideographic_period.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__ideographic_period.svg
deleted file mode 100644
index 5436ed4..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__ideographic_period.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
- <path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__in.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__in.svg
deleted file mode 100644
index 665f900..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__in.svg
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
- <path d=""/>
- <path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__ixtu.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__ixtu.svg
deleted file mode 100644
index 665f900..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__ixtu.svg
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
- <path d=""/>
- <path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__ka.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__ka.svg
deleted file mode 100644
index 5436ed4..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__ka.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
- <path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__ke.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__ke.svg
deleted file mode 100644
index 5436ed4..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__ke.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
- <path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__ki.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__ki.svg
deleted file mode 100644
index 5436ed4..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__ki.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
- <path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__ko.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__ko.svg
deleted file mode 100644
index 5436ed4..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__ko.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
- <path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__ku.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__ku.svg
deleted file mode 100644
index 5436ed4..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__ku.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
- <path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__ma.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__ma.svg
deleted file mode 100644
index 5436ed4..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__ma.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
- <path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__me.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__me.svg
deleted file mode 100644
index bd8840b..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__me.svg
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
- <path d=""
- />
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__mi.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__mi.svg
deleted file mode 100644
index 5436ed4..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__mi.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
- <path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__mo.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__mo.svg
deleted file mode 100644
index 5436ed4..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__mo.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
- <path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__mu.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__mu.svg
deleted file mode 100644
index 5436ed4..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__mu.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
- <path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__na.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__na.svg
deleted file mode 100644
index 5436ed4..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__na.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
- <path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__ne.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__ne.svg
deleted file mode 100644
index 5436ed4..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__ne.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
- <path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__ni.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__ni.svg
deleted file mode 100644
index 5436ed4..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__ni.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
- <path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__nn.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__nn.svg
deleted file mode 100644
index 5436ed4..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__nn.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
- <path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__no.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__no.svg
deleted file mode 100644
index 5436ed4..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__no.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
- <path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__nu.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__nu.svg
deleted file mode 100644
index 5436ed4..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__nu.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
- <path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__o.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__o.svg
deleted file mode 100644
index 5436ed4..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__o.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
- <path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__on.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__on.svg
deleted file mode 100644
index 665f900..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__on.svg
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
- <path d=""/>
- <path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__oxtu.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__oxtu.svg
deleted file mode 100644
index 665f900..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__oxtu.svg
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
- <path d=""/>
- <path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__prolonged_sound_mark.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__prolonged_sound_mark.svg
deleted file mode 100644
index 5436ed4..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__prolonged_sound_mark.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
- <path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__question_mark.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__question_mark.svg
deleted file mode 100644
index 5436ed4..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__question_mark.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
- <path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__ra.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__ra.svg
deleted file mode 100644
index 5436ed4..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__ra.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
- <path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__re.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__re.svg
deleted file mode 100644
index 5436ed4..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__re.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
- <path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__ri.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__ri.svg
deleted file mode 100644
index 5436ed4..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__ri.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
- <path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__ro.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__ro.svg
deleted file mode 100644
index 5436ed4..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__ro.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
- <path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__ru.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__ru.svg
deleted file mode 100644
index 5436ed4..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__ru.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
- <path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__sa.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__sa.svg
deleted file mode 100644
index 5436ed4..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__sa.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
- <path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__se.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__se.svg
deleted file mode 100644
index 5436ed4..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__se.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
- <path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__shi.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__shi.svg
deleted file mode 100644
index 5436ed4..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__shi.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
- <path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__so.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__so.svg
deleted file mode 100644
index 5436ed4..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__so.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
- <path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__su.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__su.svg
deleted file mode 100644
index 5436ed4..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__su.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
- <path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__ta.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__ta.svg
deleted file mode 100644
index 5436ed4..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__ta.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
- <path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__te.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__te.svg
deleted file mode 100644
index 5436ed4..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__te.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
- <path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__to.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__to.svg
deleted file mode 100644
index 5436ed4..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__to.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
- <path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__tsu.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__tsu.svg
deleted file mode 100644
index 5436ed4..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__tsu.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
- <path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__u.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__u.svg
deleted file mode 100644
index 5436ed4..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__u.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
- <path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__un.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__un.svg
deleted file mode 100644
index 665f900..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__un.svg
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
- <path d=""/>
- <path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__uxtu.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__uxtu.svg
deleted file mode 100644
index 665f900..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__uxtu.svg
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
- <path d=""/>
- <path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__wa.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__wa.svg
deleted file mode 100644
index 5436ed4..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__wa.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
- <path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__wo.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__wo.svg
deleted file mode 100644
index 5436ed4..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__wo.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
- <path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__xe.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__xe.svg
deleted file mode 100644
index 5436ed4..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__xe.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
- <path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__xi.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__xi.svg
deleted file mode 100644
index 5436ed4..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__xi.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
- <path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__xya.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__xya.svg
deleted file mode 100644
index 5436ed4..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__xya.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
- <path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__xyo.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__xyo.svg
deleted file mode 100644
index bd8840b..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__xyo.svg
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
- <path d=""
- />
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__xyu.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__xyu.svg
deleted file mode 100644
index 5436ed4..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__xyu.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
- <path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__ya.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__ya.svg
deleted file mode 100644
index 5436ed4..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__ya.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
- <path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__yo.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__yo.svg
deleted file mode 100644
index 5436ed4..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__yo.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
- <path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__keyicon__yu.svg b/src/data/images/android/svg/twelvekeys__kana__keyicon__yu.svg
deleted file mode 100644
index 5436ed4..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__keyicon__yu.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
- <path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__popup__10.svg b/src/data/images/android/svg/twelvekeys__kana__popup__10.svg
index 80ad650..85a5675 100644
--- a/src/data/images/android/svg/twelvekeys__kana__popup__10.svg
+++ b/src/data/images/android/svg/twelvekeys__kana__popup__10.svg
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
<!--
Copyright 2010-2014, Google Inc.
All rights reserved.
@@ -30,27 +30,19 @@
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-->
<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="twelvekeys_x5F__x5F_kana_x5F__x5F_popup_x5F__x5F_10"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="112px" height="112px"
- viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<polyline id="style-keyicon-bound_4_" style="fill:none;stroke:#CCCBCB;stroke-miterlimit:10;" points="27,28 18,28 18,52 42,52
- 42,39 "/>
-<polyline id="style-keyicon-bound_3_" style="fill:none;stroke:#CCCBCB;stroke-miterlimit:10;" points="77,28 68,28 68,52 92,52
- 92,39 "/>
-<g id="style-keyicon-main">
- <path d=""/>
-</g>
-<g id="style-keyicon-main_1_">
- <path d=""/>
-</g>
-<g id="style-keyicon-main_2_">
- <path d=""/>
-</g>
-<g id="style-keyicon-main_8_">
- <path d=""/>
-</g>
-<g id="style-keyicon-main_9_">
- <path d=""/>
-</g>
+<svg xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ version="1.1"
+ width="112px"
+ height="112px">
+ <!-- Original size: 105 x 87 -->
+ <g transform="matrix(1.42,0,0,1.42,-18.55,-5.77)">
+ <polyline id="style-keyicon-bound_1_" style="fill:none;stroke:#CCCBCB;stroke-miterlimit:10;" points="32.499,24.998 27.499,24.998 27.499,41.998 44.499,41.998 44.499,33.498 "/>
+ <text id="style-keyicon-main_1_" x="32.5" y="40" style="font-size:48px;text-anchor:middle;dominant-baseline:central;fill:#272727;">゛</text>
+ <polyline id="style-keyicon-bound_2_" style="fill:none;stroke:#CCCBCB;stroke-miterlimit:10;" points="65,25 60,25 60,42 77,42 77,33.5 "/>
+ <text id="style-keyicon-main_2_" x="62.5" y="40" style="font-size:48px;text-anchor:middle;dominant-baseline:central;fill:#272727;">゜</text>
+ <text id="style-keyicon-main_3_" x="35" y="57.5" style="font-size:16px;text-anchor:middle;dominant-baseline:central;fill:#272727;">大</text>
+ <text id="style-keyicon-main_4_" x="52.5" y="57.5" style="font-size:16px;text-anchor:middle;dominant-baseline:central;fill:#272727;">⇔</text>
+ <text id="style-keyicon-main_5_" x="70" y="57.5" style="font-size:16px;text-anchor:middle;dominant-baseline:central;fill:#272727;">小</text>
+ </g>
</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__popup__semi_voiced_mark.svg b/src/data/images/android/svg/twelvekeys__kana__popup__semi_voiced_mark.svg
index bdf4fb1..6e81988 100644
--- a/src/data/images/android/svg/twelvekeys__kana__popup__semi_voiced_mark.svg
+++ b/src/data/images/android/svg/twelvekeys__kana__popup__semi_voiced_mark.svg
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
<!--
Copyright 2010-2014, Google Inc.
All rights reserved.
@@ -30,13 +30,11 @@
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-->
<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="twelvekeys_x5F__x5F_kana_x5F__x5F_popup_x5F__x5F_semi_x5F_voiced_x5F_mark"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="112px" height="112px"
- viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<polyline id="style-keyicon-bound_1_" style="fill:none;stroke:#CCCBCB;stroke-miterlimit:10;" points="46,32 32,32 32,80 80,80
- 80,56 "/>
-<g id="style-keyicon-main">
- <path d=""/>
-</g>
+<svg xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ version="1.1"
+ width="112px"
+ height="112px">
+ <polyline id="style-keyicon-bound" style="fill:none;stroke:#CCCBCB;stroke-miterlimit:10;" points="56,34 34,34 34,78 78,78 78,56 "/>
+ <text id="style-keyicon-main" x="53" y="62" style="font-size:90px;text-anchor:middle;dominant-baseline:central;">゜</text>
</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__popup__small.svg b/src/data/images/android/svg/twelvekeys__kana__popup__small.svg
index 21499e1..5d7d6aa 100644
--- a/src/data/images/android/svg/twelvekeys__kana__popup__small.svg
+++ b/src/data/images/android/svg/twelvekeys__kana__popup__small.svg
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
<!--
Copyright 2010-2014, Google Inc.
All rights reserved.
@@ -30,12 +30,9 @@
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-->
<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="twelvekeys_x5F__x5F_kana_x5F__x5F_popup_x5F__x5F_small"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="112px" height="112px"
- viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
+<svg version="1.1" id="twelvekeys_kana_popup_small" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
<rect id="style-keyicon-bound" x="36" y="36" style="fill:none;stroke:#CCCBCB;stroke-miterlimit:10;" width="40" height="40"/>
<g id="style-keyicon-main_1_">
- <path d=""/>
+ <text x="56" y="56" style="font-size:36px;text-anchor:middle;dominant-baseline:central;">小</text>
</g>
</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__popup__voiced_mark.svg b/src/data/images/android/svg/twelvekeys__kana__popup__voiced_mark.svg
index 87b8647..bb8ff39 100644
--- a/src/data/images/android/svg/twelvekeys__kana__popup__voiced_mark.svg
+++ b/src/data/images/android/svg/twelvekeys__kana__popup__voiced_mark.svg
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
<!--
Copyright 2010-2014, Google Inc.
All rights reserved.
@@ -30,13 +30,11 @@
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-->
<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="twelvekeys_x5F__x5F_kana_x5F__x5F_popup_x5F__x5F_voiced_x5F_mark"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="112px" height="112px"
- viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<polyline id="style-keyicon-bound_2_" style="fill:none;stroke:#CCCBCB;stroke-miterlimit:10;" points="46,32 32,32 32,80 80,80
- 80,56 "/>
-<g id="style-keyicon-main">
- <path d=""/>
-</g>
+<svg xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ version="1.1"
+ width="112px"
+ height="112px">
+ <polyline id="style-keyicon-bound" style="fill:none;stroke:#CCCBCB;stroke-miterlimit:10;" points="56,34 34,34 34,78 78,78 78,56 "/>
+ <text id="style-keyicon-main" x="53" y="62" style="font-size:90px;text-anchor:middle;dominant-baseline:central;">゛</text>
</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__simple__12.svg b/src/data/images/android/svg/twelvekeys__kana__simple__12.svg
index 0d1b5c8..49b6e9d 100644
--- a/src/data/images/android/svg/twelvekeys__kana__simple__12.svg
+++ b/src/data/images/android/svg/twelvekeys__kana__simple__12.svg
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
<!--
Copyright 2010-2014, Google Inc.
All rights reserved.
@@ -30,14 +30,17 @@
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-->
<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="twelvekeys_x5F__x5F_kana_x5F__x5F_simple_x5F__x5F_12"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="105px" height="87px"
- viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
+<svg version="1.1" id="twelvekeys_kana_simple_12" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
<g id="style-keyicon-main">
- <path style="fill:#272727;" d=""/>
- <path style="fill:#272727;" d=""/>
- <path style="fill:#272727;" d=""/>
- <path style="fill:#272727;" d=""/>
+ <text x="32.5" y="43.5" style="font-size:30px;text-anchor:middle;dominant-baseline:central;fill:#272727;">、</text>
+</g>
+<g id="style-keyicon-main">
+ <text x="50" y="43.5" style="font-size:30px;text-anchor:middle;dominant-baseline:central;fill:#272727;">。</text>
+</g>
+<g id="style-keyicon-main">
+ <text x="60" y="43.5" style="font-size:30px;text-anchor:middle;dominant-baseline:central;fill:#272727;">?</text>
+</g>
+<g id="style-keyicon-main">
+ <text x="80" y="43.5" style="font-size:30px;text-anchor:middle;dominant-baseline:central;fill:#272727;">!</text>
</g>
</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__01_center.svg b/src/data/images/android/svg/twelvekeys__kana__support__01_center.svg
deleted file mode 100644
index a784c8a..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__01_center.svg
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="center_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main-highlight_1_">
- <path style="fill:#F9F9F9;" d=""/>
-</g>
-<g id="style-keyicon-guide">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_2_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_3_">
- <path style="fill:#333333;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__01_down.svg b/src/data/images/android/svg/twelvekeys__kana__support__01_down.svg
deleted file mode 100644
index 91c9605..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__01_down.svg
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="down_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main">
- <path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_2_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-highlight">
- <path style="fill:#FFFFFF;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__01_left.svg b/src/data/images/android/svg/twelvekeys__kana__support__01_left.svg
deleted file mode 100644
index 52c75f5..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__01_left.svg
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="left_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main">
- <path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_2_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-highlight_1_">
- <path style="fill:#FFFFFF;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__01_release.svg b/src/data/images/android/svg/twelvekeys__kana__support__01_release.svg
deleted file mode 100644
index c019d93..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__01_release.svg
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="release" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
- <path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide_4_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_5_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_6_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_7_">
- <path style="fill:#333333;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__01_right.svg b/src/data/images/android/svg/twelvekeys__kana__support__01_right.svg
deleted file mode 100644
index f3d3145..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__01_right.svg
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="right_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main">
- <path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_2_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-highlight">
- <path style="fill:#FFFFFF;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__01_up.svg b/src/data/images/android/svg/twelvekeys__kana__support__01_up.svg
deleted file mode 100644
index 5a95d5d..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__01_up.svg
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="up_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main">
- <path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-highlight">
- <path style="fill:#FFFFFF;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_2_">
- <path style="fill:#333333;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__02_center.svg b/src/data/images/android/svg/twelvekeys__kana__support__02_center.svg
deleted file mode 100644
index a784c8a..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__02_center.svg
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="center_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main-highlight_1_">
- <path style="fill:#F9F9F9;" d=""/>
-</g>
-<g id="style-keyicon-guide">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_2_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_3_">
- <path style="fill:#333333;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__02_down.svg b/src/data/images/android/svg/twelvekeys__kana__support__02_down.svg
deleted file mode 100644
index 91c9605..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__02_down.svg
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="down_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main">
- <path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_2_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-highlight">
- <path style="fill:#FFFFFF;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__02_left.svg b/src/data/images/android/svg/twelvekeys__kana__support__02_left.svg
deleted file mode 100644
index 52c75f5..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__02_left.svg
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="left_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main">
- <path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_2_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-highlight_1_">
- <path style="fill:#FFFFFF;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__02_release.svg b/src/data/images/android/svg/twelvekeys__kana__support__02_release.svg
deleted file mode 100644
index c019d93..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__02_release.svg
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="release" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
- <path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide_4_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_5_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_6_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_7_">
- <path style="fill:#333333;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__02_right.svg b/src/data/images/android/svg/twelvekeys__kana__support__02_right.svg
deleted file mode 100644
index f3d3145..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__02_right.svg
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="right_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main">
- <path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_2_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-highlight">
- <path style="fill:#FFFFFF;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__02_up.svg b/src/data/images/android/svg/twelvekeys__kana__support__02_up.svg
deleted file mode 100644
index 5a95d5d..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__02_up.svg
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="up_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main">
- <path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-highlight">
- <path style="fill:#FFFFFF;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_2_">
- <path style="fill:#333333;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__03_center.svg b/src/data/images/android/svg/twelvekeys__kana__support__03_center.svg
deleted file mode 100644
index 641c53f..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__03_center.svg
+++ /dev/null
@@ -1,52 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="center_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main-highlight_1_">
- <path style="fill:#F9F9F9;" d=""
- />
-</g>
-<g id="style-keyicon-guide">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_2_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_3_">
- <path style="fill:#333333;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__03_down.svg b/src/data/images/android/svg/twelvekeys__kana__support__03_down.svg
deleted file mode 100644
index a4378b8..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__03_down.svg
+++ /dev/null
@@ -1,52 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="down_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main">
- <path style="fill:#272727;" d=""
- />
-</g>
-<g id="style-keyicon-guide">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_2_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-highlight">
- <path style="fill:#FFFFFF;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__03_left.svg b/src/data/images/android/svg/twelvekeys__kana__support__03_left.svg
deleted file mode 100644
index 8703c3f..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__03_left.svg
+++ /dev/null
@@ -1,52 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="left_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main">
- <path style="fill:#272727;" d=""
- />
-</g>
-<g id="style-keyicon-guide">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_2_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-highlight_1_">
- <path style="fill:#FFFFFF;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__03_release.svg b/src/data/images/android/svg/twelvekeys__kana__support__03_release.svg
deleted file mode 100644
index f724ea9..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__03_release.svg
+++ /dev/null
@@ -1,52 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="release" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
- <path style="fill:#272727;" d=""
- />
-</g>
-<g id="style-keyicon-guide_4_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_5_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_6_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_7_">
- <path style="fill:#333333;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__03_right.svg b/src/data/images/android/svg/twelvekeys__kana__support__03_right.svg
deleted file mode 100644
index 576f5f4..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__03_right.svg
+++ /dev/null
@@ -1,52 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="right_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main">
- <path style="fill:#272727;" d=""
- />
-</g>
-<g id="style-keyicon-guide">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_2_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-highlight">
- <path style="fill:#FFFFFF;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__03_up.svg b/src/data/images/android/svg/twelvekeys__kana__support__03_up.svg
deleted file mode 100644
index 6595329..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__03_up.svg
+++ /dev/null
@@ -1,52 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="up_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main">
- <path style="fill:#272727;" d=""
- />
-</g>
-<g id="style-keyicon-guide">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-highlight">
- <path style="fill:#FFFFFF;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_2_">
- <path style="fill:#333333;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__04_center.svg b/src/data/images/android/svg/twelvekeys__kana__support__04_center.svg
deleted file mode 100644
index a784c8a..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__04_center.svg
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="center_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main-highlight_1_">
- <path style="fill:#F9F9F9;" d=""/>
-</g>
-<g id="style-keyicon-guide">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_2_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_3_">
- <path style="fill:#333333;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__04_down.svg b/src/data/images/android/svg/twelvekeys__kana__support__04_down.svg
deleted file mode 100644
index 91c9605..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__04_down.svg
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="down_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main">
- <path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_2_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-highlight">
- <path style="fill:#FFFFFF;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__04_left.svg b/src/data/images/android/svg/twelvekeys__kana__support__04_left.svg
deleted file mode 100644
index 52c75f5..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__04_left.svg
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="left_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main">
- <path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_2_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-highlight_1_">
- <path style="fill:#FFFFFF;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__04_release.svg b/src/data/images/android/svg/twelvekeys__kana__support__04_release.svg
deleted file mode 100644
index c019d93..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__04_release.svg
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="release" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
- <path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide_4_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_5_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_6_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_7_">
- <path style="fill:#333333;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__04_right.svg b/src/data/images/android/svg/twelvekeys__kana__support__04_right.svg
deleted file mode 100644
index f3d3145..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__04_right.svg
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="right_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main">
- <path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_2_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-highlight">
- <path style="fill:#FFFFFF;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__04_up.svg b/src/data/images/android/svg/twelvekeys__kana__support__04_up.svg
deleted file mode 100644
index 5a95d5d..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__04_up.svg
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="up_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main">
- <path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-highlight">
- <path style="fill:#FFFFFF;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_2_">
- <path style="fill:#333333;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__05_center.svg b/src/data/images/android/svg/twelvekeys__kana__support__05_center.svg
deleted file mode 100644
index a784c8a..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__05_center.svg
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="center_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main-highlight_1_">
- <path style="fill:#F9F9F9;" d=""/>
-</g>
-<g id="style-keyicon-guide">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_2_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_3_">
- <path style="fill:#333333;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__05_down.svg b/src/data/images/android/svg/twelvekeys__kana__support__05_down.svg
deleted file mode 100644
index 91c9605..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__05_down.svg
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="down_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main">
- <path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_2_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-highlight">
- <path style="fill:#FFFFFF;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__05_left.svg b/src/data/images/android/svg/twelvekeys__kana__support__05_left.svg
deleted file mode 100644
index 52c75f5..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__05_left.svg
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="left_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main">
- <path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_2_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-highlight_1_">
- <path style="fill:#FFFFFF;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__05_release.svg b/src/data/images/android/svg/twelvekeys__kana__support__05_release.svg
deleted file mode 100644
index c019d93..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__05_release.svg
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="release" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
- <path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide_4_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_5_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_6_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_7_">
- <path style="fill:#333333;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__05_right.svg b/src/data/images/android/svg/twelvekeys__kana__support__05_right.svg
deleted file mode 100644
index f3d3145..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__05_right.svg
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="right_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main">
- <path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_2_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-highlight">
- <path style="fill:#FFFFFF;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__05_up.svg b/src/data/images/android/svg/twelvekeys__kana__support__05_up.svg
deleted file mode 100644
index 5a95d5d..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__05_up.svg
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="up_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main">
- <path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-highlight">
- <path style="fill:#FFFFFF;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_2_">
- <path style="fill:#333333;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__06_center.svg b/src/data/images/android/svg/twelvekeys__kana__support__06_center.svg
deleted file mode 100644
index a784c8a..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__06_center.svg
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="center_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main-highlight_1_">
- <path style="fill:#F9F9F9;" d=""/>
-</g>
-<g id="style-keyicon-guide">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_2_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_3_">
- <path style="fill:#333333;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__06_down.svg b/src/data/images/android/svg/twelvekeys__kana__support__06_down.svg
deleted file mode 100644
index 91c9605..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__06_down.svg
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="down_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main">
- <path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_2_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-highlight">
- <path style="fill:#FFFFFF;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__06_left.svg b/src/data/images/android/svg/twelvekeys__kana__support__06_left.svg
deleted file mode 100644
index 52c75f5..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__06_left.svg
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="left_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main">
- <path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_2_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-highlight_1_">
- <path style="fill:#FFFFFF;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__06_release.svg b/src/data/images/android/svg/twelvekeys__kana__support__06_release.svg
deleted file mode 100644
index c019d93..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__06_release.svg
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="release" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
- <path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide_4_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_5_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_6_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_7_">
- <path style="fill:#333333;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__06_right.svg b/src/data/images/android/svg/twelvekeys__kana__support__06_right.svg
deleted file mode 100644
index f3d3145..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__06_right.svg
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="right_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main">
- <path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_2_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-highlight">
- <path style="fill:#FFFFFF;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__06_up.svg b/src/data/images/android/svg/twelvekeys__kana__support__06_up.svg
deleted file mode 100644
index 5a95d5d..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__06_up.svg
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="up_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main">
- <path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-highlight">
- <path style="fill:#FFFFFF;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_2_">
- <path style="fill:#333333;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__07_center.svg b/src/data/images/android/svg/twelvekeys__kana__support__07_center.svg
deleted file mode 100644
index 34b65cc..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__07_center.svg
+++ /dev/null
@@ -1,52 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="center_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main-highlight_1_">
- <path style="fill:#F9F9F9;" d=""/>
-</g>
-<g id="style-keyicon-guide">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_2_">
- <path style="fill:#333333;" d=""
- />
-</g>
-<g id="style-keyicon-guide_3_">
- <path style="fill:#333333;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__07_down.svg b/src/data/images/android/svg/twelvekeys__kana__support__07_down.svg
deleted file mode 100644
index 91c9605..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__07_down.svg
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="down_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main">
- <path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_2_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-highlight">
- <path style="fill:#FFFFFF;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__07_left.svg b/src/data/images/android/svg/twelvekeys__kana__support__07_left.svg
deleted file mode 100644
index ef55df9..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__07_left.svg
+++ /dev/null
@@ -1,52 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="left_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main">
- <path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_2_">
- <path style="fill:#333333;" d=""
- />
-</g>
-<g id="style-keyicon-guide-highlight_1_">
- <path style="fill:#FFFFFF;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__07_release.svg b/src/data/images/android/svg/twelvekeys__kana__support__07_release.svg
deleted file mode 100644
index c4bbe4e..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__07_release.svg
+++ /dev/null
@@ -1,52 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="release" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
- <path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide_4_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_5_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_6_">
- <path style="fill:#333333;" d=""
- />
-</g>
-<g id="style-keyicon-guide_7_">
- <path style="fill:#333333;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__07_right.svg b/src/data/images/android/svg/twelvekeys__kana__support__07_right.svg
deleted file mode 100644
index b98b75b..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__07_right.svg
+++ /dev/null
@@ -1,52 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="right_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main">
- <path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
- <path style="fill:#333333;" d=""
- />
-</g>
-<g id="style-keyicon-guide_2_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-highlight">
- <path style="fill:#FFFFFF;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__07_up.svg b/src/data/images/android/svg/twelvekeys__kana__support__07_up.svg
deleted file mode 100644
index 5940d34..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__07_up.svg
+++ /dev/null
@@ -1,52 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="up_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main">
- <path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-highlight">
- <path style="fill:#FFFFFF;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
- <path style="fill:#333333;" d=""
- />
-</g>
-<g id="style-keyicon-guide_2_">
- <path style="fill:#333333;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__08_center.svg b/src/data/images/android/svg/twelvekeys__kana__support__08_center.svg
deleted file mode 100644
index 0e11fd7..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__08_center.svg
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="center_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main-highlight_1_">
- <path style="fill:#F9F9F9;" d=""/>
-</g>
-<g id="style-keyicon-guide">
-</g>
-<g id="style-keyicon-guide_1_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_2_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_3_">
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__08_down.svg b/src/data/images/android/svg/twelvekeys__kana__support__08_down.svg
deleted file mode 100644
index e850d07..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__08_down.svg
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="down_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main">
- <path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide">
-</g>
-<g id="style-keyicon-guide_1_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_2_">
-</g>
-<g id="style-keyicon-guide-highlight">
- <path style="fill:#FFFFFF;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__08_release.svg b/src/data/images/android/svg/twelvekeys__kana__support__08_release.svg
deleted file mode 100644
index 16d9808..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__08_release.svg
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="release" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
- <path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide_4_">
-</g>
-<g id="style-keyicon-guide_5_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_6_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_7_">
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__08_up.svg b/src/data/images/android/svg/twelvekeys__kana__support__08_up.svg
deleted file mode 100644
index f65000c..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__08_up.svg
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="up_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main">
- <path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide">
-</g>
-<g id="style-keyicon-guide-highlight">
- <path style="fill:#FFFFFF;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_2_">
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__09_center.svg b/src/data/images/android/svg/twelvekeys__kana__support__09_center.svg
deleted file mode 100644
index a784c8a..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__09_center.svg
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="center_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main-highlight_1_">
- <path style="fill:#F9F9F9;" d=""/>
-</g>
-<g id="style-keyicon-guide">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_2_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_3_">
- <path style="fill:#333333;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__09_down.svg b/src/data/images/android/svg/twelvekeys__kana__support__09_down.svg
deleted file mode 100644
index 91c9605..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__09_down.svg
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="down_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main">
- <path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_2_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-highlight">
- <path style="fill:#FFFFFF;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__09_left.svg b/src/data/images/android/svg/twelvekeys__kana__support__09_left.svg
deleted file mode 100644
index 52c75f5..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__09_left.svg
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="left_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main">
- <path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_2_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-highlight_1_">
- <path style="fill:#FFFFFF;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__09_release.svg b/src/data/images/android/svg/twelvekeys__kana__support__09_release.svg
deleted file mode 100644
index c019d93..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__09_release.svg
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="release" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
- <path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide_4_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_5_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_6_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_7_">
- <path style="fill:#333333;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__09_right.svg b/src/data/images/android/svg/twelvekeys__kana__support__09_right.svg
deleted file mode 100644
index f3d3145..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__09_right.svg
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="right_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main">
- <path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_2_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-highlight">
- <path style="fill:#FFFFFF;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__09_up.svg b/src/data/images/android/svg/twelvekeys__kana__support__09_up.svg
deleted file mode 100644
index 5a95d5d..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__09_up.svg
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="up_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main">
- <path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-highlight">
- <path style="fill:#FFFFFF;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_2_">
- <path style="fill:#333333;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__11_center.svg b/src/data/images/android/svg/twelvekeys__kana__support__11_center.svg
deleted file mode 100644
index 4370cd9..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__11_center.svg
+++ /dev/null
@@ -1,50 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="center_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main-highlight_1_">
- <path style="fill:#F9F9F9;" d=""/>
-</g>
-<g id="style-keyicon-guide">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_2_">
-</g>
-<g id="style-keyicon-guide_3_">
- <path style="fill:#333333;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__11_left.svg b/src/data/images/android/svg/twelvekeys__kana__support__11_left.svg
deleted file mode 100644
index 3854f2e..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__11_left.svg
+++ /dev/null
@@ -1,50 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="left_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main">
- <path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_2_">
-</g>
-<g id="style-keyicon-guide-highlight_1_">
- <path style="fill:#FFFFFF;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__11_release.svg b/src/data/images/android/svg/twelvekeys__kana__support__11_release.svg
deleted file mode 100644
index 10b7967..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__11_release.svg
+++ /dev/null
@@ -1,50 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="release" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
- <path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide_4_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_5_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_6_">
-</g>
-<g id="style-keyicon-guide_7_">
- <path style="fill:#333333;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__11_right.svg b/src/data/images/android/svg/twelvekeys__kana__support__11_right.svg
deleted file mode 100644
index 19491e3..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__11_right.svg
+++ /dev/null
@@ -1,50 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="right_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main">
- <path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
-</g>
-<g id="style-keyicon-guide_2_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-highlight">
- <path style="fill:#FFFFFF;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__11_up.svg b/src/data/images/android/svg/twelvekeys__kana__support__11_up.svg
deleted file mode 100644
index 7a59237..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__11_up.svg
+++ /dev/null
@@ -1,50 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="up_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main">
- <path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-guide">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-guide-highlight">
- <path style="fill:#FFFFFF;" d=""/>
-</g>
-<g id="style-keyicon-guide_1_">
-</g>
-<g id="style-keyicon-guide_2_">
- <path style="fill:#333333;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__12_center.svg b/src/data/images/android/svg/twelvekeys__kana__support__12_center.svg
deleted file mode 100644
index 08b03d3..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__12_center.svg
+++ /dev/null
@@ -1,53 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="twelvekeys_x5F__x5F_kana_x5F__x5F_support_x5F__x5F_12_x5F_center"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="105px" height="87px"
- viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main-highlight">
- <path style="fill:#FFFFFF;" d=""/>
-</g>
-<g id="style-keyicon-main">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-main_1_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-main_2_">
- <path style="fill:#333333;" d=""/>
-</g>
-<polyline id="style-keyicon-bound_3_" style="fill:none;stroke:#CCCBCB;stroke-miterlimit:10;" points="43.5,42 43.5,33.5
- 60.5,33.5 60.5,50.5 52,50.5 "/>
-<polyline id="style-keyicon-bound_2_" style="fill:none;stroke:#CCCBCB;stroke-miterlimit:10;" points="13.5,42 13.5,33.5
- 30.5,33.5 30.5,50.5 22,50.5 "/>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__12_down.svg b/src/data/images/android/svg/twelvekeys__kana__support__12_down.svg
new file mode 100644
index 0000000..5ddff9e
--- /dev/null
+++ b/src/data/images/android/svg/twelvekeys__kana__support__12_down.svg
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<svg version="1.1" id="release_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
+<polyline id="style-keyicon-bound_1_" style="fill:none;stroke:#CCCBCB;stroke-miterlimit:10;" points="43.5,42 43.5,33.5
+ 60.5,33.5 60.5,50.5 52,50.5 "/>
+<g id="style-keyicon-main_1_">
+ <text x="52.5" y="43.5" style="font-size:24px;text-anchor:middle;dominant-baseline:central;fill:#FF000000;">、</text>
+</g>
+<polyline id="style-keyicon-bound_2_" style="fill:none;stroke:#CCCBCB;stroke-miterlimit:10;" points="13.5,42 13.5,33.5
+ 30.5,33.5 30.5,50.5 22,50.5 "/>
+<g id="style-keyicon-main_2_">
+ <text x="20" y="43.5" style="font-size:24px;text-anchor:middle;dominant-baseline:central;fill:#FF000000;">。</text>
+</g>
+<g id="style-keyicon-main_3_">
+ <text x="52.5" y="14.5" style="font-size:24px;text-anchor:middle;dominant-baseline:central;fill:#FF000000;">?</text>
+</g>
+<g id="style-keyicon-main_4_">
+ <text x="85" y="43.5" style="font-size:24px;text-anchor:middle;dominant-baseline:central;fill:#FF000000;">!</text>
+</g>
+<g id="style-keyicon-guide-highlight_5_">
+ <text x="52.5" y="72.5" style="font-size:18px;text-anchor:middle;dominant-baseline:central;fill:#FF000000;">…</text>
+</g>
+</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__12_left.svg b/src/data/images/android/svg/twelvekeys__kana__support__12_left.svg
deleted file mode 100644
index 470ec95..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__12_left.svg
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="twelvekeys_x5F__x5F_kana_x5F__x5F_support_x5F__x5F_12_x5F_left"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="105px" height="87px"
- viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main">
- <path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-main_1_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-main_2_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-main-highlight_1_">
- <path style="fill:#FFFFFF;" d=""/>
-</g>
-<polyline id="style-keyicon-bound_4_" style="fill:none;stroke:#CCCBCB;stroke-miterlimit:10;" points="43.5,42 43.5,33.5
- 60.5,33.5 60.5,50.5 52,50.5 "/>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__12_release.svg b/src/data/images/android/svg/twelvekeys__kana__support__12_release.svg
deleted file mode 100644
index ef13fc2..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__12_release.svg
+++ /dev/null
@@ -1,53 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="twelvekeys_x5F__x5F_kana_x5F__x5F_support_x5F__x5F_12_x5F_release"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="105px" height="87px"
- viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main">
- <path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-main_1_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-main_2_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-main_3_">
- <path style="fill:#333333;" d=""/>
-</g>
-<polyline id="style-keyicon-bound_10_" style="fill:none;stroke:#CCCBCB;stroke-miterlimit:10;" points="43.5,42 43.5,33.5
- 60.5,33.5 60.5,50.5 52,50.5 "/>
-<polyline id="style-keyicon-bound_9_" style="fill:none;stroke:#CCCBCB;stroke-miterlimit:10;" points="13.5,42 13.5,33.5
- 30.5,33.5 30.5,50.5 22,50.5 "/>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__12_right.svg b/src/data/images/android/svg/twelvekeys__kana__support__12_right.svg
deleted file mode 100644
index 2d29c81..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__12_right.svg
+++ /dev/null
@@ -1,53 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="twelvekeys_x5F__x5F_kana_x5F__x5F_support_x5F__x5F_12_x5F_right"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="105px" height="87px"
- viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main">
- <path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-main-highlight">
- <path style="fill:#FFFFFF;" d=""/>
-</g>
-<g id="style-keyicon-main_1_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-main_2_">
- <path style="fill:#333333;" d=""/>
-</g>
-<polyline id="style-keyicon-bound_8_" style="fill:none;stroke:#CCCBCB;stroke-miterlimit:10;" points="43.5,42 43.5,33.5
- 60.5,33.5 60.5,50.5 52,50.5 "/>
-<polyline id="style-keyicon-bound_7_" style="fill:none;stroke:#CCCBCB;stroke-miterlimit:10;" points="13.5,42 13.5,33.5
- 30.5,33.5 30.5,50.5 22,50.5 "/>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__12_up.svg b/src/data/images/android/svg/twelvekeys__kana__support__12_up.svg
deleted file mode 100644
index 2bd1794..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__12_up.svg
+++ /dev/null
@@ -1,53 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="twelvekeys_x5F__x5F_kana_x5F__x5F_support_x5F__x5F_12_x5F_up"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="105px" height="87px"
- viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main">
- <path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-main_1_">
- <path style="fill:#333333;" d=""/>
-</g>
-<g id="style-keyicon-main-highlight">
- <path style="fill:#FFFFFF;" d=""/>
-</g>
-<g id="style-keyicon-main_2_">
- <path style="fill:#333333;" d=""/>
-</g>
-<polyline id="style-keyicon-bound_6_" style="fill:none;stroke:#CCCBCB;stroke-miterlimit:10;" points="43.5,42 43.5,33.5
- 60.5,33.5 60.5,50.5 52,50.5 "/>
-<polyline id="style-keyicon-bound_5_" style="fill:none;stroke:#CCCBCB;stroke-miterlimit:10;" points="13.5,42 13.5,33.5
- 30.5,33.5 30.5,50.5 22,50.5 "/>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__popup__01.svg b/src/data/images/android/svg/twelvekeys__kana__support__popup__01.svg
deleted file mode 100644
index 1780b39..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__popup__01.svg
+++ /dev/null
@@ -1,53 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<circle id="style-keypopup-highlight" style="fill-rule:evenodd;clip-rule:evenodd;fill:#F7982D;" cx="56" cy="56" r="22"/>
-<g id="style-keyicon-main_5_">
- <path d=""
- />
-</g>
-<g id="style-keyicon-main_6_">
- <path d=""/>
-</g>
-<g id="style-keyicon-main_7_">
- <path d=""/>
-</g>
-<g id="style-keyicon-main_8_">
- <path d=""/>
-</g>
-<g id="style-keyicon-main_9_">
- <path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__popup__02.svg b/src/data/images/android/svg/twelvekeys__kana__support__popup__02.svg
deleted file mode 100644
index 472a72d..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__popup__02.svg
+++ /dev/null
@@ -1,52 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<circle id="style-keypopup-highlight" style="fill-rule:evenodd;clip-rule:evenodd;fill:#F7982D;" cx="56" cy="56" r="22"/>
-<g id="style-keyicon-main_5_">
- <path d=""/>
-</g>
-<g id="style-keyicon-main_6_">
- <path d=""/>
-</g>
-<g id="style-keyicon-main_7_">
- <path d=""/>
-</g>
-<g id="style-keyicon-main_8_">
- <path d=""/>
-</g>
-<g id="style-keyicon-main_9_">
- <path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__popup__03.svg b/src/data/images/android/svg/twelvekeys__kana__support__popup__03.svg
deleted file mode 100644
index 1f9b193..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__popup__03.svg
+++ /dev/null
@@ -1,54 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<circle id="style-keypopup-highlight" style="fill-rule:evenodd;clip-rule:evenodd;fill:#F7982D;" cx="56" cy="56" r="22"/>
-<g id="style-keyicon-main_5_">
- <path d=""/>
-</g>
-<g id="style-keyicon-main_6_">
- <path d=""/>
-</g>
-<g id="style-keyicon-main_7_">
- <path d=""/>
-</g>
-<g id="style-keyicon-main_8_">
- <path d=""
- />
-</g>
-<g id="style-keyicon-main_9_">
- <path d=""
- />
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__popup__04.svg b/src/data/images/android/svg/twelvekeys__kana__support__popup__04.svg
deleted file mode 100644
index 472a72d..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__popup__04.svg
+++ /dev/null
@@ -1,52 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<circle id="style-keypopup-highlight" style="fill-rule:evenodd;clip-rule:evenodd;fill:#F7982D;" cx="56" cy="56" r="22"/>
-<g id="style-keyicon-main_5_">
- <path d=""/>
-</g>
-<g id="style-keyicon-main_6_">
- <path d=""/>
-</g>
-<g id="style-keyicon-main_7_">
- <path d=""/>
-</g>
-<g id="style-keyicon-main_8_">
- <path d=""/>
-</g>
-<g id="style-keyicon-main_9_">
- <path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__popup__05.svg b/src/data/images/android/svg/twelvekeys__kana__support__popup__05.svg
deleted file mode 100644
index 472a72d..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__popup__05.svg
+++ /dev/null
@@ -1,52 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<circle id="style-keypopup-highlight" style="fill-rule:evenodd;clip-rule:evenodd;fill:#F7982D;" cx="56" cy="56" r="22"/>
-<g id="style-keyicon-main_5_">
- <path d=""/>
-</g>
-<g id="style-keyicon-main_6_">
- <path d=""/>
-</g>
-<g id="style-keyicon-main_7_">
- <path d=""/>
-</g>
-<g id="style-keyicon-main_8_">
- <path d=""/>
-</g>
-<g id="style-keyicon-main_9_">
- <path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__popup__06.svg b/src/data/images/android/svg/twelvekeys__kana__support__popup__06.svg
deleted file mode 100644
index 472a72d..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__popup__06.svg
+++ /dev/null
@@ -1,52 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<circle id="style-keypopup-highlight" style="fill-rule:evenodd;clip-rule:evenodd;fill:#F7982D;" cx="56" cy="56" r="22"/>
-<g id="style-keyicon-main_5_">
- <path d=""/>
-</g>
-<g id="style-keyicon-main_6_">
- <path d=""/>
-</g>
-<g id="style-keyicon-main_7_">
- <path d=""/>
-</g>
-<g id="style-keyicon-main_8_">
- <path d=""/>
-</g>
-<g id="style-keyicon-main_9_">
- <path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__popup__07.svg b/src/data/images/android/svg/twelvekeys__kana__support__popup__07.svg
deleted file mode 100644
index 472a72d..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__popup__07.svg
+++ /dev/null
@@ -1,52 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<circle id="style-keypopup-highlight" style="fill-rule:evenodd;clip-rule:evenodd;fill:#F7982D;" cx="56" cy="56" r="22"/>
-<g id="style-keyicon-main_5_">
- <path d=""/>
-</g>
-<g id="style-keyicon-main_6_">
- <path d=""/>
-</g>
-<g id="style-keyicon-main_7_">
- <path d=""/>
-</g>
-<g id="style-keyicon-main_8_">
- <path d=""/>
-</g>
-<g id="style-keyicon-main_9_">
- <path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__popup__08.svg b/src/data/images/android/svg/twelvekeys__kana__support__popup__08.svg
deleted file mode 100644
index 7e3ecf3..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__popup__08.svg
+++ /dev/null
@@ -1,50 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<circle id="style-keypopup-highlight" style="fill-rule:evenodd;clip-rule:evenodd;fill:#F7982D;" cx="56" cy="56" r="22"/>
-<g id="style-keyicon-main_5_">
- <path d=""/>
-</g>
-<g id="style-keyicon-main_6_">
-</g>
-<g id="style-keyicon-main_7_">
-</g>
-<g id="style-keyicon-main_8_">
- <path d=""/>
-</g>
-<g id="style-keyicon-main_9_">
- <path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__popup__09.svg b/src/data/images/android/svg/twelvekeys__kana__support__popup__09.svg
deleted file mode 100644
index 472a72d..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__popup__09.svg
+++ /dev/null
@@ -1,52 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<circle id="style-keypopup-highlight" style="fill-rule:evenodd;clip-rule:evenodd;fill:#F7982D;" cx="56" cy="56" r="22"/>
-<g id="style-keyicon-main_5_">
- <path d=""/>
-</g>
-<g id="style-keyicon-main_6_">
- <path d=""/>
-</g>
-<g id="style-keyicon-main_7_">
- <path d=""/>
-</g>
-<g id="style-keyicon-main_8_">
- <path d=""/>
-</g>
-<g id="style-keyicon-main_9_">
- <path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__popup__11.svg b/src/data/images/android/svg/twelvekeys__kana__support__popup__11.svg
deleted file mode 100644
index 19016bd..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__popup__11.svg
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<circle id="style-keypopup-highlight" style="fill-rule:evenodd;clip-rule:evenodd;fill:#F7982D;" cx="56" cy="56" r="22"/>
-<g id="style-keyicon-main_5_">
- <path d=""/>
-</g>
-<g id="style-keyicon-main_6_">
- <path d=""/>
-</g>
-<g id="style-keyicon-main_7_">
- <path d=""/>
-</g>
-<g id="style-keyicon-main_8_">
-</g>
-<g id="style-keyicon-main_9_">
- <path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__kana__support__popup__12.svg b/src/data/images/android/svg/twelvekeys__kana__support__popup__12.svg
deleted file mode 100644
index 19016bd..0000000
--- a/src/data/images/android/svg/twelvekeys__kana__support__popup__12.svg
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<circle id="style-keypopup-highlight" style="fill-rule:evenodd;clip-rule:evenodd;fill:#F7982D;" cx="56" cy="56" r="22"/>
-<g id="style-keyicon-main_5_">
- <path d=""/>
-</g>
-<g id="style-keyicon-main_6_">
- <path d=""/>
-</g>
-<g id="style-keyicon-main_7_">
- <path d=""/>
-</g>
-<g id="style-keyicon-main_8_">
-</g>
-<g id="style-keyicon-main_9_">
- <path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__number__01.svg b/src/data/images/android/svg/twelvekeys__number__01.svg
deleted file mode 100644
index 06e9fa1..0000000
--- a/src/data/images/android/svg/twelvekeys__number__01.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="release" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__number__02.svg b/src/data/images/android/svg/twelvekeys__number__02.svg
deleted file mode 100644
index 06e9fa1..0000000
--- a/src/data/images/android/svg/twelvekeys__number__02.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="release" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__number__03.svg b/src/data/images/android/svg/twelvekeys__number__03.svg
deleted file mode 100644
index 06e9fa1..0000000
--- a/src/data/images/android/svg/twelvekeys__number__03.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="release" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__number__04.svg b/src/data/images/android/svg/twelvekeys__number__04.svg
deleted file mode 100644
index 06e9fa1..0000000
--- a/src/data/images/android/svg/twelvekeys__number__04.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="release" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__number__05.svg b/src/data/images/android/svg/twelvekeys__number__05.svg
deleted file mode 100644
index 06e9fa1..0000000
--- a/src/data/images/android/svg/twelvekeys__number__05.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="release" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__number__06.svg b/src/data/images/android/svg/twelvekeys__number__06.svg
deleted file mode 100644
index 06e9fa1..0000000
--- a/src/data/images/android/svg/twelvekeys__number__06.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="release" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__number__07.svg b/src/data/images/android/svg/twelvekeys__number__07.svg
deleted file mode 100644
index 06e9fa1..0000000
--- a/src/data/images/android/svg/twelvekeys__number__07.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="release" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__number__08.svg b/src/data/images/android/svg/twelvekeys__number__08.svg
deleted file mode 100644
index 06e9fa1..0000000
--- a/src/data/images/android/svg/twelvekeys__number__08.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="release" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__number__09.svg b/src/data/images/android/svg/twelvekeys__number__09.svg
deleted file mode 100644
index 06e9fa1..0000000
--- a/src/data/images/android/svg/twelvekeys__number__09.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="release" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__number__10.svg b/src/data/images/android/svg/twelvekeys__number__10.svg
deleted file mode 100644
index e567969..0000000
--- a/src/data/images/android/svg/twelvekeys__number__10.svg
+++ /dev/null
@@ -1,45 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="twelvekeys_x5F__x5F_number_x5F__x5F_10"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="105px" height="87px"
- viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main">
- <path style="fill:#272727;" d=""/>
- <path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-main_1_">
- <path style="fill:#272727;" d=""/>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__number__11.svg b/src/data/images/android/svg/twelvekeys__number__11.svg
deleted file mode 100644
index 06e9fa1..0000000
--- a/src/data/images/android/svg/twelvekeys__number__11.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="release" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main_1_">
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__number__12.svg b/src/data/images/android/svg/twelvekeys__number__12.svg
deleted file mode 100644
index 066efc3..0000000
--- a/src/data/images/android/svg/twelvekeys__number__12.svg
+++ /dev/null
@@ -1,45 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="twelvekeys_x5F__x5F_number_x5F__x5F_12"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="105px" height="87px"
- viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
-<g id="style-keyicon-main_2_">
- <path style="fill:#272727;" d=""/>
- <path style="fill:#272727;" d=""/>
-</g>
-<g id="style-keyicon-main_3_">
- <path style="fill:#272727;" d=""/>
- <path style="fill:#272727;" d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__number__support__popup__10.svg b/src/data/images/android/svg/twelvekeys__number__support__popup__10.svg
deleted file mode 100644
index 19016bd..0000000
--- a/src/data/images/android/svg/twelvekeys__number__support__popup__10.svg
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<circle id="style-keypopup-highlight" style="fill-rule:evenodd;clip-rule:evenodd;fill:#F7982D;" cx="56" cy="56" r="22"/>
-<g id="style-keyicon-main_5_">
- <path d=""/>
-</g>
-<g id="style-keyicon-main_6_">
- <path d=""/>
-</g>
-<g id="style-keyicon-main_7_">
- <path d=""/>
-</g>
-<g id="style-keyicon-main_8_">
-</g>
-<g id="style-keyicon-main_9_">
- <path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/svg/twelvekeys__number__support__popup__12.svg b/src/data/images/android/svg/twelvekeys__number__support__popup__12.svg
deleted file mode 100644
index 19016bd..0000000
--- a/src/data/images/android/svg/twelvekeys__number__support__popup__12.svg
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- Copyright 2010-2014, Google Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following disclaimer
- in the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
-<circle id="style-keypopup-highlight" style="fill-rule:evenodd;clip-rule:evenodd;fill:#F7982D;" cx="56" cy="56" r="22"/>
-<g id="style-keyicon-main_5_">
- <path d=""/>
-</g>
-<g id="style-keyicon-main_6_">
- <path d=""/>
-</g>
-<g id="style-keyicon-main_7_">
- <path d=""/>
-</g>
-<g id="style-keyicon-main_8_">
-</g>
-<g id="style-keyicon-main_9_">
- <path d=""/>
-</g>
-</svg>
diff --git a/src/data/images/android/template/godan__kana__support__12__template.svg b/src/data/images/android/template/godan__kana__support__12__template.svg
new file mode 100644
index 0000000..d1b85d2
--- /dev/null
+++ b/src/data/images/android/template/godan__kana__support__12__template.svg
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<svg version="1.1" id="release_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="65px" height="50px" viewBox="0 0 65 50" style="enable-background:new 0 0 65 50;" xml:space="preserve">
+<g id="style-keyicon-main{id_suffix_center}_1_">
+ <text x="32.5" y="24.5" style="font-size:28px;text-anchor:middle;dominant-baseline:central;fill:#FF000000;">中</text>
+</g>
+<polyline id="style-keyicon-bound_2_" style="fill:none;stroke:#CCCBCB;stroke-miterlimit:10;" points="9.25,24.5 9.25,20 18.25,20 18.25,29 13.75,29 "/>
+<g id="style-keyicon-guide{id_suffix_left}_2_">
+ <text x="13" y="24.5" style="font-size:12px;text-anchor:middle;dominant-baseline:central;fill:#FF000000;">左</text>
+</g>
+<g id="style-keyicon-guide{id_suffix_up}_3_">
+ <text x="32.5" y="7" style="font-size:12px;text-anchor:middle;dominant-baseline:central;fill:#FF000000;">上</text>
+</g>
+<g id="style-keyicon-guide{id_suffix_right}_4_">
+ <text x="51" y="24.5" style="font-size:12px;text-anchor:middle;dominant-baseline:central;fill:#FF000000;">右</text>
+</g>
+<polyline id="style-keyicon-bound_3_" style="fill:none;stroke:#CCCBCB;stroke-miterlimit:10;" points="27.75,42.834 27.75,38.334 36.75,38.334 36.75,47.334 32.25,47.334 "/>
+<g id="style-keyicon-guide{id_suffix_down}_5_">
+ <text x="31.5" y="43" style="font-size:12px;text-anchor:middle;dominant-baseline:central;fill:#FF000000;">下</text>
+</g>
+</svg>
diff --git a/src/data/images/android/template/godan__kana__support__template.svg b/src/data/images/android/template/godan__kana__support__template.svg
new file mode 100644
index 0000000..50285f1
--- /dev/null
+++ b/src/data/images/android/template/godan__kana__support__template.svg
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<svg version="1.1" id="release_1_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="65px" height="50px" style="enable-background:new 0 0 65 50;" xml:space="preserve">
+<g id="style-keyicon-main{id_suffix_center}_1_">
+ <text x="32.5" y="24.5" style="font-size:28px;text-anchor:middle;dominant-baseline:central;fill:#FF000000;">中</text>
+</g>
+<g id="style-keyicon-guide{id_suffix_left}_2_">
+ <text x="12" y="24.5" style="font-size:12px;text-anchor:middle;dominant-baseline:central;fill:#FF000000;">左</text>
+</g>
+<g id="style-keyicon-guide{id_suffix_up}_3_">
+ <text x="32.5" y="7" style="font-size:12px;text-anchor:middle;dominant-baseline:central;fill:#FF000000;">上</text>
+</g>
+<g id="style-keyicon-guide{id_suffix_right}_4_">
+ <text x="53" y="24.5" style="font-size:12px;text-anchor:middle;dominant-baseline:central;fill:#FF000000;">右</text>
+</g>
+<g id="style-keyicon-guide{id_suffix_down}_5_">
+ <text x="32.5" y="43" style="font-size:12px;text-anchor:middle;dominant-baseline:central;fill:#FF000000;">下</text>
+</g>
+</svg>
diff --git a/src/data/images/android/template/qwerty__keyicon__template.svg b/src/data/images/android/template/qwerty__keyicon__template.svg
new file mode 100644
index 0000000..a83cf34
--- /dev/null
+++ b/src/data/images/android/template/qwerty__keyicon__template.svg
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!--
+ NOTE: - '中' must be located at the center. Otherwise popup will broken.
+ - qwerty_keyicon_template and qwerty_popup_template must be the same in their size.
+-->
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="48" height="56" style="enable-background:new 0 0 48 74;" xml:space="preserve">
+<g>
+ <text id="style-keyicon-guide" x="43.5" y="6.5" style="font-size:17px;text-anchor:middle;dominant-baseline:central;fill:#272727;">副</text>
+ <text id="style-keyicon-main" x="24" y="28" style="font-size:39.5px;text-anchor:middle;dominant-baseline:central;fill:#272727;">中</text>
+</g>
+</svg>
diff --git a/src/data/images/android/template/qwerty__popup__template.svg b/src/data/images/android/template/qwerty__popup__template.svg
new file mode 100644
index 0000000..f2ae3d2
--- /dev/null
+++ b/src/data/images/android/template/qwerty__popup__template.svg
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!--
+ NOTE: '中' must be located at the center. Otherwise popup will broken.
+-->
+<svg xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xml:space="preserve"
+ version="1.1"
+ width="48"
+ height="56">
+ <text id="style-keyicon-main" x="24" y="26" style="font-size:39.5px;text-anchor:middle;dominant-baseline:central;fill:#272727;">中</text>
+</svg>
diff --git a/src/data/images/android/template/support__popup__template.svg b/src/data/images/android/template/support__popup__template.svg
new file mode 100644
index 0000000..7056362
--- /dev/null
+++ b/src/data/images/android/template/support__popup__template.svg
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<svg version="1.1"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xml:space="preserve"
+ width="112px"
+ height="112px">
+ <circle id="style-keypopup-highlight" style="fill-rule:evenodd;clip-rule:evenodd;fill:#F7982D;" cx="56" cy="56" r="27"/>
+ <text id="style-keyicon-main_1_" x="56" y="56" style="font-size:48px;text-anchor:middle;dominant-baseline:central;">中</text>
+ <text id="style-keyicon-main_2_" x="15" y="56" style="font-size:26px;text-anchor:middle;dominant-baseline:central;">左</text>
+ <text id="style-keyicon-main_3_" x="56" y="15" style="font-size:26px;text-anchor:middle;dominant-baseline:central;">上</text>
+ <text id="style-keyicon-main_4_" x="97" y="56" style="font-size:26px;text-anchor:middle;dominant-baseline:central;">右</text>
+ <text id="style-keyicon-main_5_" x="56" y="97" style="font-size:26px;text-anchor:middle;dominant-baseline:central;">下</text>
+</svg>
diff --git a/src/data/images/android/template/transform.py b/src/data/images/android/template/transform.py
new file mode 100644
index 0000000..1cfb7ff
--- /dev/null
+++ b/src/data/images/android/template/transform.py
@@ -0,0 +1,718 @@
+# -*- coding: utf-8 -*-
+# Copyright 2010-2014, Google Inc.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+"""Generates svg files from templates.
+
+Usage:
+$ mkdir OUTPUT_PATH
+$ python transform.py --output_dir=OUTPUT_PATH
+
+Note:
+We use half-width characters for following to adjust the position
+on software keyboards.
+See also: b/16722519
+
+"(", ")", "!", "?", ":"
+
+Half-width is also used for "/" for better look.
+"""
+
+import logging
+import optparse
+import os
+import tempfile
+import zipfile
+
+
+ABS_SCRIPT_DIR = os.path.abspath(os.path.dirname(__file__))
+
+_REPLACE_CHAR = '中'
+_REPLACE_CHAR_QWERTY_SUPPORT = '副'
+
+_REPLACE_CHARS = ('中', '左', '上', '右', '下')
+
+_REPLACE_ID_SUFFIXEX = (
+ '{id_suffix_center}', '{id_suffix_left}', '{id_suffix_up}',
+ '{id_suffix_right}', '{id_suffix_down}')
+
+_EXPAND_SUPPORT_SUFFIXES = (
+ 'center', 'left', 'up', 'right', 'down', 'release')
+
+_GODAN_KANA_SUPPORT_KEY_DEFINITIONS = [
+ {'name': '01',
+ 'chars': ('A', '', '', '', '1'),
+ 'id_suffixes': ('', '-light', '-light', '-light', '-light')},
+ {'name': '02',
+ 'chars': ('K', '', 'Q', 'G', '2'),
+ 'id_suffixes': ('', '-light', '-light', '-light', '-light')},
+ {'name': '03',
+ 'chars': ('H', 'P', 'F', 'B', '3'),
+ 'id_suffixes': ('', '-light', '-light', '-light', '-light')},
+ {'name': '04',
+ 'chars': ('I', '', '', '', '4'),
+ 'id_suffixes': ('', '-light', '-light', '-light', '-light')},
+ {'name': '05',
+ 'chars': ('S', '', 'J', 'Z', '5'),
+ 'id_suffixes': ('', '-light', '-light', '-light', '-light')},
+ {'name': '06',
+ 'chars': ('M', '/', 'L', 'ー', '6'),
+ 'id_suffixes': ('', '-light', '-light', '-light', '-light')},
+ {'name': '07',
+ 'chars': ('U', '', '', '', '7'),
+ 'id_suffixes': ('', '-light', '-light', '-light', '-light')},
+ {'name': '08',
+ 'chars': ('T', '', 'C', 'D', '8'),
+ 'id_suffixes': ('', '-light', '-light', '-light', '-light')},
+ {'name': '09',
+ 'chars': ('Y', '(', 'X', ')', '9'),
+ 'id_suffixes': ('', '-light', '-light', '-light', '-light')},
+ {'name': '10',
+ 'chars': ('E', '', '', '', ''),
+ 'id_suffixes': ('', '-light', '-light', '-light', '-light')},
+ {'name': '11',
+ 'chars': ('N', ':', '', '・', '0'),
+ 'id_suffixes': ('', '-light', '-light', '-light', '-light')},
+ # 12: Needs another template. Defined bellow
+ {'name': '13',
+ 'chars': ('O', '', '', '', ''),
+ 'id_suffixes': ('', '-light', '-light', '-light', '-light')},
+ # 14: "大小" key(godan__kana__14.svg): Will be modified directly
+ {'name': '15',
+ 'chars': ('W', '「', 'V', '」', ''),
+ 'id_suffixes': ('', '-light', '-light', '-light', '-light')},
+ ]
+
+_GODAN_KANA_SUPPORT_12_KEY_DEFINITION = [
+ {'name': '12',
+ 'chars': ('R', '。', '?', '!', '、'),
+ 'id_suffixes': ('', '-light', '-light', '-light', '-light')},
+ ]
+
+_GODAN_KANA_SUPPORT_POPUP_KEY_DEFINITIONS = [
+ {'name': '01', 'chars': ('A', '', '', '', '1')},
+ {'name': '02', 'chars': ('K', '', 'Q', 'G', '2')},
+ {'name': '03', 'chars': ('H', 'P', 'F', 'B', '3')},
+ {'name': '04', 'chars': ('I', '', '', '', '4')},
+ {'name': '05', 'chars': ('S', '', 'J', 'Z', '5')},
+ {'name': '06', 'chars': ('M', '/', 'L', 'ー', '6')},
+ {'name': '07', 'chars': ('U', '', '', '', '7')},
+ {'name': '08', 'chars': ('T', '', 'C', 'D', '8')},
+ {'name': '09', 'chars': ('Y', '(', 'X', ')', '9')},
+ {'name': '10', 'chars': ('E', '', '', '', '')},
+ # Use half-width ':' to adjust character position.
+ {'name': '11', 'chars': ('N', ':', 'ん', '・', '0')},
+ {'name': '12', 'chars': ('R', '。', '?', '!', '、')},
+ {'name': '13', 'chars': ('O', '', '', '', '')},
+ # 14: "大小" key: godan__kana__14.svg will be used.
+ # Please check mozc/android/resources/res/xml/
+ {'name': '15', 'chars': ('W', '「', 'V', '」', '')},
+ ]
+
+_QWERTY_SUPPORT_KEY_MAPPING = {
+ 'q': '1',
+ 'w': '2',
+ 'e': '3',
+ 'r': '4',
+ 't': '5',
+ 'y': '6',
+ 'u': '7',
+ 'i': '8',
+ 'o': '9',
+ 'p': '0',
+}
+
+# 'A'-'Z' will be generated by GenerateQwertyAlphabetKeyDefinitions().
+_QWERTY_KEYICON_KEY_DEFINITIONS = [
+ {'name': 'digit_zero', 'char': '0'},
+ {'name': 'digit_one', 'char': '1'},
+ {'name': 'digit_two', 'char': '2'},
+ {'name': 'digit_three', 'char': '3'},
+ {'name': 'digit_four', 'char': '4'},
+ {'name': 'digit_five', 'char': '5'},
+ {'name': 'digit_six', 'char': '6'},
+ {'name': 'digit_seven', 'char': '7'},
+ {'name': 'digit_eight', 'char': '8'},
+ {'name': 'digit_nine', 'char': '9'},
+
+ {'name': 'ampersand', 'char': '&'},
+ {'name': 'apostrophe', 'char': '''},
+ {'name': 'asterisk', 'char': '*'},
+ {'name': 'circumflex_accent', 'char': '^'},
+ {'name': 'colon', 'char': ':'},
+ {'name': 'comma', 'char': ','},
+ {'name': 'commercial_at', 'char': '@'},
+ {'name': 'dollar_sign', 'char': '$'},
+ {'name': 'equals_sign', 'char': '='},
+ {'name': 'exclamation_mark', 'char': '!'},
+ {'name': 'full_stop', 'char': '.'},
+ {'name': 'grave_accent', 'char': '`'},
+ {'name': 'less_than_sign', 'char': '<'},
+ {'name': 'greater_than_sign', 'char': '>'},
+ {'name': 'hyphen_minus', 'char': '-'},
+ {'name': 'ideographic_comma', 'char': '、'},
+ {'name': 'ideographic_full_stop', 'char': '。'},
+ {'name': 'katakana_middle_dot', 'char': '・'},
+ {'name': 'left_corner_bracket', 'char': '「'},
+ {'name': 'right_corner_bracket', 'char': '」'},
+ {'name': 'left_curly_bracket', 'char': '{'},
+ {'name': 'right_curly_bracket', 'char': '}'},
+ {'name': 'left_parenthesis', 'char': '('},
+ {'name': 'right_parenthesis', 'char': ')'},
+ {'name': 'left_square_bracket', 'char': '['},
+ {'name': 'right_square_bracket', 'char': ']'},
+ {'name': 'low_line', 'char': '_'},
+ {'name': 'minus_sign', 'char': '−'},
+ {'name': 'number_sign', 'char': '#'},
+ {'name': 'percent_sign', 'char': '%'},
+ {'name': 'plus_sign', 'char': '+'},
+ {'name': 'question_mark', 'char': '?'},
+ {'name': 'quotation_mark', 'char': '"'},
+ {'name': 'reverse_solidus', 'char': '\\'},
+ {'name': 'semicolon', 'char': ';'},
+ {'name': 'solidus', 'char': '/'},
+ {'name': 'tilde', 'char': '~'},
+ {'name': 'vertical_line', 'char': '|'},
+
+ # Use half-width ':' to adjust character position.
+ {'name': 'fullwidth_colon', 'char': ':'},
+
+ # Use half-width '/' for a better look.
+ # TODO(team): This rule generates qwerty__keyicon__fullwidth__solidus but
+ # currently it's used only by GODAN. Rename it.
+ {'name': 'fullwidth_solidus', 'char': '/'},
+ ]
+
+_TWELVEKEYS_ALPHABET_KEY_DEFINITIONS = [
+ # 01, 11 and 12 have spaces among their characters.
+ # Without them shown characters are too close.
+ {'name': '01', 'char': '@ - _ /'},
+ {'name': '02', 'char': 'ABC'},
+ {'name': '03', 'char': 'DEF'},
+ {'name': '04', 'char': 'GHI'},
+ {'name': '05', 'char': 'JKL'},
+ {'name': '06', 'char': 'MNO'},
+ {'name': '07', 'char': 'PQRS'},
+ {'name': '08', 'char': 'TUV'},
+ {'name': '09', 'char': 'WXYZ'},
+ # 10: "a-A" key. Will be modified directly.
+ {'name': '11', 'char': '\' " : ;'},
+ {'name': '12', 'char': '. , ? !'},
+ ]
+
+_TWELVEKEYS_ALPHABET_SUPPORT_KEY_DEFINITIONS = [
+ # 01, 11 and 12 have spaces among their characters.
+ # Without them shown characters are too close.
+ {'name': '01', 'chars': ('@ - _ /', '', '', '', '1')},
+ {'name': '02', 'chars': ('ABC', '', '', '', '2')},
+ {'name': '03', 'chars': ('DEF', '', '', '', '3')},
+ {'name': '04', 'chars': ('GHI', '', '', '', '4')},
+ {'name': '05', 'chars': ('JKL', '', '', '', '5')},
+ {'name': '06', 'chars': ('MNO', '', '', '', '6')},
+ {'name': '07', 'chars': ('PQRS', '', '', '', '7')},
+ {'name': '08', 'chars': ('TUV', '', '', '', '8')},
+ {'name': '09', 'chars': ('WXYZ', '', '', '', '9')},
+ # 10: "a-A" key. Will be modified directly.
+ {'name': '11', 'chars': ('\' " : ;', '', '', '', '0')},
+ {'name': '12', 'chars': ('. , ? !', '', '', '', '')},
+ ]
+
+_TWELVEKEYS_ALPHABET_SUPPORT_POPUP_KEY_DEFINITIONS = [
+ {'name': '01', 'chars': ('@', '-', '_', '/', '1')},
+ {'name': '02', 'chars': ('A', 'B', 'C', '', '2')},
+ {'name': '03', 'chars': ('D', 'E', 'F', '', '3')},
+ {'name': '04', 'chars': ('G', 'H', 'I', '', '4')},
+ {'name': '05', 'chars': ('J', 'K', 'L', '', '5')},
+ {'name': '06', 'chars': ('M', 'N', 'O', '', '6')},
+ {'name': '07', 'chars': ('P', 'Q', 'R', 'S', '7')},
+ {'name': '08', 'chars': ('T', 'U', 'V', '', '8')},
+ {'name': '09', 'chars': ('W', 'X', 'Y', 'Z', '9')},
+ # 10: "a-A" key: twelvekeys__alphabet__10.svg will be used.
+ # Please check mozc/android/resources/res/xml/
+ {'name': '11', 'chars': (''', '"', ':', ';', '0')},
+ {'name': '12', 'chars': ('.', ',', '?', '!', '')},
+ ]
+
+_TWELVEKEYS_KANA_KEYICON_KEY_DEFINITIONS = [
+ {'name': 'exclamation_mark', 'char': '!'},
+ {'name': 'ideographic_period', 'char': '。'},
+ {'name': 'left_parenthesis', 'char': '('},
+ {'name': 'prolonged_sound_mark', 'char': 'ー'},
+ {'name': 'question_mark', 'char': '?'},
+ {'name': 'right_parenthesis', 'char': ')'},
+ {'name': 'horizontal_ellipsis', 'char': '…'},
+ {'name': 'wave_dash', 'char': '〜'},
+
+ {'name': 'a', 'char': 'あ'},
+ {'name': 'i', 'char': 'い'},
+ {'name': 'u', 'char': 'う'},
+ {'name': 'e', 'char': 'え'},
+ {'name': 'o', 'char': 'お'},
+ {'name': 'an', 'char': 'あん'},
+ {'name': 'in', 'char': 'いん'},
+ {'name': 'un', 'char': 'うん'},
+ {'name': 'en', 'char': 'えん'},
+ {'name': 'on', 'char': 'おん'},
+ {'name': 'axtu', 'char': 'あっ'},
+ {'name': 'ixtu', 'char': 'いっ'},
+ {'name': 'uxtu', 'char': 'うっ'},
+ {'name': 'extu', 'char': 'えっ'},
+ {'name': 'oxtu', 'char': 'おっ'},
+ {'name': 'xi', 'char': 'ぃ'},
+ {'name': 'xe', 'char': 'ぇ'},
+
+ {'name': 'ka', 'char': 'か'},
+ {'name': 'ki', 'char': 'き'},
+ {'name': 'ku', 'char': 'く'},
+ {'name': 'ke', 'char': 'け'},
+ {'name': 'ko', 'char': 'こ'},
+
+ {'name': 'sa', 'char': 'さ'},
+ {'name': 'shi', 'char': 'し'},
+ {'name': 'su', 'char': 'す'},
+ {'name': 'se', 'char': 'せ'},
+ {'name': 'so', 'char': 'そ'},
+
+ {'name': 'ta', 'char': 'た'},
+ {'name': 'chi', 'char': 'ち'},
+ {'name': 'tsu', 'char': 'つ'},
+ {'name': 'te', 'char': 'て'},
+ {'name': 'to', 'char': 'と'},
+
+ {'name': 'na', 'char': 'な'},
+ {'name': 'ni', 'char': 'に'},
+ {'name': 'nu', 'char': 'ぬ'},
+ {'name': 'ne', 'char': 'ね'},
+ {'name': 'no', 'char': 'の'},
+
+ {'name': 'ha', 'char': 'は'},
+ {'name': 'hi', 'char': 'ひ'},
+ {'name': 'fu', 'char': 'ふ'},
+ {'name': 'he', 'char': 'へ'},
+ {'name': 'ho', 'char': 'ほ'},
+
+ {'name': 'ma', 'char': 'ま'},
+ {'name': 'mi', 'char': 'み'},
+ {'name': 'mu', 'char': 'む'},
+ {'name': 'me', 'char': 'め'},
+ {'name': 'mo', 'char': 'も'},
+
+ {'name': 'ya', 'char': 'や'},
+ {'name': 'yu', 'char': 'ゆ'},
+ {'name': 'yo', 'char': 'よ'},
+ {'name': 'xya', 'char': 'ゃ'},
+ {'name': 'xyu', 'char': 'ゅ'},
+ {'name': 'xyo', 'char': 'ょ'},
+
+ {'name': 'ra', 'char': 'ら'},
+ {'name': 'ri', 'char': 'り'},
+ {'name': 'ru', 'char': 'る'},
+ {'name': 're', 'char': 'れ'},
+ {'name': 'ro', 'char': 'ろ'},
+
+ {'name': 'wa', 'char': 'わ'},
+ {'name': 'wo', 'char': 'を'},
+ {'name': 'nn', 'char': 'ん'},
+ ]
+
+_TWELVEKEYS_KANA_SUPPORT_KEY_DEFINITIONS = [
+ {'name': '01',
+ 'chars': ('あ', 'い', 'う', 'え', 'お')},
+ {'name': '02',
+ 'chars': ('か', 'き', 'く', 'け', 'こ')},
+ {'name': '03',
+ 'chars': ('さ', 'し', 'す', 'せ', 'そ')},
+ {'name': '04',
+ 'chars': ('た', 'ち', 'つ', 'て', 'と')},
+ {'name': '05',
+ 'chars': ('な', 'に', 'ぬ', 'ね', 'の')},
+ {'name': '06',
+ 'chars': ('は', 'ひ', 'ふ', 'へ', 'ほ')},
+ {'name': '07',
+ 'chars': ('ま', 'み', 'む', 'め', 'も')},
+ {'name': '08',
+ 'chars': ('や', '(', 'ゆ', ')', 'よ')},
+ {'name': '09',
+ 'chars': ('ら', 'り', 'る', 'れ', 'ろ')},
+ # 10: "大小" key(twelvekeys__kana__10.svg): Will be modified directly
+ {'name': '11',
+ 'chars': ('わ', 'を', 'ん', 'ー', '〜')},
+ # 12: Needs another template. Defined bellow.
+ ]
+
+_TWELVEKEYS_KANA_SUPPORT_12_KEY_DEFINITION = [
+ {'name': '12',
+ 'chars': ('、', '。', '?', '!', '…')}
+ ]
+
+_TWELVEKEYS_KANA_SUPPORT_POPUP_KEY_DEFINITIONS = [
+ {'name': '01', 'chars': ('あ', 'い', 'う', 'え', 'お')},
+ {'name': '02', 'chars': ('か', 'き', 'く', 'け', 'こ')},
+ {'name': '03', 'chars': ('さ', 'し', 'す', 'せ', 'そ')},
+ {'name': '04', 'chars': ('た', 'ち', 'つ', 'て', 'と')},
+ {'name': '05', 'chars': ('な', 'に', 'ぬ', 'ね', 'の')},
+ {'name': '06', 'chars': ('は', 'ひ', 'ふ', 'へ', 'ほ')},
+ {'name': '07', 'chars': ('ま', 'み', 'む', 'め', 'も')},
+ {'name': '08', 'chars': ('や', '(', 'ゆ', ')', 'よ')},
+ {'name': '09', 'chars': ('ら', 'り', 'る', 'れ', 'ろ')},
+ # 10: "大小" key: twelvekeys__kana__10.svg will be used.
+ # Please check mozc/android/resources/res/xml/
+ {'name': '11', 'chars': ('わ', 'を', 'ん', 'ー', '〜')},
+ {'name': '12', 'chars': ('、', '。', '?', '!', '…')},
+ ]
+
+_TWELVEKEYS_NUMBER_KEY_DEFINITIONS = [
+ {'name': 'zero', 'char': '0'},
+ {'name': 'one', 'char': '1'},
+ {'name': 'two', 'char': '2'},
+ {'name': 'three', 'char': '3'},
+ {'name': 'four', 'char': '4'},
+ {'name': 'five', 'char': '5'},
+ {'name': 'six', 'char': '6'},
+ {'name': 'seven', 'char': '7'},
+ {'name': 'eight', 'char': '8'},
+ {'name': 'nine', 'char': '9'},
+ {'name': 'asterisk', 'char': '*'},
+ {'name': 'number_sign', 'char': '#'},
+ ]
+
+_TWELVEKEYS_NUMBER_FUNCTION_KEY_DEFINITIONS = [
+ {'name': 'comma', 'char': ','},
+ {'name': 'equals_sign', 'char': '='},
+ {'name': 'full_stop', 'char': '.'},
+ {'name': 'hyphen_minus', 'char': '-'},
+ {'name': 'plus_sign', 'char': '+'},
+ {'name': 'solidus', 'char': '/'},
+ ]
+
+_TWELVEKEYS_OTHER_POPUP_DEFINITIONS = [
+ # number keyboard
+ {'name': 'low_line', 'char': '_'},
+ {'name': 'quotation_mark', 'char': '"'},
+ {'name': 'colon', 'char': ':'},
+ {'name': 'semicolon', 'char': ';'},
+ # 12keys and godan keyboard
+ {'name': 'ideographic_comma', 'char': '、'},
+ {'name': 'ideographic_full_stop', 'char': '。'},
+ # godan keyboard
+ {'name': 'fullwidth_solidus', 'char': '/'},
+ {'name': 'fullwidth_colon', 'char': ':'},
+ {'name': 'katakana_middle_dot', 'char': '・'},
+ {'name': 'left_corner_bracket', 'char': '「'},
+ {'name': 'right_corner_bracket', 'char': '」'},
+ ]
+
+def GenerateQwertyAlphabetKeyDefinitions():
+ """Returns key definitions for qwerty alphabet keys."""
+ key_definitions = []
+ for i in range(ord('z') - ord('a') + 1):
+ small = chr(i + ord('a'))
+ capital = chr(i + ord('A'))
+ support = _QWERTY_SUPPORT_KEY_MAPPING.get(small, '')
+ key_definitions.append({
+ 'name': 'latin_capital_letter_' + small,
+ 'char': capital,
+ 'support': support})
+ key_definitions.append({
+ 'name': 'latin_small_letter_' + small,
+ 'char': small,
+ 'support': support})
+ return key_definitions
+
+
+def GenerateTwelvekeysAlphabetKeyDefinitions():
+ """Returns key definitions for qwerty alphabet keys."""
+ key_definitions = []
+ for i in range(ord('z') - ord('a') + 1):
+ small = chr(i + ord('a'))
+ capital = chr(i + ord('A'))
+ key_definitions.append({
+ 'name': 'latin_' + small,
+ 'char': capital})
+ return key_definitions
+
+
+def ExpandAndWriteSupportKeys(template_file, output_file_basename, output_dir,
+ key_definition_list):
+ """Generates and writes keyicons for support keys from template.
+
+ We will expand keyicons for each flick directions.
+ For example, we will generate XX_center, XX_left, XX_up, XX_right, XX_down
+ adding to XX_release (default, no highlight).
+ Expanded keyicons have highlighted key character corresponding to the flick
+ direction.
+
+ Args:
+ template_file: Path for template file.
+ output_file_basename: A string indicating the base name of the output.
+ output_dir: Destination directory path.
+ key_definition_list: Key definition list.
+ """
+ for key_definition in key_definition_list:
+ assert len(key_definition['chars']) == len(_REPLACE_CHARS)
+
+ with open(template_file) as template_f:
+ template = template_f.read()
+
+ for i, pattern in enumerate(_REPLACE_CHARS):
+ template = template.replace(pattern, key_definition['chars'][i])
+
+ for highlight_index, name_suffix in enumerate(_EXPAND_SUPPORT_SUFFIXES):
+ if (highlight_index < len(key_definition['chars']) and
+ not key_definition['chars'][highlight_index]):
+ # We don't need highlighted key for non-existent support.
+ continue
+
+ keytop = template
+ for i, id_pattern in enumerate(_REPLACE_ID_SUFFIXEX):
+ default_id_suffix = ('' if 'id_suffixes' not in key_definition
+ else key_definition['id_suffixes'][i])
+ id_suffix = default_id_suffix if i != highlight_index else '-highlight'
+ keytop = keytop.replace(id_pattern, id_suffix)
+
+ file_name = '%s__%s_%s.svg' % (output_file_basename,
+ key_definition['name'],
+ name_suffix)
+ with open(os.path.join(output_dir, file_name), 'w') as write_f:
+ write_f.write(keytop)
+
+
+def WriteSupportPopupKeys(
+ template_file, output_file_basename, output_dir, key_definition_list):
+ """Generates and writes keyicons for support popup from template.
+
+ Support popup keys may have 5 key characters to be replaced.
+
+ Args:
+ template_file: Path for template file.
+ output_file_basename: A string indicating the base name of the output.
+ output_dir: Destination directory path.
+ key_definition_list: Key definition list.
+ """
+ for key_definition in key_definition_list:
+ assert len(key_definition['chars']) == len(_REPLACE_CHARS)
+
+ with open(template_file) as template_f:
+ keytop = template_f.read()
+ for i, pattern in enumerate(_REPLACE_CHARS):
+ keytop = keytop.replace(pattern, key_definition['chars'][i])
+
+ file_name = '%s__%s.svg' % (output_file_basename,
+ key_definition['name'])
+ with open(os.path.join(output_dir, file_name), 'w') as write_f:
+ write_f.write(keytop)
+
+
+def WriteKeys(
+ template_file, output_file_basename, output_dir, key_definition_list):
+ """Generates and writes keyicons.
+
+ Keys have 1 key character to be replaced.
+
+ Args:
+ template_file: Path for template file.
+ output_file_basename: A string indicating the base name of the output.
+ output_dir: Destination directory path.
+ key_definition_list: Key definition list.
+ """
+ for key_definition in key_definition_list:
+ assert key_definition['char']
+
+ with open(template_file) as template_f:
+ keytop = template_f.read()
+ keytop = keytop.replace(_REPLACE_CHAR, key_definition['char'])
+ keytop = keytop.replace(_REPLACE_CHAR_QWERTY_SUPPORT,
+ key_definition.get('support', ''))
+
+ file_name = '%s__%s.svg' % (output_file_basename,
+ key_definition['name'])
+ with open(os.path.join(output_dir, file_name), 'w') as write_f:
+ write_f.write(keytop)
+
+
+def Transform(output_dir):
+ """Transforms template .svg files into output_dir."""
+ ExpandAndWriteSupportKeys(
+ os.path.join(ABS_SCRIPT_DIR, 'godan__kana__support__template.svg'),
+ 'godan__kana__support',
+ output_dir,
+ _GODAN_KANA_SUPPORT_KEY_DEFINITIONS)
+
+ ExpandAndWriteSupportKeys(
+ os.path.join(ABS_SCRIPT_DIR, 'godan__kana__support__12__template.svg'),
+ 'godan__kana__support',
+ output_dir,
+ _GODAN_KANA_SUPPORT_12_KEY_DEFINITION)
+
+ WriteSupportPopupKeys(
+ os.path.join(ABS_SCRIPT_DIR, 'support__popup__template.svg'),
+ 'godan__kana__support__popup',
+ output_dir,
+ _GODAN_KANA_SUPPORT_POPUP_KEY_DEFINITIONS)
+
+ qwerty_definitions = (
+ _QWERTY_KEYICON_KEY_DEFINITIONS + GenerateQwertyAlphabetKeyDefinitions())
+
+ WriteKeys(
+ os.path.join(ABS_SCRIPT_DIR, 'qwerty__keyicon__template.svg'),
+ 'qwerty__keyicon',
+ output_dir,
+ qwerty_definitions)
+
+ WriteKeys(
+ os.path.join(ABS_SCRIPT_DIR, 'qwerty__popup__template.svg'),
+ 'qwerty__popup',
+ output_dir,
+ [x for x in qwerty_definitions if x.get('support', '')])
+
+ WriteKeys(
+ os.path.join(ABS_SCRIPT_DIR, 'twelvekeys__popup__template.svg'),
+ 'twelvekeys__popup',
+ output_dir,
+ GenerateTwelvekeysAlphabetKeyDefinitions())
+
+ WriteKeys(
+ os.path.join(ABS_SCRIPT_DIR, 'twelvekeys__alphabet__template.svg'),
+ 'twelvekeys__alphabet',
+ output_dir,
+ _TWELVEKEYS_ALPHABET_KEY_DEFINITIONS)
+
+ WriteKeys(
+ os.path.join(ABS_SCRIPT_DIR, 'twelvekeys__alphabet__popup__template.svg'),
+ 'twelvekeys__alphabet__popup',
+ output_dir,
+ _TWELVEKEYS_ALPHABET_KEY_DEFINITIONS)
+
+ ExpandAndWriteSupportKeys(
+ os.path.join(ABS_SCRIPT_DIR,
+ 'twelvekeys__alphabet__support__template.svg'),
+ 'twelvekeys__alphabet__support',
+ output_dir,
+ _TWELVEKEYS_ALPHABET_SUPPORT_KEY_DEFINITIONS)
+
+ WriteSupportPopupKeys(
+ os.path.join(ABS_SCRIPT_DIR, 'support__popup__template.svg'),
+ 'twelvekeys__alphabet__support__popup',
+ output_dir,
+ _TWELVEKEYS_ALPHABET_SUPPORT_POPUP_KEY_DEFINITIONS)
+
+ WriteKeys(
+ os.path.join(ABS_SCRIPT_DIR, 'twelvekeys__kana__keyicon__template.svg'),
+ 'twelvekeys__kana__keyicon',
+ output_dir,
+ _TWELVEKEYS_KANA_KEYICON_KEY_DEFINITIONS)
+
+ WriteKeys(
+ os.path.join(ABS_SCRIPT_DIR, 'twelvekeys__popup__template.svg'),
+ 'twelvekeys__popup',
+ output_dir,
+ _TWELVEKEYS_KANA_KEYICON_KEY_DEFINITIONS)
+
+ ExpandAndWriteSupportKeys(
+ os.path.join(ABS_SCRIPT_DIR, 'twelvekeys__kana__support__template.svg'),
+ 'twelvekeys__kana__support',
+ output_dir,
+ _TWELVEKEYS_KANA_SUPPORT_KEY_DEFINITIONS)
+
+ ExpandAndWriteSupportKeys(
+ os.path.join(ABS_SCRIPT_DIR,
+ 'twelvekeys__kana__support__12__template.svg'),
+ 'twelvekeys__kana__support',
+ output_dir,
+ _TWELVEKEYS_KANA_SUPPORT_12_KEY_DEFINITION)
+
+ WriteSupportPopupKeys(
+ os.path.join(ABS_SCRIPT_DIR, 'support__popup__template.svg'),
+ 'twelvekeys__kana__support__popup',
+ output_dir,
+ _TWELVEKEYS_KANA_SUPPORT_POPUP_KEY_DEFINITIONS)
+
+ WriteKeys(
+ os.path.join(ABS_SCRIPT_DIR, 'twelvekeys__number__template.svg'),
+ 'twelvekeys__number',
+ output_dir,
+ _TWELVEKEYS_NUMBER_KEY_DEFINITIONS)
+
+ WriteKeys(
+ os.path.join(ABS_SCRIPT_DIR, 'twelvekeys__popup__template.svg'),
+ 'twelvekeys__popup',
+ output_dir,
+ _TWELVEKEYS_NUMBER_KEY_DEFINITIONS)
+
+ WriteKeys(
+ os.path.join(ABS_SCRIPT_DIR,
+ 'twelvekeys__number__function__template.svg'),
+ 'twelvekeys__number__function',
+ output_dir,
+ _TWELVEKEYS_NUMBER_FUNCTION_KEY_DEFINITIONS)
+
+ WriteKeys(
+ os.path.join(ABS_SCRIPT_DIR,
+ 'twelvekeys__popup__template.svg'),
+ 'twelvekeys__popup',
+ output_dir,
+ _TWELVEKEYS_NUMBER_FUNCTION_KEY_DEFINITIONS)
+
+ WriteKeys(
+ os.path.join(ABS_SCRIPT_DIR, 'twelvekeys__popup__template.svg'),
+ 'twelvekeys__popup',
+ output_dir,
+ _TWELVEKEYS_OTHER_POPUP_DEFINITIONS)
+
+
+def ParseOptions():
+ parser = optparse.OptionParser()
+ parser.add_option('--output_dir', dest='output_dir',
+ help='Output directory for generated svg files.')
+ parser.add_option('--output_zip', dest='output_zip',
+ help='Output zip file for generated svg files.')
+ return parser.parse_args()[0]
+
+
+def main():
+ options = ParseOptions()
+ if not options.output_dir and not options.output_zip:
+ logging.fatal('You must specify --output_dir and/or --output_zip.')
+ return
+ if options.output_dir:
+ output_dir = options.output_dir
+ if not os.path.exists(output_dir):
+ os.makedirs(output_dir)
+ else:
+ output_dir = tempfile.mkdtemp()
+ Transform(output_dir)
+ if options.output_zip:
+ with zipfile.ZipFile(options.output_zip, 'w', zipfile.ZIP_DEFLATED) as z:
+ for f in os.listdir(output_dir):
+ if os.path.isdir(f):
+ raise IOError('Restriction: output_dir should not include directory')
+ z.write(os.path.join(output_dir, f), f)
+
+if __name__ == '__main__':
+ main()
diff --git a/src/data/images/android/template/twelvekeys__alphabet__popup__template.svg b/src/data/images/android/template/twelvekeys__alphabet__popup__template.svg
new file mode 100644
index 0000000..6f2b34e
--- /dev/null
+++ b/src/data/images/android/template/twelvekeys__alphabet__popup__template.svg
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<svg xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xml:space="preserve"
+ width="87px"
+ height="87px">
+ <!-- Popup icon is 20% bigger than key icon. -->
+ <text id="style-keyicon-main" x="43.5" y="43.5" style="font-size:31.2px;text-anchor:middle;dominant-baseline:central;fill:#272727;">中</text>
+</svg>
diff --git a/src/data/images/android/template/twelvekeys__alphabet__support__template.svg b/src/data/images/android/template/twelvekeys__alphabet__support__template.svg
new file mode 100644
index 0000000..477e133
--- /dev/null
+++ b/src/data/images/android/template/twelvekeys__alphabet__support__template.svg
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<svg version="1.1" id="release" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
+<g id="style-keyicon-main{id_suffix_center}">
+ <text x="52.5" y="43.5" style="font-size:26px;text-anchor:middle;dominant-baseline:central;fill:#272727;">中</text>
+</g>
+<g id="style-keyicon-guide{id_suffix_down}">
+ <text x="52.5" y="70.5" style="font-size:17px;text-anchor:middle;dominant-baseline:central;fill:#FF000000;">下</text>
+</g>
+</svg>
diff --git a/src/data/images/android/template/twelvekeys__alphabet__template.svg b/src/data/images/android/template/twelvekeys__alphabet__template.svg
new file mode 100644
index 0000000..6e2a1b0
--- /dev/null
+++ b/src/data/images/android/template/twelvekeys__alphabet__template.svg
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<svg version="1.1" id="release" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
+<g id="style-keyicon-main_1_">
+ <text x="52.5" y="43.5" style="font-size:26px;text-anchor:middle;dominant-baseline:central;fill:#272727;">中</text>
+</g>
+</svg>
diff --git a/src/data/images/android/template/twelvekeys__kana__keyicon__template.svg b/src/data/images/android/template/twelvekeys__kana__keyicon__template.svg
new file mode 100644
index 0000000..8502000
--- /dev/null
+++ b/src/data/images/android/template/twelvekeys__kana__keyicon__template.svg
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
+<g id="style-keyicon-main_1_">
+ <text x="56" y="56" style="font-size:53px;text-anchor:middle;dominant-baseline:central;fill:#272727;">中</text>
+</g>
+</svg>
diff --git a/src/data/images/android/template/twelvekeys__kana__support__12__template.svg b/src/data/images/android/template/twelvekeys__kana__support__12__template.svg
new file mode 100644
index 0000000..e38ef62
--- /dev/null
+++ b/src/data/images/android/template/twelvekeys__kana__support__12__template.svg
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<svg version="1.1"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ space="preserve"
+ width="105px"
+ height="87px">
+ <polyline id="style-keyicon-bound_1_" style="fill:none;stroke:#CCCBCB;stroke-miterlimit:10;" points="43.5,42 43.5,33.5 60.5,33.5 60.5,50.5 52,50.5 "/>
+ <text id="style-keyicon-main{id_suffix_center}_1_" x="52.5" y="43.5" style="font-size:24px;text-anchor:middle;dominant-baseline:central;fill:#FF000000;">中</text>
+ <polyline id="style-keyicon-bound_2_" style="fill:none;stroke:#CCCBCB;stroke-miterlimit:10;" points="13.5,42 13.5,33.5 30.5,33.5 30.5,50.5 22,50.5 "/>
+ <text id="style-keyicon-main{id_suffix_left}_2_" x="20" y="43.5" style="font-size:24px;text-anchor:middle;dominant-baseline:central;fill:#FF000000;">左</text>
+ <text id="style-keyicon-main{id_suffix_up}_3_" x="52.5" y="14.5" style="font-size:24px;text-anchor:middle;dominant-baseline:central;fill:#FF000000;">上</text>
+ <text id="style-keyicon-main{id_suffix_right}_4_" x="85" y="43.5" style="font-size:24px;text-anchor:middle;dominant-baseline:central;fill:#FF000000;">右</text>
+ <text id="style-keyicon-guide{id_suffix_down}_5_" x="52.5" y="72.5" style="font-size:18px;text-anchor:middle;dominant-baseline:central;fill:#FF000000;">下</text>
+</svg>
diff --git a/src/data/images/android/template/twelvekeys__kana__support__template.svg b/src/data/images/android/template/twelvekeys__kana__support__template.svg
new file mode 100644
index 0000000..8e0d313
--- /dev/null
+++ b/src/data/images/android/template/twelvekeys__kana__support__template.svg
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xml:space="preserve"
+ version="1.1"
+ width="105px"
+ height="87px">
+ <text id="style-keyicon-main{id_suffix_center}_1_" x="52.5" y="43.5" style="font-size:34px;text-anchor:middle;dominant-baseline:central;fill:#FF000000;">中</text>
+ <text id="style-keyicon-guide{id_suffix_left}_2_" x="22" y="43.5" style="font-size:17px;text-anchor:middle;dominant-baseline:central;fill:#FF000000;">左</text>
+ <text id="style-keyicon-guide{id_suffix_up}_3_" x="52.5" y="16.5" style="font-size:17px;text-anchor:middle;dominant-baseline:central;fill:#FF000000;">上</text>
+ <text id="style-keyicon-guide{id_suffix_right}_4_" x="83" y="43.5" style="font-size:17px;text-anchor:middle;dominant-baseline:central;fill:#FF000000;">右</text>
+ <text id="style-keyicon-guide{id_suffix_down}_5_" x="52.5" y="70.5" style="font-size:17px;text-anchor:middle;dominant-baseline:central;fill:#FF000000;">下</text>
+</svg>
diff --git a/src/data/images/android/template/twelvekeys__number__function__template.svg b/src/data/images/android/template/twelvekeys__number__function__template.svg
new file mode 100644
index 0000000..782b4ae
--- /dev/null
+++ b/src/data/images/android/template/twelvekeys__number__function__template.svg
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<svg version="1.1" id="release" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
+<g id="style-keyicon-twelvekeys-function">
+ <text x="52.5" y="43.5" style="font-size:46px;text-anchor:middle;dominant-baseline:central;fill:#FF000000;">中</text>
+</g>
+</svg>
diff --git a/src/data/images/android/template/twelvekeys__number__template.svg b/src/data/images/android/template/twelvekeys__number__template.svg
new file mode 100644
index 0000000..ee9fd25
--- /dev/null
+++ b/src/data/images/android/template/twelvekeys__number__template.svg
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<svg version="1.1" id="release" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="105px" height="87px" viewBox="0 0 105 87" style="enable-background:new 0 0 105 87;" xml:space="preserve">
+<g id="style-keyicon-main_1_">
+ <text x="52.5" y="43.5" style="font-size:54px;text-anchor:middle;dominant-baseline:central;fill:#272727;">中</text>
+</g>
+</svg>
diff --git a/src/data/images/android/template/twelvekeys__popup__template.svg b/src/data/images/android/template/twelvekeys__popup__template.svg
new file mode 100644
index 0000000..af6b530
--- /dev/null
+++ b/src/data/images/android/template/twelvekeys__popup__template.svg
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright 2010-2014, Google Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="112px" height="112px" viewBox="0 0 112 112" style="enable-background:new 0 0 112 112;" xml:space="preserve">
+<g id="style-keyicon-main_1_">
+ <!-- Popup icon is 20% bigger than key icon. -->
+ <text x="56" y="56" style="font-size:63.6px;text-anchor:middle;dominant-baseline:central;fill:#272727;">中</text>
+</g>
+</svg>
diff --git a/src/data/preedit/12keys-halfwidthascii.tsv b/src/data/preedit/12keys-halfwidthascii.tsv
index 1d679de..37d8f14 100644
--- a/src/data/preedit/12keys-halfwidthascii.tsv
+++ b/src/data/preedit/12keys-halfwidthascii.tsv
@@ -2,15 +2,13 @@
@1 -
-1 _
_1 /
-/1 &
-&1 {*}1
+/1 {*}1
{*}11 @
@{<} {*}1
-{<} @
_{<} -
/{<} _
-&{<} /
-{*}1{<} &
+{*}1{<} /
2 a NewChunk NoTransliteration
a2 b
b2 c
diff --git a/src/data/preedit/12keys-number.tsv b/src/data/preedit/12keys-number.tsv
deleted file mode 100644
index 0abfbc6..0000000
--- a/src/data/preedit/12keys-number.tsv
+++ /dev/null
@@ -1,19 +0,0 @@
-* {1}/ NewChunk NoTransliteration
-{1}/* {1}~
-{1}~* {1}.
-{1}.* {1}*
-{1}** {1}/
-{1}/{<} {1}*
-{1}~{<} {1}/
-{1}.{<} {1}~
-{1}*{<} {1}.
-# {2}+ NewChunk NoTransliteration
-{2}+# {2}-
-{2}-# {2}=
-{2}=# {2}#
-{2}## {2}+
-{2}+{<} {2}#
-{2}-{<} {2}+
-{2}={<} {2}-
-{2}#{<} {2}=
-{<}
diff --git a/src/data/preedit/flick-halfwidthascii.tsv b/src/data/preedit/flick-halfwidthascii.tsv
index e382786..1c224fe 100644
--- a/src/data/preedit/flick-halfwidthascii.tsv
+++ b/src/data/preedit/flick-halfwidthascii.tsv
@@ -2,10 +2,11 @@
- - NoTransliteration
_ _ NoTransliteration
/ / NoTransliteration
-& & NoTransliteration
+@ 1 NoTransliteration
2 {*}a NoTransliteration
b {*}b NoTransliteration
c {*}c NoTransliteration
+| 2 NoTransliteration
{*}a* {*}A
{*}b* {*}B
{*}c* {*}C
@@ -15,6 +16,7 @@
3 {*}d NoTransliteration
e {*}e NoTransliteration
f {*}f NoTransliteration
+~ 3 NoTransliteration
{*}d* {*}D
{*}e* {*}E
{*}f* {*}F
@@ -24,6 +26,7 @@
4 {*}g NoTransliteration
h {*}h NoTransliteration
i {*}i NoTransliteration
+$ 4 NoTransliteration
{*}g* {*}G
{*}h* {*}H
{*}i* {*}I
@@ -33,6 +36,7 @@
5 {*}j NoTransliteration
k {*}k NoTransliteration
l {*}l NoTransliteration
+% 5 NoTransliteration
{*}j* {*}J
{*}k* {*}K
{*}l* {*}L
@@ -42,6 +46,7 @@
6 {*}m NoTransliteration
n {*}n NoTransliteration
o {*}o NoTransliteration
+& 6 NoTransliteration
{*}m* {*}M
{*}n* {*}N
{*}o* {*}O
@@ -52,6 +57,7 @@
q {*}q NoTransliteration
r {*}r NoTransliteration
s {*}s NoTransliteration
+< 7 NoTransliteration
{*}p* {*}P
{*}q* {*}Q
{*}r* {*}R
@@ -63,6 +69,7 @@
8 {*}t NoTransliteration
u {*}u NoTransliteration
v {*}v NoTransliteration
+^ 8 NoTransliteration
{*}t* {*}T
{*}u* {*}U
{*}v* {*}V
@@ -73,6 +80,7 @@
x {*}x NoTransliteration
y {*}y NoTransliteration
z {*}z NoTransliteration
+> 9 NoTransliteration
{*}w* {*}W
{*}x* {*}X
{*}y* {*}Y
@@ -86,6 +94,7 @@
" " NoTransliteration
: : NoTransliteration
; ; NoTransliteration
+# 0 NoTransliteration
. . NoTransliteration
, , NoTransliteration
? ? NoTransliteration
diff --git a/src/data/preedit/flick-number.tsv b/src/data/preedit/flick-number.tsv
deleted file mode 100644
index 3dbc760..0000000
--- a/src/data/preedit/flick-number.tsv
+++ /dev/null
@@ -1,9 +0,0 @@
-/ / NoTransliteration
-~ ~ NoTransliteration
-. . NoTransliteration
-* * NoTransliteration
-+ + NoTransliteration
-- - NoTransliteration
-= = NoTransliteration
-# # NoTransliteration
-{<}
diff --git a/src/data/preedit/notouch-hiragana.tsv b/src/data/preedit/notouch-hiragana.tsv
new file mode 100644
index 0000000..a2b3ea1
--- /dev/null
+++ b/src/data/preedit/notouch-hiragana.tsv
@@ -0,0 +1,128 @@
+# Roman table for notouch.
+#
+# NOTE:
+# This rule is basically same as flick-hiragana.
+# However, we don't want to have raw number transliterated candidates, like
+# "12" from "あか"
+# Number only raw input will produce transliterated candidates
+# via transliteration_rewriter. For example if we have (1, あ) and (2, か),
+# input "あか" will make candidates "12" in addition to "あか", "赤", etc.
+# For suppressing such candidates, we use A-J instead of 0-9 as keycode.
+# This is the only difference between flick-hiragana and notouch-hiragana.
+! あ NoTransliteration
+あ* ぁ
+ぁ* あ
+_ い NoTransliteration
+い* ぃ
+ぃ* い
+; う NoTransliteration
+う* ぅ
+ぅ* ゔ
+ゔ* う
+: え NoTransliteration
+え* ぇ
+ぇ* え
+@ お NoTransliteration
+お* ぉ
+ぉ* お
+" か NoTransliteration
+か* が
+が* か
+a き NoTransliteration
+き* ぎ
+ぎ* き
+b く NoTransliteration
+く* ぐ
+ぐ* く
+c け NoTransliteration
+け* げ
+げ* け
+| こ NoTransliteration
+こ* ご
+ご* こ
+# さ NoTransliteration
+さ* ざ
+ざ* さ
+d し NoTransliteration
+し* じ
+じ* し
+e す NoTransliteration
+す* ず
+ず* す
+f せ NoTransliteration
+せ* ぜ
+ぜ* せ
+~ そ NoTransliteration
+そ* ぞ
+ぞ* そ
+' た NoTransliteration
+た* だ
+だ* た
+g ち NoTransliteration
+ち* ぢ
+ぢ* ち
+h つ NoTransliteration
+つ* っ
+っ* づ
+づ* つ
+i て NoTransliteration
+て* で
+で* て
+$ と NoTransliteration
+と* ど
+ど* と
+[ な NoTransliteration
+j に NoTransliteration
+k ぬ NoTransliteration
+l ね NoTransliteration
+% の NoTransliteration
+] は NoTransliteration
+は* ば
+ば* ぱ
+ぱ* は
+m ひ NoTransliteration
+ひ* び
+び* ぴ
+ぴ* ひ
+n ふ NoTransliteration
+ふ* ぶ
+ぶ* ぷ
+ぷ* ふ
+o へ NoTransliteration
+へ* べ
+べ* ぺ
+ぺ* へ
+& ほ NoTransliteration
+ほ* ぼ
+ぼ* ぽ
+ぽ* ほ
+< ま NoTransliteration
+p み NoTransliteration
+q む NoTransliteration
+r め NoTransliteration
+s も NoTransliteration
+= や NoTransliteration
+や* ゃ
+ゃ* や
+u ゆ NoTransliteration
+ゆ* ゅ
+ゅ* ゆ
+^ よ NoTransliteration
+よ* ょ
+ょ* よ
+t 「 NoTransliteration
+v 」 NoTransliteration
+> ら NoTransliteration
+w り NoTransliteration
+x る NoTransliteration
+y れ NoTransliteration
+z ろ NoTransliteration
+* NoTransliteration
+( ( NoTransliteration
+) ) NoTransliteration
+? わ NoTransliteration
+わ* ゎ
+ゎ* わ
++ を NoTransliteration
+/ ん NoTransliteration
+- ー NoTransliteration
diff --git a/src/data/preedit/qwerty_mobile-hiragana-number.tsv b/src/data/preedit/qwerty_mobile-hiragana-number.tsv
deleted file mode 100644
index 884a9c9..0000000
--- a/src/data/preedit/qwerty_mobile-hiragana-number.tsv
+++ /dev/null
@@ -1,39 +0,0 @@
-/ /
-[ 「
-] 」
-' 時
-" 分
-$ 月
-| 日
-~ 〜
-, ,
-. .
-Q ★ NoTransliteration
-W ♥ NoTransliteration
-E ♪ NoTransliteration
-% ※ NoTransliteration
-T 〒 NoTransliteration
-* × NoTransliteration
-I ÷ NoTransliteration
-A ・ NoTransliteration
-S ‥ NoTransliteration
-D … NoTransliteration
-< 【 NoTransliteration
-> 】 NoTransliteration
-Z (月) NoTransliteration
-X (火) NoTransliteration
-C (水) NoTransliteration
-V (木) NoTransliteration
-B (金) NoTransliteration
-N (土) NoTransliteration
-M (日) NoTransliteration
-z/ ・
-z, ‥
-z. …
-zh ←
-zj ↓
-zk ↑
-zl →
-z- 〜
-z[ 『
-z] 』
diff --git a/src/data/preedit/toggle_flick-halfwidthascii.tsv b/src/data/preedit/toggle_flick-halfwidthascii.tsv
index ea62311..b7433c9 100644
--- a/src/data/preedit/toggle_flick-halfwidthascii.tsv
+++ b/src/data/preedit/toggle_flick-halfwidthascii.tsv
@@ -2,22 +2,21 @@
- {*}- NoTransliteration
_ {*}_ NoTransliteration
/ {*}/ NoTransliteration
-& {*}& NoTransliteration
+@ 1 NoTransliteration
{?}@1 {?}-
{?}-1 {?}_
{?}_1 {?}/
-{?}/1 {?}&
-{?}&1 {?}1
+{?}/1 {?}1
{?}11 {?}@
{?}@{<} {?}1
{?}-{<} {?}@
{?}_{<} {?}-
{?}/{<} {?}_
-{?}&{<} {?}/
-{?}1{<} {?}&
+{?}1{<} {?}/
2 {?}a NewChunk NoTransliteration
b {*}b NoTransliteration
c {*}c NoTransliteration
+| 2 NoTransliteration
{?}a2 {?}b
{?}b2 {?}c
{?}c2 {?}A
@@ -47,6 +46,7 @@
3 {?}d NewChunk NoTransliteration
e {*}e NoTransliteration
f {*}f NoTransliteration
+~ 3 NoTransliteration
{?}d3 {?}e
{?}e3 {?}f
{?}f3 {?}D
@@ -76,6 +76,7 @@
4 {?}g NewChunk NoTransliteration
h {*}h NoTransliteration
i {*}i NoTransliteration
+$ 4 NoTransliteration
{?}g4 {?}h
{?}h4 {?}i
{?}i4 {?}G
@@ -105,6 +106,7 @@
5 {?}j NewChunk NoTransliteration
k {*}k NoTransliteration
l {*}l NoTransliteration
+% 5 NoTransliteration
{?}j5 {?}k
{?}k5 {?}l
{?}l5 {?}J
@@ -134,6 +136,7 @@
6 {?}m NewChunk NoTransliteration
n {*}n NoTransliteration
o {*}o NoTransliteration
+& 6 NoTransliteration
{?}m6 {?}n
{?}n6 {?}o
{?}o6 {?}M
@@ -164,6 +167,7 @@
q {*}q NoTransliteration
r {*}r NoTransliteration
s {*}s NoTransliteration
+< 7 NoTransliteration
{?}p7 {?}q
{?}q7 {?}r
{?}r7 {?}s
@@ -201,6 +205,7 @@
8 {?}t NewChunk NoTransliteration
u {*}u NoTransliteration
v {*}v NoTransliteration
+^ 8 NoTransliteration
{?}t8 {?}u
{?}u8 {?}v
{?}v8 {?}T
@@ -231,6 +236,7 @@
x {*}x NoTransliteration
y {*}y NoTransliteration
z {*}z NoTransliteration
+> 9 NoTransliteration
{?}w9 {?}x
{?}x9 {?}y
{?}y9 {?}z
@@ -270,6 +276,7 @@
" {*}" NoTransliteration
: {*}: NoTransliteration
; {*}; NoTransliteration
+# 0 NoTransliteration
{?}'0 {?}"
{?}"0 {?}:
{?}:0 {?};
diff --git a/src/data/preedit/toggle_flick-hiragana.tsv b/src/data/preedit/toggle_flick-hiragana.tsv
index d5532c0..c6c407f 100644
--- a/src/data/preedit/toggle_flick-hiragana.tsv
+++ b/src/data/preedit/toggle_flick-hiragana.tsv
@@ -348,12 +348,14 @@
{?}を0 {?}ん
{?}ん0 {?}ゎ
{?}ゎ0 {?}ー
-{?}ー0 {?}わ
-{?}わ{<} {?}ー
+{?}ー0 {?}〜
+{?}〜0 {?}わ
+{?}わ{<} {?}〜
{?}を{<} {?}わ
{?}ん{<} {?}を
{?}ゎ{<} {?}ん
{?}ー{<} {?}ゎ
+{?}〜{<} {?}ー
{?}わ* {*}ゎ
{?}ゎ* {*}わ
{*}わ* {*}ゎ
@@ -368,14 +370,16 @@
{#}、# {#}。
{#}。# {#}?
{#}?# {#}!
-{#}!# {#}・
+{#}!# {#}…
+{#}…# {#}・
{#}・# {#}
{#} # {#}、
{#}、{<} {#}
{#}。{<} {#}、
{#}?{<} {#}。
{#}!{<} {#}?
-{#}・{<} {#}!
+{#}…{<} {#}!
+{#}・{<} {#}…
{#} {<} {#}・
< 〜 NoTransliteration
> … NoTransliteration
diff --git a/src/data/preedit/toggle_flick-number.tsv b/src/data/preedit/toggle_flick-number.tsv
deleted file mode 100644
index f768f3e..0000000
--- a/src/data/preedit/toggle_flick-number.tsv
+++ /dev/null
@@ -1,25 +0,0 @@
-/ {?}/ NewChunk NoTransliteration
-~ {*}~ NoTransliteration
-. {*}. NoTransliteration
-* {*}* NoTransliteration
-{?}// {?}~
-{?}~/ {?}.
-{?}./ {?}*
-{?}*/ {?}/
-{?}/{<} {?}*
-{?}~{<} {?}/
-{?}.{<} {?}~
-{?}*{<} {?}.
-+ {?}+ NewChunk NoTransliteration
-- {*}- NoTransliteration
-= {*}= NoTransliteration
-# {*}# NoTransliteration
-{?}++ {?}-
-{?}-+ {?}=
-{?}=+ {?}#
-{?}#+ {?}+
-{?}+{<} {?}#
-{?}-{<} {?}+
-{?}={<} {?}-
-{?}#{<} {?}=
-{<}
diff --git a/src/data/test/session/scenario/b12751061_scenario.txt b/src/data/test/session/scenario/b12751061_scenario.txt
index 76a3ef8..ff35928 100644
--- a/src/data/test/session/scenario/b12751061_scenario.txt
+++ b/src/data/test/session/scenario/b12751061_scenario.txt
@@ -7,7 +7,7 @@
SET_MOBILE_REQUEST
RESET_CONTEXT
-UPDATE_MOBILE_KEYBOARD TWELVE_KEYS_TO_NUMBER SPACE_OR_CONVERT_KEEPING_COMPOSITION
+UPDATE_MOBILE_KEYBOARD QWERTY_MOBILE_TO_HALFWIDTHASCII SPACE_OR_CONVERT_KEEPING_COMPOSITION
SWITCH_INPUT_MODE HIRAGANA
SEND_KEYS 111
diff --git a/src/data/test/session/scenario/mobile_t13n_candidates.txt b/src/data/test/session/scenario/mobile_t13n_candidates.txt
index d24b545..fca4c32 100644
--- a/src/data/test/session/scenario/mobile_t13n_candidates.txt
+++ b/src/data/test/session/scenario/mobile_t13n_candidates.txt
@@ -42,21 +42,6 @@
EXPECT_IN_ALL_CANDIDATE_WORDS 222
-# TWELVE_KEYS_TO_NUMBER
-RESET_CONTEXT
-UPDATE_MOBILE_KEYBOARD TWELVE_KEYS_TO_NUMBER SPACE_OR_CONVERT_KEEPING_COMPOSITION
-SWITCH_INPUT_MODE HALF_ASCII
-
-SEND_KEYS 0222
-EXPECT_PREEDIT 0222
-
-EXPECT_IN_ALL_CANDIDATE_WORDS 0222
-EXPECT_IN_ALL_CANDIDATE_WORDS 〇二二二
-EXPECT_IN_ALL_CANDIDATE_WORDS 0222
-EXPECT_IN_ALL_CANDIDATE_WORDS 二百二十二
-EXPECT_IN_ALL_CANDIDATE_WORDS 弐百弐拾弐
-EXPECT_IN_ALL_CANDIDATE_WORDS 弐百廿弐
-
# FLICK_TO_HIRAGANA
RESET_CONTEXT
UPDATE_MOBILE_KEYBOARD FLICK_TO_HIRAGANA SPACE_OR_CONVERT_KEEPING_COMPOSITION
@@ -112,22 +97,6 @@
EXPECT_IN_ALL_CANDIDATE_WORDS 25
-# FLICK_TO_NUMBER
-RESET_CONTEXT
-UPDATE_MOBILE_KEYBOARD FLICK_TO_NUMBER SPACE_OR_CONVERT_KEEPING_COMPOSITION
-SWITCH_INPUT_MODE HALF_ASCII
-
-SEND_KEYS 0222
-EXPECT_PREEDIT 0222
-
-EXPECT_IN_ALL_CANDIDATE_WORDS 0222
-EXPECT_IN_ALL_CANDIDATE_WORDS 〇二二二
-EXPECT_IN_ALL_CANDIDATE_WORDS 0222
-EXPECT_IN_ALL_CANDIDATE_WORDS 二百二十二
-EXPECT_IN_ALL_CANDIDATE_WORDS 弐百弐拾弐
-EXPECT_IN_ALL_CANDIDATE_WORDS 弐百廿弐
-
-
# TOGGLE_FLICK_TO_HIRAGANA
RESET_CONTEXT
UPDATE_MOBILE_KEYBOARD TOGGLE_FLICK_TO_HIRAGANA SPACE_OR_CONVERT_KEEPING_COMPOSITION
@@ -199,22 +168,6 @@
EXPECT_IN_ALL_CANDIDATE_WORDS 25
-# TOGGLE_FLICK_TO_NUMBER
-RESET_CONTEXT
-UPDATE_MOBILE_KEYBOARD TOGGLE_FLICK_TO_NUMBER SPACE_OR_CONVERT_KEEPING_COMPOSITION
-SWITCH_INPUT_MODE HALF_ASCII
-
-SEND_KEYS 0222
-EXPECT_PREEDIT 0222
-
-EXPECT_IN_ALL_CANDIDATE_WORDS 0222
-EXPECT_IN_ALL_CANDIDATE_WORDS 〇二二二
-EXPECT_IN_ALL_CANDIDATE_WORDS 0222
-EXPECT_IN_ALL_CANDIDATE_WORDS 二百二十二
-EXPECT_IN_ALL_CANDIDATE_WORDS 弐百弐拾弐
-EXPECT_IN_ALL_CANDIDATE_WORDS 弐百廿弐
-
-
# QWERTY_MOBILE_TO_HIRAGANA
RESET_CONTEXT
UPDATE_MOBILE_KEYBOARD QWERTY_MOBILE_TO_HIRAGANA SPACE_OR_CONVERT_KEEPING_COMPOSITION
@@ -234,22 +187,6 @@
EXPECT_IN_ALL_CANDIDATE_WORDS Nekomamire
-# QWERTY_MOBILE_TO_HIRAGANA_NUMBER
-RESET_CONTEXT
-UPDATE_MOBILE_KEYBOARD QWERTY_MOBILE_TO_HIRAGANA_NUMBER SPACE_OR_CONVERT_KEEPING_COMPOSITION
-SWITCH_INPUT_MODE HALF_ASCII
-
-SEND_KEYS 0222
-EXPECT_PREEDIT 0222
-
-EXPECT_IN_ALL_CANDIDATE_WORDS 0222
-EXPECT_IN_ALL_CANDIDATE_WORDS 〇二二二
-EXPECT_IN_ALL_CANDIDATE_WORDS 0222
-EXPECT_IN_ALL_CANDIDATE_WORDS 二百二十二
-EXPECT_IN_ALL_CANDIDATE_WORDS 弐百弐拾弐
-EXPECT_IN_ALL_CANDIDATE_WORDS 弐百廿弐
-
-
# QWERTY_MOBILE_TO_HALFWIDTHASCII
RESET_CONTEXT
UPDATE_MOBILE_KEYBOARD QWERTY_MOBILE_TO_HALFWIDTHASCII SPACE_OR_CONVERT_KEEPING_COMPOSITION
@@ -301,18 +238,24 @@
EXPECT_IN_ALL_CANDIDATE_WORDS CD
-# GODAN_TO_NUMBER
+# NOTOUCH_KANA
RESET_CONTEXT
-UPDATE_MOBILE_KEYBOARD GODAN_TO_NUMBER SPACE_OR_CONVERT_KEEPING_COMPOSITION
-SWITCH_INPUT_MODE HALF_ASCII
+UPDATE_MOBILE_KEYBOARD NOTOUCH_TO_HIRAGANA SPACE_OR_CONVERT_KEEPING_COMPOSITION
+SWITCH_INPUT_MODE HIRAGANA
-SEND_KEYS 0222
-EXPECT_PREEDIT 0222
+SEND_KEYS l|<py
+EXPECT_PREEDIT ねこまみれ
+EXPECT_IN_ALL_CANDIDATE_WORDS ねこまみれ
+EXPECT_IN_ALL_CANDIDATE_WORDS ネコマミレ
+EXPECT_IN_ALL_CANDIDATE_WORDS ネコマミレ
+EXPECT_NOT_IN_ALL_CANDIDATE_WORDS l|<py
+EXPECT_NOT_IN_ALL_CANDIDATE_WORDS <
-EXPECT_IN_ALL_CANDIDATE_WORDS 0222
-EXPECT_IN_ALL_CANDIDATE_WORDS 〇二二二
-EXPECT_IN_ALL_CANDIDATE_WORDS 0222
-EXPECT_IN_ALL_CANDIDATE_WORDS 二百二十二
-EXPECT_IN_ALL_CANDIDATE_WORDS 弐百弐拾弐
-EXPECT_IN_ALL_CANDIDATE_WORDS 弐百廿弐
-
+RESET_CONTEXT
+SEND_KEYS !'<
+EXPECT_PREEDIT あたま
+EXPECT_NOT_IN_ALL_CANDIDATE_WORDS !'<
+EXPECT_NOT_IN_ALL_CANDIDATE_WORDS !’<
+SEND_KEY LEFT
+EXPECT_NOT_IN_ALL_CANDIDATE_WORDS !'
+EXPECT_NOT_IN_ALL_CANDIDATE_WORDS !’
diff --git a/src/data/test/session/scenario/twelvekeys_switch_inputmode_scenario.txt b/src/data/test/session/scenario/twelvekeys_switch_inputmode_scenario.txt
index 667fe33..498c9aa 100644
--- a/src/data/test/session/scenario/twelvekeys_switch_inputmode_scenario.txt
+++ b/src/data/test/session/scenario/twelvekeys_switch_inputmode_scenario.txt
@@ -7,32 +7,20 @@
# Following scenario is emulation of http://b/issue?id=5844621.
RESET_CONTEXT
-# Set to 12keys-number keyboard layout.
-SET_MOBILE_REQUEST
-UPDATE_MOBILE_KEYBOARD TOGGLE_FLICK_TO_NUMBER COMMIT
-SWITCH_INPUT_MODE HALF_ASCII
-
-# Type "3" and "0" consecutively.
-SEND_KEYS 30
-EXPECT_PREEDIT 30
-
# Switch to 12keys-hiragana keyboard layout.
UPDATE_MOBILE_KEYBOARD TOGGLE_FLICK_TO_HIRAGANA SPACE_OR_CONVERT_KEEPING_COMPOSITION
SWITCH_INPUT_MODE HIRAGANA
-# Send backspace.
-SEND_KEY BACKSPACE
-
# The flick SA-key to the left to input "SHI", which is translated to 'd' key
# in the Java client.
SEND_KEYS d
-EXPECT_PREEDIT 3し
+EXPECT_PREEDIT し
# Another scenario.
RESET_CONTEXT
-# Set to 12keys-number keyboard layout.
+# Set to number keyboard layout.
UPDATE_MOBILE_KEYBOARD TOGGLE_FLICK_TO_HALFWIDTHASCII COMMIT
SWITCH_INPUT_MODE HALF_ASCII
diff --git a/src/docker/ubuntu12.04/Dockerfile b/src/docker/ubuntu12.04/Dockerfile
index 1bba983..ed28f30 100644
--- a/src/docker/ubuntu12.04/Dockerfile
+++ b/src/docker/ubuntu12.04/Dockerfile
@@ -58,7 +58,7 @@
ENV ANDROID_NDK_HOME /home/mozc_builder/work/android-ndk-r10d
ENV ANDROID_HOME /home/mozc_builder/work/android-sdk-linux
ENV PATH $PATH:${ANDROID_HOME}/tools:${ANDROID_HOME}/platform-tools:${ANDROID_NDK_HOME}
-RUN echo y | android update sdk --all --force --no-ui --filter android-19
+RUN echo y | android update sdk --all --force --no-ui --filter android-21
RUN echo y | android update sdk --all --force --no-ui --filter build-tools-21.0.2
RUN echo y | android update sdk --all --force --no-ui --filter extra-android-support
RUN echo y | android update sdk --all --force --no-ui --filter platform-tool
diff --git a/src/docker/ubuntu14.04/Dockerfile b/src/docker/ubuntu14.04/Dockerfile
index 4c51d6c..4988147 100644
--- a/src/docker/ubuntu14.04/Dockerfile
+++ b/src/docker/ubuntu14.04/Dockerfile
@@ -59,7 +59,7 @@
ENV ANDROID_NDK_HOME /home/mozc_builder/work/android-ndk-r10d
ENV ANDROID_HOME /home/mozc_builder/work/android-sdk-linux
ENV PATH $PATH:${ANDROID_HOME}/tools:${ANDROID_HOME}/platform-tools:${ANDROID_NDK_HOME}
-RUN echo y | android update sdk --all --force --no-ui --filter android-19
+RUN echo y | android update sdk --all --force --no-ui --filter android-21
RUN echo y | android update sdk --all --force --no-ui --filter build-tools-21.0.2
RUN echo y | android update sdk --all --force --no-ui --filter extra-android-support
RUN echo y | android update sdk --all --force --no-ui --filter platform-tool
diff --git a/src/gyp/tests.gyp b/src/gyp/tests.gyp
index d832400..4ffedba 100644
--- a/src/gyp/tests.gyp
+++ b/src/gyp/tests.gyp
@@ -80,9 +80,12 @@
'../unix/ibus/ibus.gyp:ibus_all_test',
],
}],
+ # Java tests are defined in android/android.gyp:build_java_test.
+ # However asset files (e.g., system.dictionary) are required to run
+ # native tests.
['target_platform=="Android"', {
'dependencies': [
- '../android/android.gyp:build_java_test',
+ '../android/android.gyp:assets',
],
}],
],
diff --git a/src/mozc_version_template.txt b/src/mozc_version_template.txt
index f54f736..c4ebf59 100644
--- a/src/mozc_version_template.txt
+++ b/src/mozc_version_template.txt
@@ -1,6 +1,6 @@
MAJOR=2
MINOR=16
-BUILD=2003
+BUILD=2004
REVISION=102
# NACL_DICTIONARY_VERSION is the target version of the system dictionary to be
# downloaded by NaCl Mozc.
diff --git a/src/session/commands.proto b/src/session/commands.proto
index 373791e..d34ac42 100644
--- a/src/session/commands.proto
+++ b/src/session/commands.proto
@@ -586,33 +586,21 @@
// Use special table for 12keys (to half-width ascii).
TWELVE_KEYS_TO_HALFWIDTHASCII = 11;
- // Use special table for 12keys (to number).
- TWELVE_KEYS_TO_NUMBER = 12;
-
// Use special table for flick (to hiragana).
FLICK_TO_HIRAGANA = 13;
// Use special table for flick (to half-width ascii).
FLICK_TO_HALFWIDTHASCII = 14;
- // Use special table for flick (to number).
- FLICK_TO_NUMBER = 15;
-
// Use special table for both toggle and flick (to hiragana).
TOGGLE_FLICK_TO_HIRAGANA = 16;
// Use special table for both toggle and flick (to half-width ascii).
TOGGLE_FLICK_TO_HALFWIDTHASCII = 17;
- // Use special table for both toggle and flick (to number).
- TOGGLE_FLICK_TO_NUMBER = 18;
-
// Use special table for Qwerty (for Mobile) (to hiragana).
QWERTY_MOBILE_TO_HIRAGANA = 20;
- // Use special table for Qwerty (for Mobile) (to hiragana's number).
- QWERTY_MOBILE_TO_HIRAGANA_NUMBER = 21;
-
// Use special table for Qwerty (for Mobile) (to half-width ascii).
QWERTY_MOBILE_TO_HALFWIDTHASCII = 22;
@@ -622,9 +610,18 @@
// Use special table for Godan (to half-width ascii).
GODAN_TO_HALFWIDTHASCII = 31;
- // Use special table for Godan (to number).
- GODAN_TO_NUMBER = 32;
+ // Use special table for Notouch (to hiragana).
+ NOTOUCH_TO_HIRAGANA = 40;
+ // Use special table for Notouch (to half-width ascii).
+ NOTOUCH_TO_HALFWIDTHASCII = 41;
+
+ // Obsolete items.
+ OBSOLETE_TWELVE_KEYS_TO_NUMBER = 12;
+ OBSOLETE_FLICK_TO_NUMBER = 15;
+ OBSOLETE_GODAN_TO_NUMBER = 32;
+ OBSOLETE_QWERTY_MOBILE_TO_HIRAGANA_NUMBER = 21;
+ OBSOLETE_TOGGLE_FLICK_TO_NUMBER = 18;
};
// Use special Romanji table.
diff --git a/src/session/session_handler_scenario_test.cc b/src/session/session_handler_scenario_test.cc
index 09dcfeb..be6ef93 100644
--- a/src/session/session_handler_scenario_test.cc
+++ b/src/session/session_handler_scenario_test.cc
@@ -167,6 +167,7 @@
DATA_DIR "segment_focus.txt",
DATA_DIR "segment_width.txt",
DATA_DIR "twelvekeys_switch_inputmode_scenario.txt",
+ DATA_DIR "twelvekeys_toggle_flick_alphabet_scenario.txt",
DATA_DIR "twelvekeys_toggle_hiragana_preedit_scenario.txt",
DATA_DIR "undo.txt",
#undef DATA_DIR
diff --git a/src/session/session_test.cc b/src/session/session_test.cc
index d95f3c6..a6a3de7 100644
--- a/src/session/session_test.cc
+++ b/src/session/session_test.cc
@@ -681,7 +681,7 @@
const commands::Request &request) {
session->SetRequest(&request);
table_.reset(new composer::Table());
- table_.get()->InitializeWithRequestAndConfig(
+ table_->InitializeWithRequestAndConfig(
request, config::ConfigHandler::GetConfig());
session->SetTable(table_.get());
}
@@ -8285,7 +8285,7 @@
commands::Request::TWELVE_KEYS_TO_HALFWIDTHASCII);
session.SetRequest(&request);
scoped_ptr<composer::Table> table(new composer::Table());
- table.get()->InitializeWithRequestAndConfig(
+ table->InitializeWithRequestAndConfig(
request, config::ConfigHandler::GetConfig());
session.SetTable(table.get());
// Type "2*" to produce "A".
@@ -8297,22 +8297,6 @@
session.SendKey(&command);
EXPECT_EQ("A", GetComposition(command));
- // Change to 12keys-number mode.
- SwitchInputMode(commands::HALF_ASCII, &session);
-
- command.Clear();
- request.set_special_romanji_table(commands::Request::TWELVE_KEYS_TO_NUMBER);
- session.SetRequest(&request);
- table.reset(new composer::Table());
- table.get()->InitializeWithRequestAndConfig(
- request, config::ConfigHandler::GetConfig());
- session.SetTable(table.get());
- // Type "2" to produce "A2".
- SetSendKeyCommand("2", &command);
- command.mutable_input()->mutable_config()->CopyFrom(overriding_config);
- session.SendKey(&command);
- EXPECT_EQ("A2", GetComposition(command));
-
// Change to 12keys-halfascii mode.
SwitchInputMode(commands::HALF_ASCII, &session);
@@ -8321,14 +8305,14 @@
commands::Request::TWELVE_KEYS_TO_HALFWIDTHASCII);
session.SetRequest(&request);
table.reset(new composer::Table());
- table.get()->InitializeWithRequestAndConfig(
+ table->InitializeWithRequestAndConfig(
request, config::ConfigHandler::GetConfig());
session.SetTable(table.get());
- // Type "2" to produce "A2a".
+ // Type "2" to produce "Aa".
SetSendKeyCommand("2", &command);
command.mutable_input()->mutable_config()->CopyFrom(overriding_config);
session.SendKey(&command);
- EXPECT_EQ("A2a", GetComposition(command));
+ EXPECT_EQ("Aa", GetComposition(command));
command.Clear();
}