added java projects for softkeyboard
							
								
								
									
										8
									
								
								src/java/KP2ASoftKeyboard/.classpath
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,8 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <classpath> | ||||
| 	<classpathentry kind="src" path="src"/> | ||||
| 	<classpathentry kind="src" path="gen"/> | ||||
| 	<classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/> | ||||
| 	<classpathentry kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/> | ||||
| 	<classpathentry kind="output" path="bin/classes"/> | ||||
| </classpath> | ||||
							
								
								
									
										33
									
								
								src/java/KP2ASoftKeyboard/.project
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,33 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <projectDescription> | ||||
| 	<name>KP2ASoftKeyboard</name> | ||||
| 	<comment></comment> | ||||
| 	<projects> | ||||
| 	</projects> | ||||
| 	<buildSpec> | ||||
| 		<buildCommand> | ||||
| 			<name>com.android.ide.eclipse.adt.ResourceManagerBuilder</name> | ||||
| 			<arguments> | ||||
| 			</arguments> | ||||
| 		</buildCommand> | ||||
| 		<buildCommand> | ||||
| 			<name>com.android.ide.eclipse.adt.PreCompilerBuilder</name> | ||||
| 			<arguments> | ||||
| 			</arguments> | ||||
| 		</buildCommand> | ||||
| 		<buildCommand> | ||||
| 			<name>org.eclipse.jdt.core.javabuilder</name> | ||||
| 			<arguments> | ||||
| 			</arguments> | ||||
| 		</buildCommand> | ||||
| 		<buildCommand> | ||||
| 			<name>com.android.ide.eclipse.adt.ApkBuilder</name> | ||||
| 			<arguments> | ||||
| 			</arguments> | ||||
| 		</buildCommand> | ||||
| 	</buildSpec> | ||||
| 	<natures> | ||||
| 		<nature>com.android.ide.eclipse.adt.AndroidNature</nature> | ||||
| 		<nature>org.eclipse.jdt.core.javanature</nature> | ||||
| 	</natures> | ||||
| </projectDescription> | ||||
| @@ -0,0 +1,2 @@ | ||||
| eclipse.preferences.version=1 | ||||
| encoding//src/keepass2android/softkeyboard/KP2AKeyboard.java=UTF-8 | ||||
							
								
								
									
										21
									
								
								src/java/KP2ASoftKeyboard/AndroidManifest.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,21 @@ | ||||
| <manifest xmlns:android="http://schemas.android.com/apk/res/android"  | ||||
|         package="keepass2android.softkeyboard"> | ||||
|     <uses-sdk android:targetSdkVersion="14" android:minSdkVersion="11"/> | ||||
|     <supports-screens | ||||
|         android:anyDensity="true" | ||||
|         android:largeScreens="true" | ||||
|         android:normalScreens="true" | ||||
|         android:smallScreens="true" /> | ||||
|     <application android:label="@string/ime_name"> | ||||
|         <service android:name="KP2AKeyboard" | ||||
|                 android:permission="android.permission.BIND_INPUT_METHOD"> | ||||
|             <intent-filter> | ||||
|                 <action android:name="android.view.InputMethod" /> | ||||
|             </intent-filter> | ||||
|             <meta-data android:name="android.view.im" android:resource="@xml/method" /> | ||||
|         </service> | ||||
|  | ||||
|          | ||||
|     </application> | ||||
|      | ||||
| </manifest> | ||||
							
								
								
									
										4
									
								
								src/java/KP2ASoftKeyboard/lint.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,4 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <lint> | ||||
|     <issue id="WrongCall" severity="ignore" /> | ||||
| </lint> | ||||
							
								
								
									
										14
									
								
								src/java/KP2ASoftKeyboard/project.properties
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,14 @@ | ||||
| # 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-14 | ||||
| After Width: | Height: | Size: 885 B | 
| After Width: | Height: | Size: 1.6 KiB | 
| After Width: | Height: | Size: 536 B | 
| After Width: | Height: | Size: 1.6 KiB | 
| After Width: | Height: | Size: 1.2 KiB | 
| After Width: | Height: | Size: 859 B | 
| After Width: | Height: | Size: 465 B | 
| After Width: | Height: | Size: 771 B | 
| After Width: | Height: | Size: 337 B | 
| After Width: | Height: | Size: 1.0 KiB | 
| After Width: | Height: | Size: 1.0 KiB | 
| After Width: | Height: | Size: 436 B | 
							
								
								
									
										27
									
								
								src/java/KP2ASoftKeyboard/res/layout/input.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,27 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <!-- | ||||
| /*  | ||||
| ** | ||||
| ** Copyright 2008, The Android Open Source Project | ||||
| ** | ||||
| ** Licensed under the Apache License, Version 2.0 (the "License");  | ||||
| ** you may not use this file except in compliance with the License.  | ||||
| ** You may obtain a copy of the License at  | ||||
| ** | ||||
| **     http://www.apache.org/licenses/LICENSE-2.0  | ||||
| ** | ||||
| ** Unless required by applicable law or agreed to in writing, software  | ||||
| ** distributed under the License is distributed on an "AS IS" BASIS,  | ||||
| ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  | ||||
| ** See the License for the specific language governing permissions and  | ||||
| ** limitations under the License. | ||||
| */ | ||||
| --> | ||||
|  | ||||
| <keepass2android.softkeyboard.LatinKeyboardView | ||||
|         xmlns:android="http://schemas.android.com/apk/res/android" | ||||
|         android:id="@+id/keyboard" | ||||
|         android:layout_alignParentBottom="true" | ||||
|         android:layout_width="match_parent" | ||||
|         android:layout_height="wrap_content" | ||||
|         /> | ||||
							
								
								
									
										23
									
								
								src/java/KP2ASoftKeyboard/res/values-land/dimens.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,23 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <!-- | ||||
| /*  | ||||
| ** | ||||
| ** Copyright 2008, The Android Open Source Project | ||||
| ** | ||||
| ** Licensed under the Apache License, Version 2.0 (the "License");  | ||||
| ** you may not use this file except in compliance with the License.  | ||||
| ** You may obtain a copy of the License at  | ||||
| ** | ||||
| **     http://www.apache.org/licenses/LICENSE-2.0  | ||||
| ** | ||||
| ** Unless required by applicable law or agreed to in writing, software  | ||||
| ** distributed under the License is distributed on an "AS IS" BASIS,  | ||||
| ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  | ||||
| ** See the License for the specific language governing permissions and  | ||||
| ** limitations under the License. | ||||
| */ | ||||
| --> | ||||
|  | ||||
| <resources> | ||||
|     <dimen name="key_height">46dip</dimen> | ||||
| </resources> | ||||
							
								
								
									
										25
									
								
								src/java/KP2ASoftKeyboard/res/values/colors.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,25 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <!-- | ||||
| /*  | ||||
| ** | ||||
| ** Copyright 2008, The Android Open Source Project | ||||
| ** | ||||
| ** Licensed under the Apache License, Version 2.0 (the "License");  | ||||
| ** you may not use this file except in compliance with the License.  | ||||
| ** You may obtain a copy of the License at  | ||||
| ** | ||||
| **     http://www.apache.org/licenses/LICENSE-2.0  | ||||
| ** | ||||
| ** Unless required by applicable law or agreed to in writing, software  | ||||
| ** distributed under the License is distributed on an "AS IS" BASIS,  | ||||
| ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  | ||||
| ** See the License for the specific language governing permissions and  | ||||
| ** limitations under the License. | ||||
| */ | ||||
| --> | ||||
| <resources> | ||||
|     <color name="candidate_normal">#FF000000</color> | ||||
|     <color name="candidate_recommended">#FFE35900</color> | ||||
|     <color name="candidate_other">#ff808080</color> | ||||
|     <color name="candidate_background">#bbffffff</color> | ||||
| </resources> | ||||
							
								
								
									
										25
									
								
								src/java/KP2ASoftKeyboard/res/values/dimens.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,25 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <!-- | ||||
| /*  | ||||
| ** | ||||
| ** Copyright 2008, The Android Open Source Project | ||||
| ** | ||||
| ** Licensed under the Apache License, Version 2.0 (the "License");  | ||||
| ** you may not use this file except in compliance with the License.  | ||||
| ** You may obtain a copy of the License at  | ||||
| ** | ||||
| **     http://www.apache.org/licenses/LICENSE-2.0  | ||||
| ** | ||||
| ** Unless required by applicable law or agreed to in writing, software  | ||||
| ** distributed under the License is distributed on an "AS IS" BASIS,  | ||||
| ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  | ||||
| ** See the License for the specific language governing permissions and  | ||||
| ** limitations under the License. | ||||
| */ | ||||
| --> | ||||
|  | ||||
| <resources> | ||||
|     <dimen name="key_height">50dip</dimen> | ||||
|     <dimen name="candidate_font_height">16sp</dimen> | ||||
|     <dimen name="candidate_vertical_padding">6sp</dimen> | ||||
| </resources> | ||||
							
								
								
									
										34
									
								
								src/java/KP2ASoftKeyboard/res/values/strings.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,34 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <!-- | ||||
| /* | ||||
| ** | ||||
| ** Copyright 2008, The Android Open Source Project | ||||
| ** | ||||
| ** Licensed under the Apache License, Version 2.0 (the "License"); | ||||
| ** you may not use this file except in compliance with the License. | ||||
| ** You may obtain a copy of the License at | ||||
| ** | ||||
| **     http://www.apache.org/licenses/LICENSE-2.0 | ||||
| ** | ||||
| ** Unless required by applicable law or agreed to in writing, software | ||||
| ** distributed under the License is distributed on an "AS IS" BASIS, | ||||
| ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
| ** See the License for the specific language governing permissions and | ||||
| ** limitations under the License. | ||||
| */ | ||||
| --> | ||||
| <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> | ||||
|     <!-- Title for Latin keyboard  --> | ||||
|     <string name="ime_name">Keepass2Android</string> | ||||
|  | ||||
|     <!-- Symbols that are commonly considered word separators in this language --> | ||||
|     <string name="word_separators">\u0020.,;:!?\n()[]*&@{}/<>_+=|"</string> | ||||
|      | ||||
|     <!-- Labels on soft keys --> | ||||
|     <string name="label_go_key">Go</string> | ||||
|     <string name="label_next_key">Next</string> | ||||
|     <string name="label_send_key">Send</string> | ||||
|  | ||||
|     <!-- Labels for subtype --> | ||||
|     <string name="label_subtype_generic">%s</string> | ||||
| </resources> | ||||
							
								
								
									
										25
									
								
								src/java/KP2ASoftKeyboard/res/xml/method.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,25 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <!-- | ||||
| /** | ||||
|  * Copyright (c) 2008, The Android Open Source Project | ||||
|  * | ||||
|  * Licensed under the Apache License, Version 2.0 (the "License");  | ||||
|  * you may not use this file except in compliance with the License.  | ||||
|  * You may obtain a copy of the License at  | ||||
|  * | ||||
|  *     http://www.apache.org/licenses/LICENSE-2.0  | ||||
|  * | ||||
|  * Unless required by applicable law or agreed to in writing, software  | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS,  | ||||
|  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  | ||||
|  * See the License for the specific language governing permissions and  | ||||
|  * limitations under the License. | ||||
|  */ | ||||
| --> | ||||
|  | ||||
| <!-- The attributes in this XML file provide configuration information --> | ||||
| <!-- for the Search Manager. --> | ||||
|  | ||||
| <input-method xmlns:android="http://schemas.android.com/apk/res/android"> | ||||
|      | ||||
| </input-method> | ||||
							
								
								
									
										82
									
								
								src/java/KP2ASoftKeyboard/res/xml/qwerty.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,82 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <!-- | ||||
| /*  | ||||
| ** | ||||
| ** Copyright 2008, The Android Open Source Project | ||||
| ** | ||||
| ** Licensed under the Apache License, Version 2.0 (the "License");  | ||||
| ** you may not use this file except in compliance with the License.  | ||||
| ** You may obtain a copy of the License at  | ||||
| ** | ||||
| **     http://www.apache.org/licenses/LICENSE-2.0  | ||||
| ** | ||||
| ** Unless required by applicable law or agreed to in writing, software  | ||||
| ** distributed under the License is distributed on an "AS IS" BASIS,  | ||||
| ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  | ||||
| ** See the License for the specific language governing permissions and  | ||||
| ** limitations under the License. | ||||
| */ | ||||
| --> | ||||
|  | ||||
| <Keyboard xmlns:android="http://schemas.android.com/apk/res/android" | ||||
|     android:keyWidth="10%p" | ||||
|     android:horizontalGap="0px" | ||||
|     android:verticalGap="0px" | ||||
|     android:keyHeight="@dimen/key_height" | ||||
|     > | ||||
|  | ||||
|     <Row> | ||||
|         <Key android:codes="113" android:keyLabel="q" android:keyEdgeFlags="left"/> | ||||
|         <Key android:codes="119" android:keyLabel="w"/> | ||||
|         <Key android:codes="101" android:keyLabel="e"/> | ||||
|         <Key android:codes="114" android:keyLabel="r"/> | ||||
|         <Key android:codes="116" android:keyLabel="t"/> | ||||
|         <Key android:codes="121" android:keyLabel="y"/> | ||||
|         <Key android:codes="117" android:keyLabel="u"/> | ||||
|         <Key android:codes="105" android:keyLabel="i"/> | ||||
|         <Key android:codes="111" android:keyLabel="o"/> | ||||
|         <Key android:codes="112" android:keyLabel="p" android:keyEdgeFlags="right"/> | ||||
|     </Row> | ||||
|      | ||||
|     <Row> | ||||
|         <Key android:codes="97" android:keyLabel="a" android:horizontalGap="5%p"  | ||||
|                 android:keyEdgeFlags="left"/> | ||||
|         <Key android:codes="115" android:keyLabel="s"/> | ||||
|         <Key android:codes="100" android:keyLabel="d"/> | ||||
|         <Key android:codes="102" android:keyLabel="f"/> | ||||
|         <Key android:codes="103" android:keyLabel="g"/> | ||||
|         <Key android:codes="104" android:keyLabel="h"/> | ||||
|         <Key android:codes="106" android:keyLabel="j"/> | ||||
|         <Key android:codes="107" android:keyLabel="k"/> | ||||
|         <Key android:codes="108" android:keyLabel="l" android:keyEdgeFlags="right"/> | ||||
|     </Row> | ||||
|      | ||||
|     <Row> | ||||
|         <Key android:codes="-1" android:keyIcon="@drawable/sym_keyboard_shift"  | ||||
|                 android:keyWidth="15%p" android:isModifier="true" | ||||
|                 android:isSticky="true" android:keyEdgeFlags="left"/> | ||||
|         <Key android:codes="122" android:keyLabel="z"/> | ||||
|         <Key android:codes="120" android:keyLabel="x"/> | ||||
|         <Key android:codes="99" android:keyLabel="c"/> | ||||
|         <Key android:codes="118" android:keyLabel="v"/> | ||||
|         <Key android:codes="98" android:keyLabel="b"/> | ||||
|         <Key android:codes="110" android:keyLabel="n"/> | ||||
|         <Key android:codes="109" android:keyLabel="m"/> | ||||
|         <Key android:codes="-5" android:keyIcon="@drawable/sym_keyboard_delete"  | ||||
|                 android:keyWidth="15%p" android:keyEdgeFlags="right" | ||||
|                 android:isRepeatable="true"/> | ||||
|     </Row> | ||||
|      | ||||
|     <Row android:rowEdgeFlags="bottom"> | ||||
|         <Key android:codes="-101" android:keyIcon="@drawable/sym_keyboard_done"  | ||||
|                 android:keyWidth="20%p" android:keyEdgeFlags="left"/> | ||||
|         <Key android:codes="-2" android:keyLabel="123" android:keyWidth="15%p"/> | ||||
|         <Key android:codes="32" android:keyIcon="@drawable/sym_keyboard_space"  | ||||
|                 android:keyWidth="30%p" android:isRepeatable="true"/> | ||||
|         <Key android:codes="46,44" android:keyLabel=". ," | ||||
|                 android:keyWidth="15%p"/> | ||||
|         <Key android:codes="10" android:keyIcon="@drawable/sym_keyboard_return"  | ||||
|                 android:keyWidth="20%p" android:keyEdgeFlags="right"/> | ||||
|     </Row> | ||||
| </Keyboard> | ||||
|      | ||||
							
								
								
									
										81
									
								
								src/java/KP2ASoftKeyboard/res/xml/symbols.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,81 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <!-- | ||||
| /*  | ||||
| ** | ||||
| ** Copyright 2008, The Android Open Source Project | ||||
| ** | ||||
| ** Licensed under the Apache License, Version 2.0 (the "License");  | ||||
| ** you may not use this file except in compliance with the License.  | ||||
| ** You may obtain a copy of the License at  | ||||
| ** | ||||
| **     http://www.apache.org/licenses/LICENSE-2.0  | ||||
| ** | ||||
| ** Unless required by applicable law or agreed to in writing, software  | ||||
| ** distributed under the License is distributed on an "AS IS" BASIS,  | ||||
| ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  | ||||
| ** See the License for the specific language governing permissions and  | ||||
| ** limitations under the License. | ||||
| */ | ||||
| --> | ||||
|  | ||||
| <Keyboard xmlns:android="http://schemas.android.com/apk/res/android" | ||||
|     android:keyWidth="10%p" | ||||
|     android:horizontalGap="0px" | ||||
|     android:verticalGap="0px" | ||||
|     android:keyHeight="@dimen/key_height" | ||||
|     > | ||||
|  | ||||
|     <Row> | ||||
|         <Key android:codes="49" android:keyLabel="1" android:keyEdgeFlags="left"/> | ||||
|         <Key android:codes="50" android:keyLabel="2"/> | ||||
|         <Key android:codes="51" android:keyLabel="3"/> | ||||
|         <Key android:codes="52" android:keyLabel="4"/> | ||||
|         <Key android:codes="53" android:keyLabel="5"/> | ||||
|         <Key android:codes="54" android:keyLabel="6"/> | ||||
|         <Key android:codes="55" android:keyLabel="7"/> | ||||
|         <Key android:codes="56" android:keyLabel="8"/> | ||||
|         <Key android:codes="57" android:keyLabel="9"/> | ||||
|         <Key android:codes="48" android:keyLabel="0" android:keyEdgeFlags="right"/> | ||||
|     </Row> | ||||
|      | ||||
|     <Row> | ||||
|         <Key android:codes="64" android:keyLabel="\@" android:keyEdgeFlags="left"/> | ||||
|         <Key android:codes="35" android:keyLabel="\#"/> | ||||
|         <Key android:codes="36" android:keyLabel="$"/> | ||||
|         <Key android:codes="37" android:keyLabel="%"/> | ||||
|         <Key android:codes="38" android:keyLabel="&"/> | ||||
|         <Key android:codes="42" android:keyLabel="*"/> | ||||
|         <Key android:codes="45" android:keyLabel="-"/> | ||||
|         <Key android:codes="61" android:keyLabel="="/> | ||||
|         <Key android:codes="40" android:keyLabel="("/> | ||||
|         <Key android:codes="41" android:keyLabel=")" android:keyEdgeFlags="right"/> | ||||
|     </Row> | ||||
|      | ||||
|     <Row> | ||||
|         <Key android:codes="-1" android:keyIcon="@drawable/sym_keyboard_shift" | ||||
|                 android:keyWidth="15%p" android:isModifier="true" | ||||
|                 android:isSticky="true" android:keyEdgeFlags="left"/> | ||||
|         <Key android:codes="33" android:keyLabel="!" /> | ||||
|         <Key android:codes="34" android:keyLabel="""/> | ||||
|         <Key android:codes="39" android:keyLabel="\'"/> | ||||
|         <Key android:codes="58" android:keyLabel=":"/> | ||||
|         <Key android:codes="59" android:keyLabel=";"/> | ||||
|         <Key android:codes="47" android:keyLabel="/" /> | ||||
|         <Key android:codes="63" android:keyLabel="\?"/> | ||||
|         <Key android:codes="-5" android:keyIcon="@drawable/sym_keyboard_delete" | ||||
|                 android:keyWidth="15%p" android:keyEdgeFlags="right" | ||||
|                 android:isRepeatable="true"/> | ||||
|     </Row> | ||||
|      | ||||
|     <Row  android:rowEdgeFlags="bottom"> | ||||
|         <Key android:codes="-3" android:keyIcon="@drawable/sym_keyboard_done" | ||||
|                 android:keyWidth="20%p" android:keyEdgeFlags="left" /> | ||||
|         <Key android:codes="-2" android:keyLabel="ABC" android:keyWidth="15%p" /> | ||||
|         <Key android:codes="32" android:keyIcon="@drawable/sym_keyboard_space" android:keyWidth="30%p"  | ||||
|                 android:isRepeatable="true"/> | ||||
|         <Key android:codes="44" android:keyLabel="," android:keyWidth="15%p" /> | ||||
|         <Key android:codes="10" android:keyIcon="@drawable/sym_keyboard_return" | ||||
|                 android:keyWidth="20%p" android:keyEdgeFlags="right" | ||||
|                 /> | ||||
|     </Row> | ||||
| </Keyboard> | ||||
							
								
								
									
										80
									
								
								src/java/KP2ASoftKeyboard/res/xml/symbols_shift.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,80 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <!-- | ||||
| /*  | ||||
| ** | ||||
| ** Copyright 2008, The Android Open Source Project | ||||
| ** | ||||
| ** Licensed under the Apache License, Version 2.0 (the "License");  | ||||
| ** you may not use this file except in compliance with the License.  | ||||
| ** You may obtain a copy of the License at  | ||||
| ** | ||||
| **     http://www.apache.org/licenses/LICENSE-2.0  | ||||
| ** | ||||
| ** Unless required by applicable law or agreed to in writing, software  | ||||
| ** distributed under the License is distributed on an "AS IS" BASIS,  | ||||
| ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  | ||||
| ** See the License for the specific language governing permissions and  | ||||
| ** limitations under the License. | ||||
| */ | ||||
| --> | ||||
|  | ||||
| <Keyboard xmlns:android="http://schemas.android.com/apk/res/android" | ||||
|     android:keyWidth="10%p" | ||||
|     android:horizontalGap="0px" | ||||
|     android:verticalGap="0px" | ||||
|     android:keyHeight="@dimen/key_height" | ||||
|     > | ||||
|  | ||||
|     <Row> | ||||
|         <Key android:codes="126" android:keyLabel="~" android:keyEdgeFlags="left"/> | ||||
|         <Key android:codes="177" android:keyLabel="±"/> | ||||
|         <Key android:codes="215" android:keyLabel="×"/> | ||||
|         <Key android:codes="247" android:keyLabel="÷"/> | ||||
|         <Key android:codes="8226" android:keyLabel="•"/> | ||||
|         <Key android:codes="176" android:keyLabel="°"/> | ||||
|         <Key android:codes="96" android:keyLabel="`"/> | ||||
|         <Key android:codes="180" android:keyLabel="´"/> | ||||
|         <Key android:codes="123" android:keyLabel="{"/> | ||||
|         <Key android:codes="125" android:keyLabel="}" android:keyEdgeFlags="right"/> | ||||
|     </Row> | ||||
|      | ||||
|     <Row> | ||||
|         <Key android:codes="169" android:keyLabel="©" android:keyEdgeFlags="left"/> | ||||
|         <Key android:codes="163" android:keyLabel="£"/> | ||||
|         <Key android:codes="8364" android:keyLabel="€"/> | ||||
|         <Key android:codes="94" android:keyLabel="^"/> | ||||
|         <Key android:codes="174" android:keyLabel="®"/> | ||||
|         <Key android:codes="165" android:keyLabel="¥"/> | ||||
|         <Key android:codes="95" android:keyLabel="_"/> | ||||
|         <Key android:codes="43" android:keyLabel="+"/> | ||||
|         <Key android:codes="91" android:keyLabel="["/> | ||||
|         <Key android:codes="93" android:keyLabel="]" android:keyEdgeFlags="right"/> | ||||
|     </Row> | ||||
|      | ||||
|     <Row> | ||||
|         <Key android:codes="-1" android:keyIcon="@drawable/sym_keyboard_shift" | ||||
|                 android:keyWidth="15%p" android:isModifier="true" | ||||
|                 android:isSticky="true" android:keyEdgeFlags="left"/> | ||||
|         <Key android:codes="161" android:keyLabel="¡" /> | ||||
|         <Key android:codes="60" android:keyLabel="<"/> | ||||
|         <Key android:codes="62" android:keyLabel=">"/> | ||||
|         <Key android:codes="162" android:keyLabel="¢"/> | ||||
|         <Key android:codes="124" android:keyLabel="|"/> | ||||
|         <Key android:codes="92" android:keyLabel="\\" /> | ||||
|         <Key android:codes="191" android:keyLabel="¿"/> | ||||
|         <Key android:codes="-5" android:keyIcon="@drawable/sym_keyboard_delete" | ||||
|                 android:keyWidth="15%p" android:keyEdgeFlags="right" | ||||
|                 android:isRepeatable="true"/> | ||||
|     </Row> | ||||
|      | ||||
|     <Row android:rowEdgeFlags="bottom"> | ||||
|         <Key android:codes="-3" android:keyIcon="@drawable/sym_keyboard_done"  | ||||
|                 android:keyWidth="20%p" android:keyEdgeFlags="left" /> | ||||
|         <Key android:codes="-2" android:keyLabel="ABC" android:keyWidth="15%p" /> | ||||
|         <Key android:codes="32" android:keyIcon="@drawable/sym_keyboard_space" android:keyWidth="30%p"  | ||||
|                 android:isRepeatable="true"/> | ||||
|         <Key android:codes="8230" android:keyLabel="…" android:keyWidth="15%p" /> | ||||
|         <Key android:codes="10" android:keyIcon="@drawable/sym_keyboard_return" | ||||
|                 android:keyWidth="20%p" android:keyEdgeFlags="right" /> | ||||
|     </Row> | ||||
| </Keyboard> | ||||
| @@ -0,0 +1,101 @@ | ||||
| /* | ||||
|  * Copyright (C) 2011 The Android Open Source Project | ||||
|  * | ||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|  * you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  * | ||||
|  *      http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  * | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, | ||||
|  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|  * See the License for the specific language governing permissions and | ||||
|  * limitations under the License. | ||||
|  */ | ||||
|  | ||||
| /** | ||||
|  * This is a part of the inputmethod-common static Java library. | ||||
|  * The original source code can be found at frameworks/opt/inputmethodcommon of Android Open Source | ||||
|  * Project. | ||||
|  */ | ||||
|  | ||||
| package com.android.inputmethodcommon; | ||||
|  | ||||
| import android.content.Context; | ||||
| import android.graphics.drawable.Drawable; | ||||
| import android.os.Bundle; | ||||
| import android.preference.PreferenceFragment; | ||||
|  | ||||
| /** | ||||
|  * This is a helper class for an IME's settings preference fragment. It's recommended for every | ||||
|  * IME to have its own settings preference fragment which inherits this class. | ||||
|  */ | ||||
| public abstract class InputMethodSettingsFragment extends PreferenceFragment | ||||
|         implements InputMethodSettingsInterface { | ||||
|     private final InputMethodSettingsImpl mSettings = new InputMethodSettingsImpl(); | ||||
|     @Override | ||||
|     public void onCreate(Bundle savedInstanceState) { | ||||
|         super.onCreate(savedInstanceState); | ||||
|         final Context context = getActivity(); | ||||
|         setPreferenceScreen(getPreferenceManager().createPreferenceScreen(context)); | ||||
|         mSettings.init(context, getPreferenceScreen()); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * {@inheritDoc} | ||||
|      */ | ||||
|     @Override | ||||
|     public void setInputMethodSettingsCategoryTitle(int resId) { | ||||
|         mSettings.setInputMethodSettingsCategoryTitle(resId); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * {@inheritDoc} | ||||
|      */ | ||||
|     @Override | ||||
|     public void setInputMethodSettingsCategoryTitle(CharSequence title) { | ||||
|         mSettings.setInputMethodSettingsCategoryTitle(title); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * {@inheritDoc} | ||||
|      */ | ||||
|     @Override | ||||
|     public void setSubtypeEnablerTitle(int resId) { | ||||
|         mSettings.setSubtypeEnablerTitle(resId); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * {@inheritDoc} | ||||
|      */ | ||||
|     @Override | ||||
|     public void setSubtypeEnablerTitle(CharSequence title) { | ||||
|         mSettings.setSubtypeEnablerTitle(title); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * {@inheritDoc} | ||||
|      */ | ||||
|     @Override | ||||
|     public void setSubtypeEnablerIcon(int resId) { | ||||
|         mSettings.setSubtypeEnablerIcon(resId); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * {@inheritDoc} | ||||
|      */ | ||||
|     @Override | ||||
|     public void setSubtypeEnablerIcon(Drawable drawable) { | ||||
|         mSettings.setSubtypeEnablerIcon(drawable); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * {@inheritDoc} | ||||
|      */ | ||||
|     @Override | ||||
|     public void onResume() { | ||||
|         super.onResume(); | ||||
|         mSettings.updateSubtypeEnabler(); | ||||
|     } | ||||
| } | ||||
| @@ -0,0 +1,198 @@ | ||||
| /* | ||||
|  * Copyright (C) 2011 The Android Open Source Project | ||||
|  * | ||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|  * you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  * | ||||
|  *      http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  * | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, | ||||
|  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|  * See the License for the specific language governing permissions and | ||||
|  * limitations under the License. | ||||
|  */ | ||||
|  | ||||
| /** | ||||
|  * This is a part of the inputmethod-common static Java library. | ||||
|  * The original source code can be found at frameworks/opt/inputmethodcommon of Android Open Source | ||||
|  * Project. | ||||
|  */ | ||||
|  | ||||
| package com.android.inputmethodcommon; | ||||
|  | ||||
| import android.content.Context; | ||||
| import android.content.Intent; | ||||
| import android.graphics.drawable.Drawable; | ||||
| import android.preference.Preference; | ||||
| import android.preference.Preference.OnPreferenceClickListener; | ||||
| import android.preference.PreferenceScreen; | ||||
| import android.provider.Settings; | ||||
| import android.text.TextUtils; | ||||
| import android.view.inputmethod.InputMethodInfo; | ||||
| import android.view.inputmethod.InputMethodManager; | ||||
| import android.view.inputmethod.InputMethodSubtype; | ||||
|  | ||||
| import java.util.List; | ||||
|  | ||||
| /* package private */ class InputMethodSettingsImpl implements InputMethodSettingsInterface { | ||||
|     private Preference mSubtypeEnablerPreference; | ||||
|     private int mInputMethodSettingsCategoryTitleRes; | ||||
|     private CharSequence mInputMethodSettingsCategoryTitle; | ||||
|     private int mSubtypeEnablerTitleRes; | ||||
|     private CharSequence mSubtypeEnablerTitle; | ||||
|     private int mSubtypeEnablerIconRes; | ||||
|     private Drawable mSubtypeEnablerIcon; | ||||
|     private InputMethodManager mImm; | ||||
|     private InputMethodInfo mImi; | ||||
|     private Context mContext; | ||||
|  | ||||
|     /** | ||||
|      * Initialize internal states of this object. | ||||
|      * @param context the context for this application. | ||||
|      * @param prefScreen a PreferenceScreen of PreferenceActivity or PreferenceFragment. | ||||
|      * @return true if this application is an IME and has two or more subtypes, false otherwise. | ||||
|      */ | ||||
|     public boolean init(final Context context, final PreferenceScreen prefScreen) { | ||||
|         mContext = context; | ||||
|         mImm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE); | ||||
|         mImi = getMyImi(context, mImm); | ||||
|         if (mImi == null || mImi.getSubtypeCount() <= 1) { | ||||
|             return false; | ||||
|         } | ||||
|         mSubtypeEnablerPreference = new Preference(context); | ||||
|         mSubtypeEnablerPreference | ||||
|                 .setOnPreferenceClickListener(new OnPreferenceClickListener() { | ||||
|                     @Override | ||||
|                     public boolean onPreferenceClick(Preference preference) { | ||||
|                         final CharSequence title = getSubtypeEnablerTitle(context); | ||||
|                         final Intent intent = | ||||
|                                 new Intent(Settings.ACTION_INPUT_METHOD_SUBTYPE_SETTINGS); | ||||
|                         intent.putExtra(Settings.EXTRA_INPUT_METHOD_ID, mImi.getId()); | ||||
|                         if (!TextUtils.isEmpty(title)) { | ||||
|                             intent.putExtra(Intent.EXTRA_TITLE, title); | ||||
|                         } | ||||
|                         intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | ||||
|                                 | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED | ||||
|                                 | Intent.FLAG_ACTIVITY_CLEAR_TOP); | ||||
|                         context.startActivity(intent); | ||||
|                         return true; | ||||
|                     } | ||||
|                 }); | ||||
|         prefScreen.addPreference(mSubtypeEnablerPreference); | ||||
|         updateSubtypeEnabler(); | ||||
|         return true; | ||||
|     } | ||||
|  | ||||
|     private static InputMethodInfo getMyImi(Context context, InputMethodManager imm) { | ||||
|         final List<InputMethodInfo> imis = imm.getInputMethodList(); | ||||
|         for (int i = 0; i < imis.size(); ++i) { | ||||
|             final InputMethodInfo imi = imis.get(i); | ||||
|             if (imis.get(i).getPackageName().equals(context.getPackageName())) { | ||||
|                 return imi; | ||||
|             } | ||||
|         } | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     private static String getEnabledSubtypesLabel( | ||||
|             Context context, InputMethodManager imm, InputMethodInfo imi) { | ||||
|         if (context == null || imm == null || imi == null) return null; | ||||
|         final List<InputMethodSubtype> subtypes = imm.getEnabledInputMethodSubtypeList(imi, true); | ||||
|         final StringBuilder sb = new StringBuilder(); | ||||
|         final int N = subtypes.size(); | ||||
|         for (int i = 0; i < N; ++i) { | ||||
|             final InputMethodSubtype subtype = subtypes.get(i); | ||||
|             if (sb.length() > 0) { | ||||
|                 sb.append(", "); | ||||
|             } | ||||
|             sb.append(subtype.getDisplayName(context, imi.getPackageName(), | ||||
|                     imi.getServiceInfo().applicationInfo)); | ||||
|         } | ||||
|         return sb.toString(); | ||||
|     } | ||||
|     /** | ||||
|      * {@inheritDoc} | ||||
|      */ | ||||
|     @Override | ||||
|     public void setInputMethodSettingsCategoryTitle(int resId) { | ||||
|         mInputMethodSettingsCategoryTitleRes = resId; | ||||
|         updateSubtypeEnabler(); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * {@inheritDoc} | ||||
|      */ | ||||
|     @Override | ||||
|     public void setInputMethodSettingsCategoryTitle(CharSequence title) { | ||||
|         mInputMethodSettingsCategoryTitleRes = 0; | ||||
|         mInputMethodSettingsCategoryTitle = title; | ||||
|         updateSubtypeEnabler(); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * {@inheritDoc} | ||||
|      */ | ||||
|     @Override | ||||
|     public void setSubtypeEnablerTitle(int resId) { | ||||
|         mSubtypeEnablerTitleRes = resId; | ||||
|         updateSubtypeEnabler(); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * {@inheritDoc} | ||||
|      */ | ||||
|     @Override | ||||
|     public void setSubtypeEnablerTitle(CharSequence title) { | ||||
|         mSubtypeEnablerTitleRes = 0; | ||||
|         mSubtypeEnablerTitle = title; | ||||
|         updateSubtypeEnabler(); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * {@inheritDoc} | ||||
|      */ | ||||
|     @Override | ||||
|     public void setSubtypeEnablerIcon(int resId) { | ||||
|         mSubtypeEnablerIconRes = resId; | ||||
|         updateSubtypeEnabler(); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * {@inheritDoc} | ||||
|      */ | ||||
|     @Override | ||||
|     public void setSubtypeEnablerIcon(Drawable drawable) { | ||||
|         mSubtypeEnablerIconRes = 0; | ||||
|         mSubtypeEnablerIcon = drawable; | ||||
|         updateSubtypeEnabler(); | ||||
|     } | ||||
|  | ||||
|     private CharSequence getSubtypeEnablerTitle(Context context) { | ||||
|         if (mSubtypeEnablerTitleRes != 0) { | ||||
|             return context.getString(mSubtypeEnablerTitleRes); | ||||
|         } else { | ||||
|             return mSubtypeEnablerTitle; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public void updateSubtypeEnabler() { | ||||
|         if (mSubtypeEnablerPreference != null) { | ||||
|             if (mSubtypeEnablerTitleRes != 0) { | ||||
|                 mSubtypeEnablerPreference.setTitle(mSubtypeEnablerTitleRes); | ||||
|             } else if (!TextUtils.isEmpty(mSubtypeEnablerTitle)) { | ||||
|                 mSubtypeEnablerPreference.setTitle(mSubtypeEnablerTitle); | ||||
|             } | ||||
|             final String summary = getEnabledSubtypesLabel(mContext, mImm, mImi); | ||||
|             if (!TextUtils.isEmpty(summary)) { | ||||
|                 mSubtypeEnablerPreference.setSummary(summary); | ||||
|             } | ||||
|             if (mSubtypeEnablerIconRes != 0) { | ||||
|                 mSubtypeEnablerPreference.setIcon(mSubtypeEnablerIconRes); | ||||
|             } else if (mSubtypeEnablerIcon != null) { | ||||
|                 mSubtypeEnablerPreference.setIcon(mSubtypeEnablerIcon); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @@ -0,0 +1,69 @@ | ||||
| /* | ||||
|  * Copyright (C) 2011 The Android Open Source Project | ||||
|  * | ||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|  * you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  * | ||||
|  *      http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  * | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, | ||||
|  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|  * See the License for the specific language governing permissions and | ||||
|  * limitations under the License | ||||
|  */ | ||||
|  | ||||
| /** | ||||
|  * This is a part of the inputmethod-common static Java library. | ||||
|  * The original source code can be found at frameworks/opt/inputmethodcommon of Android Open Source | ||||
|  * Project. | ||||
|  */ | ||||
|  | ||||
| package com.android.inputmethodcommon; | ||||
|  | ||||
| import android.graphics.drawable.Drawable; | ||||
|  | ||||
| /** | ||||
|  * InputMethodSettingsInterface is the interface for adding IME related preferences to | ||||
|  * PreferenceActivity or PreferenceFragment. | ||||
|  */ | ||||
| public interface InputMethodSettingsInterface { | ||||
|     /** | ||||
|      * Sets the title for the input method settings category with a resource ID. | ||||
|      * @param resId The resource ID of the title. | ||||
|      */ | ||||
|     public void setInputMethodSettingsCategoryTitle(int resId); | ||||
|  | ||||
|     /** | ||||
|      * Sets the title for the input method settings category with a CharSequence. | ||||
|      * @param title The title for this preference. | ||||
|      */ | ||||
|     public void setInputMethodSettingsCategoryTitle(CharSequence title); | ||||
|  | ||||
|     /** | ||||
|      * Sets the title for the input method enabler preference for launching subtype enabler with a | ||||
|      * resource ID. | ||||
|      * @param resId The resource ID of the title. | ||||
|      */ | ||||
|     public void setSubtypeEnablerTitle(int resId); | ||||
|  | ||||
|     /** | ||||
|      * Sets the title for the input method enabler preference for launching subtype enabler with a | ||||
|      * CharSequence. | ||||
|      * @param title The title for this preference. | ||||
|      */ | ||||
|     public void setSubtypeEnablerTitle(CharSequence title); | ||||
|  | ||||
|     /** | ||||
|      * Sets the icon for the preference for launching subtype enabler with a resource ID. | ||||
|      * @param resId The resource id of an optional icon for the preference. | ||||
|      */ | ||||
|     public void setSubtypeEnablerIcon(int resId); | ||||
|  | ||||
|     /** | ||||
|      * Sets the icon for the Preference for launching subtype enabler with a Drawable. | ||||
|      * @param drawable The drawable of an optional icon for the preference. | ||||
|      */ | ||||
|     public void setSubtypeEnablerIcon(Drawable drawable); | ||||
| } | ||||
| @@ -0,0 +1,323 @@ | ||||
| /* | ||||
|  * Copyright (C) 2008-2009 The Android Open Source Project | ||||
|  * | ||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|  * you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  * | ||||
|  *      http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  * | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, | ||||
|  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|  * See the License for the specific language governing permissions and | ||||
|  * limitations under the License. | ||||
|  */ | ||||
|  | ||||
| package keepass2android.softkeyboard; | ||||
|  | ||||
| import android.content.Context; | ||||
| import android.content.res.Resources; | ||||
| import android.graphics.Canvas; | ||||
| import android.graphics.Paint; | ||||
| import android.graphics.Rect; | ||||
| import android.graphics.drawable.Drawable; | ||||
| import android.view.GestureDetector; | ||||
| import android.view.MotionEvent; | ||||
| import android.view.View; | ||||
|  | ||||
| import java.util.ArrayList; | ||||
| import java.util.List; | ||||
|  | ||||
| import keepass2android.softkeyboard.R; | ||||
|  | ||||
| public class CandidateView extends View { | ||||
|  | ||||
|     private static final int OUT_OF_BOUNDS = -1; | ||||
|  | ||||
|     private KP2AKeyboard mService; | ||||
|     private List<String> mSuggestions; | ||||
|     private int mSelectedIndex; | ||||
|     private int mTouchX = OUT_OF_BOUNDS; | ||||
|     private Drawable mSelectionHighlight; | ||||
|     private boolean mTypedWordValid; | ||||
|      | ||||
|     private Rect mBgPadding; | ||||
|  | ||||
|     private static final int MAX_SUGGESTIONS = 32; | ||||
|     private static final int SCROLL_PIXELS = 20; | ||||
|      | ||||
|     private int[] mWordWidth = new int[MAX_SUGGESTIONS]; | ||||
|     private int[] mWordX = new int[MAX_SUGGESTIONS]; | ||||
|  | ||||
|     private static final int X_GAP = 10; | ||||
|      | ||||
|     private static final List<String> EMPTY_LIST = new ArrayList<String>(); | ||||
|  | ||||
|     private int mColorNormal; | ||||
|     private int mColorRecommended; | ||||
|     private int mColorOther; | ||||
|     private int mVerticalPadding; | ||||
|     private Paint mPaint; | ||||
|     private boolean mScrolled; | ||||
|     private int mTargetScrollX; | ||||
|      | ||||
|     private int mTotalWidth; | ||||
|      | ||||
|     private GestureDetector mGestureDetector; | ||||
|  | ||||
|     /** | ||||
|      * Construct a CandidateView for showing suggested words for completion. | ||||
|      * @param context | ||||
|      * @param attrs | ||||
|      */ | ||||
|     public CandidateView(Context context) { | ||||
|         super(context); | ||||
|         mSelectionHighlight = context.getResources().getDrawable( | ||||
|                 android.R.drawable.list_selector_background); | ||||
|         mSelectionHighlight.setState(new int[] { | ||||
|                 android.R.attr.state_enabled, | ||||
|                 android.R.attr.state_focused, | ||||
|                 android.R.attr.state_window_focused, | ||||
|                 android.R.attr.state_pressed | ||||
|         }); | ||||
|  | ||||
|         Resources r = context.getResources(); | ||||
|          | ||||
|         setBackgroundColor(r.getColor(R.color.candidate_background)); | ||||
|          | ||||
|         mColorNormal = r.getColor(R.color.candidate_normal); | ||||
|         mColorRecommended = r.getColor(R.color.candidate_recommended); | ||||
|         mColorOther = r.getColor(R.color.candidate_other); | ||||
|         mVerticalPadding = r.getDimensionPixelSize(R.dimen.candidate_vertical_padding); | ||||
|          | ||||
|         mPaint = new Paint(); | ||||
|         mPaint.setColor(mColorNormal); | ||||
|         mPaint.setAntiAlias(true); | ||||
|         mPaint.setTextSize(r.getDimensionPixelSize(R.dimen.candidate_font_height)); | ||||
|         mPaint.setStrokeWidth(0); | ||||
|          | ||||
|         mGestureDetector = new GestureDetector(new GestureDetector.SimpleOnGestureListener() { | ||||
|             @Override | ||||
|             public boolean onScroll(MotionEvent e1, MotionEvent e2, | ||||
|                     float distanceX, float distanceY) { | ||||
|                 mScrolled = true; | ||||
|                 int sx = getScrollX(); | ||||
|                 sx += distanceX; | ||||
|                 if (sx < 0) { | ||||
|                     sx = 0; | ||||
|                 } | ||||
|                 if (sx + getWidth() > mTotalWidth) {                     | ||||
|                     sx -= distanceX; | ||||
|                 } | ||||
|                 mTargetScrollX = sx; | ||||
|                 scrollTo(sx, getScrollY()); | ||||
|                 invalidate(); | ||||
|                 return true; | ||||
|             } | ||||
|         }); | ||||
|         setHorizontalFadingEdgeEnabled(true); | ||||
|         setWillNotDraw(false); | ||||
|         setHorizontalScrollBarEnabled(false); | ||||
|         setVerticalScrollBarEnabled(false); | ||||
|     } | ||||
|      | ||||
|     /** | ||||
|      * A connection back to the service to communicate with the text field | ||||
|      * @param listener | ||||
|      */ | ||||
|     public void setService(KP2AKeyboard listener) { | ||||
|         mService = listener; | ||||
|     } | ||||
|      | ||||
|     @Override | ||||
|     public int computeHorizontalScrollRange() { | ||||
|         return mTotalWidth; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { | ||||
|         int measuredWidth = resolveSize(50, widthMeasureSpec); | ||||
|          | ||||
|         // Get the desired height of the icon menu view (last row of items does | ||||
|         // not have a divider below) | ||||
|         Rect padding = new Rect(); | ||||
|         mSelectionHighlight.getPadding(padding); | ||||
|         final int desiredHeight = ((int)mPaint.getTextSize()) + mVerticalPadding | ||||
|                 + padding.top + padding.bottom; | ||||
|          | ||||
|         // Maximum possible width and desired height | ||||
|         setMeasuredDimension(measuredWidth, | ||||
|                 resolveSize(desiredHeight, heightMeasureSpec)); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * If the canvas is null, then only touch calculations are performed to pick the target | ||||
|      * candidate. | ||||
|      */ | ||||
|     @Override | ||||
|     protected void onDraw(Canvas canvas) { | ||||
|         if (canvas != null) { | ||||
|             super.onDraw(canvas); | ||||
|         } | ||||
|         mTotalWidth = 0; | ||||
|         if (mSuggestions == null) return; | ||||
|          | ||||
|         if (mBgPadding == null) { | ||||
|             mBgPadding = new Rect(0, 0, 0, 0); | ||||
|             if (getBackground() != null) { | ||||
|                 getBackground().getPadding(mBgPadding); | ||||
|             } | ||||
|         } | ||||
|         int x = 0; | ||||
|         final int count = mSuggestions.size();  | ||||
|         final int height = getHeight(); | ||||
|         final Rect bgPadding = mBgPadding; | ||||
|         final Paint paint = mPaint; | ||||
|         final int touchX = mTouchX; | ||||
|         final int scrollX = getScrollX(); | ||||
|         final boolean scrolled = mScrolled; | ||||
|         final boolean typedWordValid = mTypedWordValid; | ||||
|         final int y = (int) (((height - mPaint.getTextSize()) / 2) - mPaint.ascent()); | ||||
|  | ||||
|         for (int i = 0; i < count; i++) { | ||||
|             String suggestion = mSuggestions.get(i); | ||||
|             float textWidth = paint.measureText(suggestion); | ||||
|             final int wordWidth = (int) textWidth + X_GAP * 2; | ||||
|  | ||||
|             mWordX[i] = x; | ||||
|             mWordWidth[i] = wordWidth; | ||||
|             paint.setColor(mColorNormal); | ||||
|             if (touchX + scrollX >= x && touchX + scrollX < x + wordWidth && !scrolled) { | ||||
|                 if (canvas != null) { | ||||
|                     canvas.translate(x, 0); | ||||
|                     mSelectionHighlight.setBounds(0, bgPadding.top, wordWidth, height); | ||||
|                     mSelectionHighlight.draw(canvas); | ||||
|                     canvas.translate(-x, 0); | ||||
|                 } | ||||
|                 mSelectedIndex = i; | ||||
|             } | ||||
|  | ||||
|             if (canvas != null) { | ||||
|                 if ((i == 1 && !typedWordValid) || (i == 0 && typedWordValid)) { | ||||
|                     paint.setFakeBoldText(true); | ||||
|                     paint.setColor(mColorRecommended); | ||||
|                 } else if (i != 0) { | ||||
|                     paint.setColor(mColorOther); | ||||
|                 } | ||||
|                 canvas.drawText(suggestion, x + X_GAP, y, paint); | ||||
|                 paint.setColor(mColorOther);  | ||||
|                 canvas.drawLine(x + wordWidth + 0.5f, bgPadding.top,  | ||||
|                         x + wordWidth + 0.5f, height + 1, paint); | ||||
|                 paint.setFakeBoldText(false); | ||||
|             } | ||||
|             x += wordWidth; | ||||
|         } | ||||
|         mTotalWidth = x; | ||||
|         if (mTargetScrollX != getScrollX()) { | ||||
|             scrollToTarget(); | ||||
|         } | ||||
|     } | ||||
|      | ||||
|     private void scrollToTarget() { | ||||
|         int sx = getScrollX(); | ||||
|         if (mTargetScrollX > sx) { | ||||
|             sx += SCROLL_PIXELS; | ||||
|             if (sx >= mTargetScrollX) { | ||||
|                 sx = mTargetScrollX; | ||||
|                 requestLayout(); | ||||
|             } | ||||
|         } else { | ||||
|             sx -= SCROLL_PIXELS; | ||||
|             if (sx <= mTargetScrollX) { | ||||
|                 sx = mTargetScrollX; | ||||
|                 requestLayout(); | ||||
|             } | ||||
|         } | ||||
|         scrollTo(sx, getScrollY()); | ||||
|         invalidate(); | ||||
|     } | ||||
|      | ||||
|     public void setSuggestions(List<String> suggestions, boolean completions, | ||||
|             boolean typedWordValid) { | ||||
|         clear(); | ||||
|         if (suggestions != null) { | ||||
|             mSuggestions = new ArrayList<String>(suggestions); | ||||
|         } | ||||
|         mTypedWordValid = typedWordValid; | ||||
|         scrollTo(0, 0); | ||||
|         mTargetScrollX = 0; | ||||
|         // Compute the total width | ||||
|         onDraw(null); | ||||
|         invalidate(); | ||||
|         requestLayout(); | ||||
|     } | ||||
|  | ||||
|     public void clear() { | ||||
|         mSuggestions = EMPTY_LIST; | ||||
|         mTouchX = OUT_OF_BOUNDS; | ||||
|         mSelectedIndex = -1; | ||||
|         invalidate(); | ||||
|     } | ||||
|      | ||||
|     @Override | ||||
|     public boolean onTouchEvent(MotionEvent me) { | ||||
|  | ||||
|         if (mGestureDetector.onTouchEvent(me)) { | ||||
|             return true; | ||||
|         } | ||||
|  | ||||
|         int action = me.getAction(); | ||||
|         int x = (int) me.getX(); | ||||
|         int y = (int) me.getY(); | ||||
|         mTouchX = x; | ||||
|  | ||||
|         switch (action) { | ||||
|         case MotionEvent.ACTION_DOWN: | ||||
|             mScrolled = false; | ||||
|             invalidate(); | ||||
|             break; | ||||
|         case MotionEvent.ACTION_MOVE: | ||||
|             if (y <= 0) { | ||||
|                 // Fling up!? | ||||
|                 if (mSelectedIndex >= 0) { | ||||
|                     mService.pickSuggestionManually(mSelectedIndex); | ||||
|                     mSelectedIndex = -1; | ||||
|                 } | ||||
|             } | ||||
|             invalidate(); | ||||
|             break; | ||||
|         case MotionEvent.ACTION_UP: | ||||
|             if (!mScrolled) { | ||||
|                 if (mSelectedIndex >= 0) { | ||||
|                     mService.pickSuggestionManually(mSelectedIndex); | ||||
|                 } | ||||
|             } | ||||
|             mSelectedIndex = -1; | ||||
|             removeHighlight(); | ||||
|             requestLayout(); | ||||
|             break; | ||||
|         } | ||||
|         return true; | ||||
|     } | ||||
|      | ||||
|     /** | ||||
|      * For flick through from keyboard, call this method with the x coordinate of the flick  | ||||
|      * gesture. | ||||
|      * @param x | ||||
|      */ | ||||
|     public void takeSuggestionAt(float x) { | ||||
|         mTouchX = (int) x; | ||||
|         // To detect candidate | ||||
|         onDraw(null); | ||||
|         if (mSelectedIndex >= 0) { | ||||
|             mService.pickSuggestionManually(mSelectedIndex); | ||||
|         } | ||||
|         invalidate(); | ||||
|     } | ||||
|  | ||||
|     private void removeHighlight() { | ||||
|         mTouchX = OUT_OF_BOUNDS; | ||||
|         invalidate(); | ||||
|     } | ||||
| } | ||||
| @@ -0,0 +1,645 @@ | ||||
| /* | ||||
|  * Copyright (C) 2008-2009 The Android Open Source Project | ||||
|  * | ||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|  * you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  * | ||||
|  *      http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  * | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, | ||||
|  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|  * See the License for the specific language governing permissions and | ||||
|  * limitations under the License. | ||||
|  */ | ||||
|  | ||||
| package keepass2android.softkeyboard; | ||||
|  | ||||
| import android.app.AlertDialog; | ||||
| import android.content.DialogInterface; | ||||
| import android.inputmethodservice.InputMethodService; | ||||
| import android.inputmethodservice.Keyboard; | ||||
| import android.inputmethodservice.KeyboardView; | ||||
| import android.text.InputType; | ||||
| import android.view.KeyEvent; | ||||
| import android.view.View; | ||||
| import android.view.Window; | ||||
| import android.view.WindowManager; | ||||
| import android.view.inputmethod.CompletionInfo; | ||||
| import android.view.inputmethod.EditorInfo; | ||||
| import android.view.inputmethod.InputConnection; | ||||
| import android.view.inputmethod.InputMethodManager; | ||||
| import android.view.inputmethod.InputMethodSubtype; | ||||
|  | ||||
| import java.util.ArrayList; | ||||
| import java.util.List; | ||||
|  | ||||
| import keepass2android.softkeyboard.R; | ||||
|  | ||||
| /** | ||||
|  * Example of writing an input method for a soft keyboard.  This code is | ||||
|  * focused on simplicity over completeness, so it should in no way be considered | ||||
|  * to be a complete soft keyboard implementation.  Its purpose is to provide | ||||
|  * a basic example for how you would get started writing an input method, to | ||||
|  * be fleshed out as appropriate. | ||||
|  */ | ||||
| public class KP2AKeyboard extends InputMethodService  | ||||
|         implements KeyboardView.OnKeyboardActionListener { | ||||
|     static final boolean DEBUG = false; | ||||
|      | ||||
|     private InputMethodManager mInputMethodManager; | ||||
|  | ||||
|     private LatinKeyboardView mInputView; | ||||
|     private CandidateView mCandidateView; | ||||
|     private CompletionInfo[] mCompletions; | ||||
|      | ||||
|     private StringBuilder mComposing = new StringBuilder(); | ||||
|     private boolean mPredictionOn; | ||||
|     private boolean mCompletionOn; | ||||
|     private int mLastDisplayWidth; | ||||
|     private boolean mCapsLock; | ||||
|     private long mLastShiftTime; | ||||
|     private long mMetaState; | ||||
|      | ||||
|     private LatinKeyboard mSymbolsKeyboard; | ||||
|     private LatinKeyboard mSymbolsShiftedKeyboard; | ||||
|     private LatinKeyboard mQwertyKeyboard; | ||||
|      | ||||
|     private LatinKeyboard mCurKeyboard; | ||||
|      | ||||
|     private String mWordSeparators; | ||||
|      | ||||
|     /** | ||||
|      * Main initialization of the input method component.  Be sure to call | ||||
|      * to super class. | ||||
|      */ | ||||
|     @Override public void onCreate() { | ||||
|         super.onCreate(); | ||||
|         mInputMethodManager = (InputMethodManager)getSystemService(INPUT_METHOD_SERVICE); | ||||
|         mWordSeparators = getResources().getString(R.string.word_separators); | ||||
|     } | ||||
|      | ||||
|     /** | ||||
|      * This is the point where you can do all of your UI initialization.  It | ||||
|      * is called after creation and any configuration change. | ||||
|      */ | ||||
|     @Override public void onInitializeInterface() { | ||||
|         if (mQwertyKeyboard != null) { | ||||
|             // Configuration changes can happen after the keyboard gets recreated, | ||||
|             // so we need to be able to re-build the keyboards if the available | ||||
|             // space has changed. | ||||
|             int displayWidth = getMaxWidth(); | ||||
|             if (displayWidth == mLastDisplayWidth) return; | ||||
|             mLastDisplayWidth = displayWidth; | ||||
|         } | ||||
|         mQwertyKeyboard = new LatinKeyboard(this, R.xml.qwerty); | ||||
|         mSymbolsKeyboard = new LatinKeyboard(this, R.xml.symbols); | ||||
|         mSymbolsShiftedKeyboard = new LatinKeyboard(this, R.xml.symbols_shift); | ||||
|     } | ||||
|      | ||||
|     /** | ||||
|      * Called by the framework when your view for creating input needs to | ||||
|      * be generated.  This will be called the first time your input method | ||||
|      * is displayed, and every time it needs to be re-created such as due to | ||||
|      * a configuration change. | ||||
|      */ | ||||
|     @Override public View onCreateInputView() { | ||||
|         mInputView = (LatinKeyboardView) getLayoutInflater().inflate( | ||||
|                 R.layout.input, null); | ||||
|         mInputView.setOnKeyboardActionListener(this); | ||||
|         mInputView.setKeyboard(mQwertyKeyboard); | ||||
|         return mInputView; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Called by the framework when your view for showing candidates needs to | ||||
|      * be generated, like {@link #onCreateInputView}. | ||||
|      */ | ||||
|     @Override public View onCreateCandidatesView() { | ||||
|         mCandidateView = new CandidateView(this); | ||||
|         mCandidateView.setService(this); | ||||
|         return mCandidateView; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * This is the main point where we do our initialization of the input method | ||||
|      * to begin operating on an application.  At this point we have been | ||||
|      * bound to the client, and are now receiving all of the detailed information | ||||
|      * about the target of our edits. | ||||
|      */ | ||||
|     @Override public void onStartInput(EditorInfo attribute, boolean restarting) { | ||||
|         super.onStartInput(attribute, restarting); | ||||
|          | ||||
|         // Reset our state.  We want to do this even if restarting, because | ||||
|         // the underlying state of the text editor could have changed in any way. | ||||
|         mComposing.setLength(0); | ||||
|         updateCandidates(); | ||||
|          | ||||
|         if (!restarting) { | ||||
|             // Clear shift states. | ||||
|             mMetaState = 0; | ||||
|         } | ||||
|          | ||||
|         mPredictionOn = false; | ||||
|         mCompletionOn = false; | ||||
|         mCompletions = null; | ||||
|          | ||||
|         // We are now going to initialize our state based on the type of | ||||
|         // text being edited. | ||||
|         switch (attribute.inputType & InputType.TYPE_MASK_CLASS) { | ||||
|             case InputType.TYPE_CLASS_NUMBER: | ||||
|             case InputType.TYPE_CLASS_DATETIME: | ||||
|                 // Numbers and dates default to the symbols keyboard, with | ||||
|                 // no extra features. | ||||
|                 mCurKeyboard = mSymbolsKeyboard; | ||||
|                 break; | ||||
|                  | ||||
|             case InputType.TYPE_CLASS_PHONE: | ||||
|                 // Phones will also default to the symbols keyboard, though | ||||
|                 // often you will want to have a dedicated phone keyboard. | ||||
|                 mCurKeyboard = mSymbolsKeyboard; | ||||
|                 break; | ||||
|                  | ||||
|             case InputType.TYPE_CLASS_TEXT: | ||||
|                 // This is general text editing.  We will default to the | ||||
|                 // normal alphabetic keyboard, and assume that we should | ||||
|                 // be doing predictive text (showing candidates as the | ||||
|                 // user types). | ||||
|                 mCurKeyboard = mQwertyKeyboard; | ||||
|                 mPredictionOn = true; | ||||
|                  | ||||
|                 // We now look for a few special variations of text that will | ||||
|                 // modify our behavior. | ||||
|                 int variation = attribute.inputType & InputType.TYPE_MASK_VARIATION; | ||||
|                 if (variation == InputType.TYPE_TEXT_VARIATION_PASSWORD || | ||||
|                         variation == InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD) { | ||||
|                     // Do not display predictions / what the user is typing | ||||
|                     // when they are entering a password. | ||||
|                     mPredictionOn = false; | ||||
|                 } | ||||
|                  | ||||
|                 if (variation == InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS | ||||
|                         || variation == InputType.TYPE_TEXT_VARIATION_URI | ||||
|                         || variation == InputType.TYPE_TEXT_VARIATION_FILTER) { | ||||
|                     // Our predictions are not useful for e-mail addresses | ||||
|                     // or URIs. | ||||
|                     mPredictionOn = false; | ||||
|                 } | ||||
|                  | ||||
|                 if ((attribute.inputType & InputType.TYPE_TEXT_FLAG_AUTO_COMPLETE) != 0) { | ||||
|                     // If this is an auto-complete text view, then our predictions | ||||
|                     // will not be shown and instead we will allow the editor | ||||
|                     // to supply their own.  We only show the editor's | ||||
|                     // candidates when in fullscreen mode, otherwise relying | ||||
|                     // own it displaying its own UI. | ||||
|                     mPredictionOn = false; | ||||
|                     mCompletionOn = isFullscreenMode(); | ||||
|                 } | ||||
|                  | ||||
|                 // We also want to look at the current state of the editor | ||||
|                 // to decide whether our alphabetic keyboard should start out | ||||
|                 // shifted. | ||||
|                 updateShiftKeyState(attribute); | ||||
|                 break; | ||||
|                  | ||||
|             default: | ||||
|                 // For all unknown input types, default to the alphabetic | ||||
|                 // keyboard with no special features. | ||||
|                 mCurKeyboard = mQwertyKeyboard; | ||||
|                 updateShiftKeyState(attribute); | ||||
|         } | ||||
|          | ||||
|         // Update the label on the enter key, depending on what the application | ||||
|         // says it will do. | ||||
|         mCurKeyboard.setImeOptions(getResources(), attribute.imeOptions); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * This is called when the user is done editing a field.  We can use | ||||
|      * this to reset our state. | ||||
|      */ | ||||
|     @Override public void onFinishInput() { | ||||
|         super.onFinishInput(); | ||||
|          | ||||
|         // Clear current composing text and candidates. | ||||
|         mComposing.setLength(0); | ||||
|         updateCandidates(); | ||||
|          | ||||
|         // We only hide the candidates window when finishing input on | ||||
|         // a particular editor, to avoid popping the underlying application | ||||
|         // up and down if the user is entering text into the bottom of | ||||
|         // its window. | ||||
|         setCandidatesViewShown(false); | ||||
|          | ||||
|         mCurKeyboard = mQwertyKeyboard; | ||||
|         if (mInputView != null) { | ||||
|             mInputView.closing(); | ||||
|         } | ||||
|     } | ||||
|      | ||||
|     @Override public void onStartInputView(EditorInfo attribute, boolean restarting) { | ||||
|         super.onStartInputView(attribute, restarting); | ||||
|         // Apply the selected keyboard to the input view. | ||||
|         mInputView.setKeyboard(mCurKeyboard); | ||||
|         mInputView.closing(); | ||||
|         //final InputMethodSubtype subtype = mInputMethodManager.getCurrentInputMethodSubtype(); | ||||
|         //mInputView.setSubtypeOnSpaceKey(subtype); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void onCurrentInputMethodSubtypeChanged(InputMethodSubtype subtype) { | ||||
|         mInputView.setSubtypeOnSpaceKey(subtype); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Deal with the editor reporting movement of its cursor. | ||||
|      */ | ||||
|     @Override public void onUpdateSelection(int oldSelStart, int oldSelEnd, | ||||
|             int newSelStart, int newSelEnd, | ||||
|             int candidatesStart, int candidatesEnd) { | ||||
|         super.onUpdateSelection(oldSelStart, oldSelEnd, newSelStart, newSelEnd, | ||||
|                 candidatesStart, candidatesEnd); | ||||
|          | ||||
|         // If the current selection in the text view changes, we should | ||||
|         // clear whatever candidate text we have. | ||||
|         if (mComposing.length() > 0 && (newSelStart != candidatesEnd | ||||
|                 || newSelEnd != candidatesEnd)) { | ||||
|             mComposing.setLength(0); | ||||
|             updateCandidates(); | ||||
|             InputConnection ic = getCurrentInputConnection(); | ||||
|             if (ic != null) { | ||||
|                 ic.finishComposingText(); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * This tells us about completions that the editor has determined based | ||||
|      * on the current text in it.  We want to use this in fullscreen mode | ||||
|      * to show the completions ourself, since the editor can not be seen | ||||
|      * in that situation. | ||||
|      */ | ||||
|     @Override public void onDisplayCompletions(CompletionInfo[] completions) { | ||||
|         if (mCompletionOn) { | ||||
|             mCompletions = completions; | ||||
|             if (completions == null) { | ||||
|                 setSuggestions(null, false, false); | ||||
|                 return; | ||||
|             } | ||||
|              | ||||
|             List<String> stringList = new ArrayList<String>(); | ||||
|             for (int i = 0; i < completions.length; i++) { | ||||
|                 CompletionInfo ci = completions[i]; | ||||
|                 if (ci != null) stringList.add(ci.getText().toString()); | ||||
|             } | ||||
|             setSuggestions(stringList, true, true); | ||||
|         } | ||||
|     } | ||||
|      | ||||
|          | ||||
|     /** | ||||
|      * Use this to monitor key events being delivered to the application. | ||||
|      * We get first crack at them, and can either resume them or let them | ||||
|      * continue to the app. | ||||
|      */ | ||||
|     @Override public boolean onKeyDown(int keyCode, KeyEvent event) { | ||||
|         switch (keyCode) { | ||||
|             case KeyEvent.KEYCODE_BACK: | ||||
|                 // The InputMethodService already takes care of the back | ||||
|                 // key for us, to dismiss the input method if it is shown. | ||||
|                 // However, our keyboard could be showing a pop-up window | ||||
|                 // that back should dismiss, so we first allow it to do that. | ||||
|                 if (event.getRepeatCount() == 0 && mInputView != null) { | ||||
|                     if (mInputView.handleBack()) { | ||||
|                         return true; | ||||
|                     } | ||||
|                 } | ||||
|                 break; | ||||
|                  | ||||
|             case KeyEvent.KEYCODE_DEL: | ||||
|                 // Special handling of the delete key: if we currently are | ||||
|                 // composing text for the user, we want to modify that instead | ||||
|                 // of let the application to the delete itself. | ||||
|                 if (mComposing.length() > 0) { | ||||
|                     onKey(Keyboard.KEYCODE_DELETE, null); | ||||
|                     return true; | ||||
|                 } | ||||
|                 break; | ||||
|                  | ||||
|             case KeyEvent.KEYCODE_ENTER: | ||||
|                 // Let the underlying text editor always handle these. | ||||
|                 return false; | ||||
|                  | ||||
|             default: | ||||
|                  | ||||
|         } | ||||
|          | ||||
|         return super.onKeyDown(keyCode, event); | ||||
|     } | ||||
|  | ||||
|  | ||||
|     /** | ||||
|      * Helper function to commit any text being composed in to the editor. | ||||
|      */ | ||||
|     private void commitTyped(InputConnection inputConnection) { | ||||
|         if (mComposing.length() > 0) { | ||||
|             inputConnection.commitText(mComposing, mComposing.length()); | ||||
|             mComposing.setLength(0); | ||||
|             updateCandidates(); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Helper to update the shift state of our keyboard based on the initial | ||||
|      * editor state. | ||||
|      */ | ||||
|     private void updateShiftKeyState(EditorInfo attr) { | ||||
|         if (attr != null  | ||||
|                 && mInputView != null && mQwertyKeyboard == mInputView.getKeyboard()) { | ||||
|             int caps = 0; | ||||
|             EditorInfo ei = getCurrentInputEditorInfo(); | ||||
|             if (ei != null && ei.inputType != InputType.TYPE_NULL) { | ||||
|                 caps = getCurrentInputConnection().getCursorCapsMode(attr.inputType); | ||||
|             } | ||||
|             mInputView.setShifted(mCapsLock || caps != 0); | ||||
|         } | ||||
|     } | ||||
|      | ||||
|     /** | ||||
|      * Helper to determine if a given character code is alphabetic. | ||||
|      */ | ||||
|     private boolean isAlphabet(int code) { | ||||
|         if (Character.isLetter(code)) { | ||||
|             return true; | ||||
|         } else { | ||||
|             return false; | ||||
|         } | ||||
|     } | ||||
|      | ||||
|     /** | ||||
|      * Helper to send a key down / key up pair to the current editor. | ||||
|      */ | ||||
|     private void keyDownUp(int keyEventCode) { | ||||
|         getCurrentInputConnection().sendKeyEvent( | ||||
|                 new KeyEvent(KeyEvent.ACTION_DOWN, keyEventCode)); | ||||
|         getCurrentInputConnection().sendKeyEvent( | ||||
|                 new KeyEvent(KeyEvent.ACTION_UP, keyEventCode)); | ||||
|     } | ||||
|      | ||||
|     /** | ||||
|      * Helper to send a character to the editor as raw key events. | ||||
|      */ | ||||
|     private void sendKey(int keyCode) { | ||||
|         switch (keyCode) { | ||||
|             case '\n': | ||||
|                 keyDownUp(KeyEvent.KEYCODE_ENTER); | ||||
|                 break; | ||||
|             default: | ||||
|                 if (keyCode >= '0' && keyCode <= '9') { | ||||
|                     keyDownUp(keyCode - '0' + KeyEvent.KEYCODE_0); | ||||
|                 } else { | ||||
|                     getCurrentInputConnection().commitText(String.valueOf((char) keyCode), 1); | ||||
|                 } | ||||
|                 break; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     // Implementation of KeyboardViewListener | ||||
|  | ||||
|     public void onKey(int primaryCode, int[] keyCodes) { | ||||
|         if (isWordSeparator(primaryCode)) { | ||||
|             // Handle separator | ||||
|             if (mComposing.length() > 0) { | ||||
|                 commitTyped(getCurrentInputConnection()); | ||||
|             } | ||||
|             sendKey(primaryCode); | ||||
|             updateShiftKeyState(getCurrentInputEditorInfo()); | ||||
|         } else if (primaryCode == Keyboard.KEYCODE_DELETE) { | ||||
|             handleBackspace(); | ||||
|         } else if (primaryCode == Keyboard.KEYCODE_SHIFT) { | ||||
|             handleShift(); | ||||
|         } else if (primaryCode == Keyboard.KEYCODE_CANCEL) { | ||||
|             handleClose(); | ||||
|             return; | ||||
|         } else 	if (primaryCode == LatinKeyboardView.KEYCODE_KP2A) { | ||||
|             AlertDialog.Builder builder = new AlertDialog.Builder(this); | ||||
|             final CharSequence[] items = {"Gallery Image Menu!", "hello你好", "View pattern", "Delete pattern", "Locate pattern in list view", "Row Counter (with pattern)", "Share Pattern", "Share Image"}; | ||||
|             builder.setTitle("Keepass2Android"); | ||||
|             //builder.setMessage("What do you want to type securely?"); | ||||
|             builder.setItems(items, new DialogInterface.OnClickListener() { | ||||
|                 public void onClick(DialogInterface dialog, int item) { | ||||
|  | ||||
|                 	getCurrentInputConnection().commitText(items[item],0); | ||||
|  | ||||
|                     if (item == 0){ | ||||
|                     } | ||||
|  | ||||
|                 } | ||||
|             }); | ||||
|          // Add the buttons | ||||
|             builder.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() { | ||||
|                        public void onClick(DialogInterface dialog, int id) { | ||||
|                            // User cancelled the dialog | ||||
|                        } | ||||
|                    }); | ||||
|             // Set other dialog properties | ||||
|  | ||||
|             // Create the AlertDialog | ||||
|             AlertDialog dialog = builder.create(); | ||||
|             Window window = dialog.getWindow();  | ||||
|             WindowManager.LayoutParams lp = window.getAttributes(); | ||||
|             lp.token = mInputView.getWindowToken(); | ||||
|             lp.type = WindowManager.LayoutParams.TYPE_APPLICATION_ATTACHED_DIALOG; | ||||
|             window.setAttributes(lp); | ||||
|             window.addFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM); | ||||
|      | ||||
|             dialog.show(); | ||||
|         } else 	if (primaryCode == LatinKeyboardView.KEYCODE_OPTIONS) { | ||||
|             // Show a menu or somethin' | ||||
|         } else if (primaryCode == Keyboard.KEYCODE_MODE_CHANGE | ||||
|                 && mInputView != null) { | ||||
|             Keyboard current = mInputView.getKeyboard(); | ||||
|             if (current == mSymbolsKeyboard || current == mSymbolsShiftedKeyboard) { | ||||
|                 current = mQwertyKeyboard; | ||||
|             } else { | ||||
|                 current = mSymbolsKeyboard; | ||||
|             } | ||||
|             mInputView.setKeyboard(current); | ||||
|             if (current == mSymbolsKeyboard) { | ||||
|                 current.setShifted(false); | ||||
|             } | ||||
|         } else { | ||||
|             handleCharacter(primaryCode, keyCodes); | ||||
|             //mCapsLock = false; | ||||
|             //mInputView.setShifted(mCapsLock); | ||||
|             updateShiftKeyState(getCurrentInputEditorInfo()); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public void onText(CharSequence text) { | ||||
|         InputConnection ic = getCurrentInputConnection(); | ||||
|         if (ic == null) return; | ||||
|         ic.beginBatchEdit(); | ||||
|         if (mComposing.length() > 0) { | ||||
|             commitTyped(ic); | ||||
|         } | ||||
|         ic.commitText(text, 0); | ||||
|         ic.endBatchEdit(); | ||||
|         updateShiftKeyState(getCurrentInputEditorInfo()); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Update the list of available candidates from the current composing | ||||
|      * text.  This will need to be filled in by however you are determining | ||||
|      * candidates. | ||||
|      */ | ||||
|     private void updateCandidates() { | ||||
|         if (!mCompletionOn) { | ||||
|             if (mComposing.length() > 0) { | ||||
|                 ArrayList<String> list = new ArrayList<String>(); | ||||
|                 list.add(mComposing.toString()); | ||||
|                 setSuggestions(list, true, true); | ||||
|             } else { | ||||
|                 setSuggestions(null, false, false); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|      | ||||
|     public void setSuggestions(List<String> suggestions, boolean completions, | ||||
|             boolean typedWordValid) { | ||||
|         if (suggestions != null && suggestions.size() > 0) { | ||||
|             setCandidatesViewShown(true); | ||||
|         } else if (isExtractViewShown()) { | ||||
|             setCandidatesViewShown(true); | ||||
|         } | ||||
|         if (mCandidateView != null) { | ||||
|             mCandidateView.setSuggestions(suggestions, completions, typedWordValid); | ||||
|         } | ||||
|     } | ||||
|      | ||||
|     private void handleBackspace() { | ||||
|         final int length = mComposing.length(); | ||||
|         if (length > 1) { | ||||
|             mComposing.delete(length - 1, length); | ||||
|             getCurrentInputConnection().setComposingText(mComposing, 1); | ||||
|             updateCandidates(); | ||||
|         } else if (length > 0) { | ||||
|             mComposing.setLength(0); | ||||
|             getCurrentInputConnection().commitText("", 0); | ||||
|             updateCandidates(); | ||||
|         } else { | ||||
|             keyDownUp(KeyEvent.KEYCODE_DEL); | ||||
|         } | ||||
|         updateShiftKeyState(getCurrentInputEditorInfo()); | ||||
|     } | ||||
|  | ||||
|     private void handleShift() { | ||||
|         if (mInputView == null) { | ||||
|             return; | ||||
|         } | ||||
|          | ||||
|         Keyboard currentKeyboard = mInputView.getKeyboard(); | ||||
|         if (mQwertyKeyboard == currentKeyboard) { | ||||
|             // Alphabet keyboard | ||||
|         	checkToggleCapsLock();         | ||||
|         	mInputView.setShifted(mCapsLock || !mInputView.isShifted());     | ||||
|                      | ||||
|  | ||||
|         } else if (currentKeyboard == mSymbolsKeyboard) { | ||||
|             mSymbolsKeyboard.setShifted(true); | ||||
|             mInputView.setKeyboard(mSymbolsShiftedKeyboard); | ||||
|             mSymbolsShiftedKeyboard.setShifted(true); | ||||
|         } else if (currentKeyboard == mSymbolsShiftedKeyboard) { | ||||
|             mSymbolsShiftedKeyboard.setShifted(false); | ||||
|             mInputView.setKeyboard(mSymbolsKeyboard); | ||||
|             mSymbolsKeyboard.setShifted(false); | ||||
|         } | ||||
|     } | ||||
|      | ||||
|     private void handleCharacter(int primaryCode, int[] keyCodes) { | ||||
|         if (isInputViewShown()) { | ||||
|             if (mInputView.isShifted()) { | ||||
|                 primaryCode = Character.toUpperCase(primaryCode); | ||||
|             } | ||||
|         } | ||||
|         if (isAlphabet(primaryCode) && mPredictionOn) { | ||||
|             mComposing.append((char) primaryCode); | ||||
|             getCurrentInputConnection().setComposingText(mComposing, 1); | ||||
|             updateShiftKeyState(getCurrentInputEditorInfo()); | ||||
|             updateCandidates(); | ||||
|         } else { | ||||
|             getCurrentInputConnection().commitText( | ||||
|                     String.valueOf((char) primaryCode), 1); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private void handleClose() { | ||||
|         commitTyped(getCurrentInputConnection()); | ||||
|         requestHideSelf(0); | ||||
|         mInputView.closing(); | ||||
|     } | ||||
|  | ||||
|     private void checkToggleCapsLock() { | ||||
|         long now = System.currentTimeMillis(); | ||||
|         if (mLastShiftTime + 800 > now) { | ||||
|             mCapsLock = !mCapsLock; | ||||
|             mLastShiftTime = 0; | ||||
|         } else { | ||||
|             mLastShiftTime = now; | ||||
|         } | ||||
|     } | ||||
|      | ||||
|     private String getWordSeparators() { | ||||
|         return mWordSeparators; | ||||
|     } | ||||
|      | ||||
|     public boolean isWordSeparator(int code) { | ||||
|         String separators = getWordSeparators(); | ||||
|         return separators.contains(String.valueOf((char)code)); | ||||
|     } | ||||
|  | ||||
|     public void pickDefaultCandidate() { | ||||
|         pickSuggestionManually(0); | ||||
|     } | ||||
|      | ||||
|     public void pickSuggestionManually(int index) { | ||||
|         if (mCompletionOn && mCompletions != null && index >= 0 | ||||
|                 && index < mCompletions.length) { | ||||
|             CompletionInfo ci = mCompletions[index]; | ||||
|             getCurrentInputConnection().commitCompletion(ci); | ||||
|             if (mCandidateView != null) { | ||||
|                 mCandidateView.clear(); | ||||
|             } | ||||
|             updateShiftKeyState(getCurrentInputEditorInfo()); | ||||
|         } else if (mComposing.length() > 0) { | ||||
|             // If we were generating candidate suggestions for the current | ||||
|             // text, we would commit one of them here.  But for this sample, | ||||
|             // we will just commit the current text. | ||||
|             commitTyped(getCurrentInputConnection()); | ||||
|         } | ||||
|     } | ||||
|      | ||||
|     public void swipeRight() { | ||||
|         if (mCompletionOn) { | ||||
|             pickDefaultCandidate(); | ||||
|         } | ||||
|     } | ||||
|      | ||||
|     public void swipeLeft() { | ||||
|         handleBackspace(); | ||||
|     } | ||||
|  | ||||
|     public void swipeDown() { | ||||
|         handleClose(); | ||||
|     } | ||||
|  | ||||
|     public void swipeUp() { | ||||
|     } | ||||
|      | ||||
|     public void onPress(int primaryCode) { | ||||
|     } | ||||
|      | ||||
|     public void onRelease(int primaryCode) { | ||||
|     } | ||||
| } | ||||
| @@ -0,0 +1,112 @@ | ||||
| /* | ||||
|  * Copyright (C) 2008-2009 The Android Open Source Project | ||||
|  * | ||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|  * you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  * | ||||
|  *      http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  * | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, | ||||
|  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|  * See the License for the specific language governing permissions and | ||||
|  * limitations under the License. | ||||
|  */ | ||||
|  | ||||
| package keepass2android.softkeyboard; | ||||
|  | ||||
| import keepass2android.softkeyboard.R; | ||||
|  | ||||
| import android.content.Context; | ||||
| import android.content.res.Resources; | ||||
| import android.content.res.XmlResourceParser; | ||||
| import android.graphics.drawable.Drawable; | ||||
| import android.inputmethodservice.Keyboard; | ||||
| import android.view.inputmethod.EditorInfo; | ||||
|  | ||||
| public class LatinKeyboard extends Keyboard { | ||||
|  | ||||
|     private Key mEnterKey; | ||||
|     private Key mSpaceKey; | ||||
|      | ||||
|     public LatinKeyboard(Context context, int xmlLayoutResId) { | ||||
|         super(context, xmlLayoutResId); | ||||
|     } | ||||
|  | ||||
|     public LatinKeyboard(Context context, int layoutTemplateResId,  | ||||
|             CharSequence characters, int columns, int horizontalPadding) { | ||||
|         super(context, layoutTemplateResId, characters, columns, horizontalPadding); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     protected Key createKeyFromXml(Resources res, Row parent, int x, int y,  | ||||
|             XmlResourceParser parser) { | ||||
|         Key key = new LatinKey(res, parent, x, y, parser); | ||||
|         if (key.codes[0] == 10) { | ||||
|             mEnterKey = key; | ||||
|         } else if (key.codes[0] == ' ') { | ||||
|             mSpaceKey = key; | ||||
|         } | ||||
|         return key; | ||||
|     } | ||||
|      | ||||
|     /** | ||||
|      * This looks at the ime options given by the current editor, to set the | ||||
|      * appropriate label on the keyboard's enter key (if it has one). | ||||
|      */ | ||||
|     void setImeOptions(Resources res, int options) { | ||||
|         if (mEnterKey == null) { | ||||
|             return; | ||||
|         } | ||||
|          | ||||
|         switch (options&(EditorInfo.IME_MASK_ACTION|EditorInfo.IME_FLAG_NO_ENTER_ACTION)) { | ||||
|             case EditorInfo.IME_ACTION_GO: | ||||
|                 mEnterKey.iconPreview = null; | ||||
|                 mEnterKey.icon = null; | ||||
|                 mEnterKey.label = res.getText(R.string.label_go_key); | ||||
|                 break; | ||||
|             case EditorInfo.IME_ACTION_NEXT: | ||||
|                 mEnterKey.iconPreview = null; | ||||
|                 mEnterKey.icon = null; | ||||
|                 mEnterKey.label = res.getText(R.string.label_next_key); | ||||
|                 break; | ||||
|             case EditorInfo.IME_ACTION_SEARCH: | ||||
|                 mEnterKey.icon = res.getDrawable(R.drawable.sym_keyboard_search); | ||||
|                 mEnterKey.label = null; | ||||
|                 break; | ||||
|             case EditorInfo.IME_ACTION_SEND: | ||||
|                 mEnterKey.iconPreview = null; | ||||
|                 mEnterKey.icon = null; | ||||
|                 mEnterKey.label = res.getText(R.string.label_send_key); | ||||
|                 break; | ||||
|             default: | ||||
|                 mEnterKey.icon = res.getDrawable(R.drawable.sym_keyboard_return); | ||||
|                 mEnterKey.label = null; | ||||
|                 break; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     void setSpaceIcon(final Drawable icon) { | ||||
|         if (mSpaceKey != null) { | ||||
|             mSpaceKey.icon = icon; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     static class LatinKey extends Keyboard.Key { | ||||
|          | ||||
|         public LatinKey(Resources res, Keyboard.Row parent, int x, int y, XmlResourceParser parser) { | ||||
|             super(res, parent, x, y, parser); | ||||
|         } | ||||
|          | ||||
|         /** | ||||
|          * Overriding this method so that we can reduce the target area for the key that | ||||
|          * closes the keyboard.  | ||||
|          */ | ||||
|         @Override | ||||
|         public boolean isInside(int x, int y) { | ||||
|             return super.isInside(x, codes[0] == KEYCODE_CANCEL ? y - 10 : y); | ||||
|         } | ||||
|     } | ||||
|  | ||||
| } | ||||
| @@ -0,0 +1,54 @@ | ||||
| /* | ||||
|  * Copyright (C) 2008-2009 The Android Open Source Project | ||||
|  * | ||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|  * you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  * | ||||
|  *      http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  * | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, | ||||
|  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|  * See the License for the specific language governing permissions and | ||||
|  * limitations under the License. | ||||
|  */ | ||||
|  | ||||
| package keepass2android.softkeyboard; | ||||
|  | ||||
| import android.content.Context; | ||||
| import android.inputmethodservice.Keyboard; | ||||
| import android.inputmethodservice.Keyboard.Key; | ||||
| import android.inputmethodservice.KeyboardView; | ||||
| import android.util.AttributeSet; | ||||
| import android.view.inputmethod.InputMethodSubtype; | ||||
|  | ||||
| public class LatinKeyboardView extends KeyboardView { | ||||
|  | ||||
|     static final int KEYCODE_OPTIONS = -100; | ||||
|     static final int KEYCODE_KP2A = -101; | ||||
|  | ||||
|     public LatinKeyboardView(Context context, AttributeSet attrs) { | ||||
|         super(context, attrs); | ||||
|     } | ||||
|  | ||||
|     public LatinKeyboardView(Context context, AttributeSet attrs, int defStyle) { | ||||
|         super(context, attrs, defStyle); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     protected boolean onLongPress(Key key) { | ||||
|         if (key.codes[0] == Keyboard.KEYCODE_CANCEL) { | ||||
|             getOnKeyboardActionListener().onKey(KEYCODE_OPTIONS, null); | ||||
|             return true; | ||||
|         } else { | ||||
|             return super.onLongPress(key); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     void setSubtypeOnSpaceKey(final InputMethodSubtype subtype) { | ||||
|         //final LatinKeyboard keyboard = (LatinKeyboard)getKeyboard(); | ||||
|         //keyboard.setSpaceIcon(getResources().getDrawable(subtype.getIconResId())); | ||||
|         //invalidateAllKeys(); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										8
									
								
								src/java/kbbridge/.classpath
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,8 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <classpath> | ||||
| 	<classpathentry kind="src" path="src"/> | ||||
| 	<classpathentry kind="src" path="gen"/> | ||||
| 	<classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/> | ||||
| 	<classpathentry kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/> | ||||
| 	<classpathentry kind="output" path="bin/classes"/> | ||||
| </classpath> | ||||
							
								
								
									
										33
									
								
								src/java/kbbridge/.project
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,33 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <projectDescription> | ||||
| 	<name>KP2ASoftKeyboardBridge</name> | ||||
| 	<comment></comment> | ||||
| 	<projects> | ||||
| 	</projects> | ||||
| 	<buildSpec> | ||||
| 		<buildCommand> | ||||
| 			<name>com.android.ide.eclipse.adt.ResourceManagerBuilder</name> | ||||
| 			<arguments> | ||||
| 			</arguments> | ||||
| 		</buildCommand> | ||||
| 		<buildCommand> | ||||
| 			<name>com.android.ide.eclipse.adt.PreCompilerBuilder</name> | ||||
| 			<arguments> | ||||
| 			</arguments> | ||||
| 		</buildCommand> | ||||
| 		<buildCommand> | ||||
| 			<name>org.eclipse.jdt.core.javabuilder</name> | ||||
| 			<arguments> | ||||
| 			</arguments> | ||||
| 		</buildCommand> | ||||
| 		<buildCommand> | ||||
| 			<name>com.android.ide.eclipse.adt.ApkBuilder</name> | ||||
| 			<arguments> | ||||
| 			</arguments> | ||||
| 		</buildCommand> | ||||
| 	</buildSpec> | ||||
| 	<natures> | ||||
| 		<nature>com.android.ide.eclipse.adt.AndroidNature</nature> | ||||
| 		<nature>org.eclipse.jdt.core.javanature</nature> | ||||
| 	</natures> | ||||
| </projectDescription> | ||||
							
								
								
									
										17
									
								
								src/java/kbbridge/AndroidManifest.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,17 @@ | ||||
| <manifest xmlns:android="http://schemas.android.com/apk/res/android" | ||||
|     package="keepass2android.kbbridge" | ||||
|     android:versionCode="1" | ||||
|     android:versionName="1.0" > | ||||
|  | ||||
|     <uses-sdk | ||||
|         android:minSdkVersion="8" | ||||
|         android:targetSdkVersion="17" /> | ||||
|  | ||||
|     <application | ||||
|         android:allowBackup="true" | ||||
|         android:icon="@drawable/ic_launcher" | ||||
|         android:label="@string/app_name" | ||||
|         android:theme="@style/AppTheme" > | ||||
|     </application> | ||||
|  | ||||
| </manifest> | ||||
| @@ -0,0 +1,6 @@ | ||||
| /** Automatically generated file. DO NOT MODIFY */ | ||||
| package keepass2android.kbbridge; | ||||
|  | ||||
| public final class BuildConfig { | ||||
|     public final static boolean DEBUG = true; | ||||
| } | ||||
							
								
								
									
										47
									
								
								src/java/kbbridge/gen/keepass2android/kbbridge/R.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,47 @@ | ||||
| /* AUTO-GENERATED FILE.  DO NOT MODIFY. | ||||
|  * | ||||
|  * This class was automatically generated by the | ||||
|  * aapt tool from the resource data it found.  It | ||||
|  * should not be modified by hand. | ||||
|  */ | ||||
|  | ||||
| package keepass2android.kbbridge; | ||||
|  | ||||
| public final class R { | ||||
|     public static final class attr { | ||||
|     } | ||||
|     public static final class drawable { | ||||
|         public static int ic_launcher=0x7f020000; | ||||
|     } | ||||
|     public static final class string { | ||||
|         public static int app_name=0x7f030000; | ||||
|     } | ||||
|     public static final class style { | ||||
|         /**  | ||||
|         Base application theme, dependent on API level. This theme is replaced | ||||
|         by AppBaseTheme from res/values-vXX/styles.xml on newer devices. | ||||
|      | ||||
|  | ||||
|             Theme customizations available in newer API levels can go in | ||||
|             res/values-vXX/styles.xml, while customizations related to | ||||
|             backward-compatibility can go here. | ||||
|          | ||||
|  | ||||
|         Base application theme for API 11+. This theme completely replaces | ||||
|         AppBaseTheme from res/values/styles.xml on API 11+ devices. | ||||
|      | ||||
|  API 11 theme customizations can go here.  | ||||
|  | ||||
|         Base application theme for API 14+. This theme completely replaces | ||||
|         AppBaseTheme from BOTH res/values/styles.xml and | ||||
|         res/values-v11/styles.xml on API 14+ devices. | ||||
|      | ||||
|  API 14 theme customizations can go here.  | ||||
|          */ | ||||
|         public static int AppBaseTheme=0x7f040000; | ||||
|         /**  Application theme.  | ||||
|  All customizations that are NOT specific to a particular API-level can go here.  | ||||
|          */ | ||||
|         public static int AppTheme=0x7f040001; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										20
									
								
								src/java/kbbridge/proguard-project.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,20 @@ | ||||
| # 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 *; | ||||
| #} | ||||
							
								
								
									
										15
									
								
								src/java/kbbridge/project.properties
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,15 @@ | ||||
| # 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-14 | ||||
| android.library=true | ||||
							
								
								
									
										5
									
								
								src/java/kbbridge/res/values/strings.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,5 @@ | ||||
| <resources> | ||||
|  | ||||
|     <string name="app_name">KP2ASoftKeyboardBridge</string> | ||||
|  | ||||
| </resources> | ||||
							
								
								
									
										20
									
								
								src/java/kbbridge/res/values/styles.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,20 @@ | ||||
| <resources> | ||||
|  | ||||
|     <!-- | ||||
|         Base application theme, dependent on API level. This theme is replaced | ||||
|         by AppBaseTheme from res/values-vXX/styles.xml on newer devices. | ||||
|     --> | ||||
|     <style name="AppBaseTheme" parent="android:Theme.Light"> | ||||
|         <!-- | ||||
|             Theme customizations available in newer API levels can go in | ||||
|             res/values-vXX/styles.xml, while customizations related to | ||||
|             backward-compatibility can go here. | ||||
|         --> | ||||
|     </style> | ||||
|  | ||||
|     <!-- Application theme. --> | ||||
|     <style name="AppTheme" parent="AppBaseTheme"> | ||||
|         <!-- All customizations that are NOT specific to a particular API-level can go here. --> | ||||
|     </style> | ||||
|  | ||||
| </resources> | ||||
| @@ -0,0 +1,6 @@ | ||||
|  | ||||
| package keepass2android.kbbridge; | ||||
| import java.util.HashMap; | ||||
| public class KeyboardData { | ||||
| 	 public static HashMap<String, String> availableFields = new HashMap<String, String>(); | ||||
| } | ||||
| @@ -0,0 +1,15 @@ | ||||
| package keepass2android.kbbridge; | ||||
| import java.util.HashMap; | ||||
| public class KeyboardDataBuilder { | ||||
| 	 private HashMap<String, String> availableFields = new HashMap<String, String>(); | ||||
| 	  | ||||
| 	 public void addPair(String displayName, String valueToType) | ||||
| 	 { | ||||
| 		 availableFields.put(displayName, valueToType); | ||||
| 	 } | ||||
| 	  | ||||
| 	 public void commit() | ||||
| 	 { | ||||
| 	 	KeyboardData.availableFields = this.availableFields; | ||||
| 	 } | ||||
| } | ||||
 PhilippC
					PhilippC