try to introduce an activity as dialog for string selection, not yet working
This commit is contained in:
		| @@ -17,6 +17,7 @@ | ||||
| package keepass2android.softkeyboard; | ||||
|  | ||||
| import android.app.AlertDialog; | ||||
| import android.content.ActivityNotFoundException; | ||||
| import android.content.BroadcastReceiver; | ||||
| import android.content.Context; | ||||
| import android.content.DialogInterface; | ||||
| @@ -27,21 +28,26 @@ import android.content.SharedPreferences.Editor; | ||||
| import android.content.res.Configuration; | ||||
| import android.content.res.Resources; | ||||
| import android.content.res.XmlResourceParser; | ||||
| import android.graphics.drawable.BitmapDrawable; | ||||
| import android.inputmethodservice.InputMethodService; | ||||
| import android.inputmethodservice.Keyboard; | ||||
| import android.media.AudioManager; | ||||
| import android.net.Uri; | ||||
| import android.os.Build; | ||||
| import android.os.Debug; | ||||
| import android.os.Handler; | ||||
| import android.os.Message; | ||||
| import android.os.SystemClock; | ||||
| import android.preference.PreferenceActivity; | ||||
| import android.preference.PreferenceManager; | ||||
| import android.provider.Settings; | ||||
| import android.text.ClipboardManager; | ||||
| import android.text.TextUtils; | ||||
| import android.util.DisplayMetrics; | ||||
| import android.util.Log; | ||||
| import android.util.PrintWriterPrinter; | ||||
| import android.util.Printer; | ||||
| import android.view.Gravity; | ||||
| import android.view.HapticFeedbackConstants; | ||||
| import android.view.KeyEvent; | ||||
| import android.view.View; | ||||
| @@ -54,6 +60,7 @@ import android.view.inputmethod.ExtractedTextRequest; | ||||
| import android.view.inputmethod.InputConnection; | ||||
| import android.view.inputmethod.InputMethodManager; | ||||
| import android.widget.LinearLayout; | ||||
| import android.widget.PopupWindow; | ||||
|  | ||||
| import keepass2android.kbbridge.StringForTyping; | ||||
| import keepass2android.softkeyboard.LatinIMEUtil.RingCharBuffer; | ||||
| @@ -70,12 +77,21 @@ import java.util.List; | ||||
| import java.util.Locale; | ||||
| import java.util.Map; | ||||
|  | ||||
| interface IKeyboardService | ||||
| { | ||||
|     void commitStringForTyping(StringForTyping stringForTyping); | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * Input method implementation for Qwerty'ish keyboard. | ||||
|  */ | ||||
| public class KP2AKeyboard extends InputMethodService | ||||
|         implements LatinKeyboardBaseView.OnKeyboardActionListener, | ||||
|         IKeyboardService, | ||||
|         SharedPreferences.OnSharedPreferenceChangeListener { | ||||
|  | ||||
|     public static IKeyboardService CurrentlyRunningService; | ||||
|  | ||||
|     private static String get_KEEPASS2ANDROID_KEYBOARD_CLEARED(Context ctx) | ||||
|     { | ||||
|     	return ctx.getPackageName()+".keyboard_cleared"; | ||||
| @@ -311,6 +327,7 @@ public class KP2AKeyboard extends InputMethodService | ||||
|  | ||||
|     @Override | ||||
|     public void onCreate() { | ||||
|         CurrentlyRunningService = this; | ||||
|         LatinImeLogger.init(this); | ||||
|         KeyboardSwitcher.init(this); | ||||
|         super.onCreate(); | ||||
| @@ -330,6 +347,8 @@ public class KP2AKeyboard extends InputMethodService | ||||
|         } | ||||
|         mReCorrectionEnabled = prefs.getBoolean(PREF_RECORRECTION_ENABLED, | ||||
|                 getResources().getBoolean(R.bool.default_recorrection_enabled)); | ||||
|  | ||||
|  | ||||
|          | ||||
|         Log.d("KP2AK","finding plugin dicts..."); | ||||
|         PluginManager.getPluginDictionaries(getApplicationContext()); | ||||
| @@ -358,7 +377,7 @@ public class KP2AKeyboard extends InputMethodService | ||||
|  | ||||
|         // register to receive ringer mode changes for silent mode | ||||
|         IntentFilter filter = new IntentFilter(AudioManager.RINGER_MODE_CHANGED_ACTION); | ||||
|         registerReceiver(mReceiver, filter); | ||||
|         registerReceiver(mSilentModeReceiver, filter); | ||||
|         | ||||
|         prefs.registerOnSharedPreferenceChangeListener(this); | ||||
|          | ||||
| @@ -467,12 +486,14 @@ public class KP2AKeyboard extends InputMethodService | ||||
|         if (mContactsDictionary != null) { | ||||
|             mContactsDictionary.close(); | ||||
|         }*/ | ||||
|         unregisterReceiver(mReceiver); | ||||
|         unregisterReceiver(mSilentModeReceiver); | ||||
|         unregisterReceiver(mPluginManager);         | ||||
|         unregisterReceiver(mClearKeyboardReceiver); | ||||
|          | ||||
|         LatinImeLogger.commit(); | ||||
|         LatinImeLogger.onDestroy(); | ||||
|  | ||||
|         CurrentlyRunningService = null; | ||||
|         super.onDestroy(); | ||||
|     } | ||||
|  | ||||
| @@ -1376,132 +1397,28 @@ public class KP2AKeyboard extends InputMethodService | ||||
| 		setCandidatesViewShown(false);		 | ||||
| 	} | ||||
|  | ||||
|  | ||||
|  | ||||
|     private void openOverlaySettings() { | ||||
|         final Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, | ||||
|                 Uri.parse("package:" + getPackageName())); | ||||
|         try { | ||||
|             startActivity(intent); | ||||
|         } catch (ActivityNotFoundException e) { | ||||
|             Log.e(TAG, e.getMessage()); | ||||
|         } | ||||
|     } | ||||
|  | ||||
| 	private void showKp2aDialog() { | ||||
| 		AlertDialog.Builder builder = new AlertDialog.Builder(this); | ||||
| 		String title = "Keepass2Android"; | ||||
| 		List<StringForTyping> availableFields = keepass2android.kbbridge.KeyboardData.availableFields; | ||||
| 		 | ||||
| 		final EditorInfo attribute = getCurrentInputEditorInfo(); | ||||
| 		Log.d("KP2AK", "hint: "+attribute.hintText); | ||||
| 		Log.d("KP2AK", "field name: "+attribute.fieldName); | ||||
| 		Log.d("KP2AK", "label: "+attribute.label); | ||||
| 		attribute.dump(new Printer() { | ||||
| 			 | ||||
| 			@Override | ||||
| 			public void println(String x) { | ||||
| 				Log.d("KP2AK", x); | ||||
| 				 | ||||
| 			} | ||||
| 		},""); | ||||
| 		final ArrayList<StringForTyping> items = new ArrayList<StringForTyping>(); | ||||
| 		for (StringForTyping entry : availableFields)  | ||||
| 		{ | ||||
| 			Log.d("KP2AK", entry.displayName); | ||||
| 			items.add(entry.clone()); | ||||
| 		} | ||||
|         final EditorInfo attribute = getCurrentInputEditorInfo(); | ||||
|         final String clientPackageName = attribute.packageName; | ||||
|  | ||||
| 		 | ||||
| 		 | ||||
| 		StringForTyping openOrChangeEntry = new StringForTyping(); | ||||
| 		if (keepass2android.kbbridge.KeyboardData.entryName == null) | ||||
| 		{ | ||||
| 			openOrChangeEntry.displayName = openOrChangeEntry.key = getString(R.string.open_entry); | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			openOrChangeEntry.displayName = openOrChangeEntry.key = getString(R.string.change_entry); | ||||
| 		} | ||||
| 		openOrChangeEntry.value = "KP2ASPECIAL_SelectEntryTask"; | ||||
| 		items.add(openOrChangeEntry); | ||||
| 	 | ||||
| 		 | ||||
| 		final String clientPackageName = attribute.packageName; | ||||
|         Intent i = new Intent(this, Kp2aDialog.class); | ||||
|         i.putExtra("clientPackageName", clientPackageName); | ||||
|         startActivity(i); | ||||
|  | ||||
| 			if ((clientPackageName != null) && (clientPackageName != "")) | ||||
| 			{ | ||||
| 				StringForTyping searchEntry = new StringForTyping(); | ||||
| 				try | ||||
| 				{ | ||||
| 					searchEntry.key = searchEntry.displayName | ||||
| 						= getString(R.string.open_entry_for_app, new Object[]{clientPackageName}); | ||||
| 				} | ||||
| 				catch (java.util.FormatFlagsConversionMismatchException e) //buggy crowdin support for Arabic?  | ||||
| 				{ | ||||
| 		    		android.util.Log.e("KP2A", "Please report this error to crocoapps@gmail.com"); | ||||
| 		    		android.util.Log.e("KP2A", e.toString()); | ||||
|  | ||||
| 					searchEntry.key = searchEntry.displayName | ||||
| 							= "Search entry for app"; | ||||
| 				} | ||||
| 				 | ||||
| 				searchEntry.value = "KP2ASPECIAL_SearchUrlTask"; | ||||
| 				items.add(searchEntry); | ||||
| 			} | ||||
| 		 | ||||
| 		 | ||||
| 		builder.setTitle(title); | ||||
|  | ||||
| 		CharSequence[] itemNames = new CharSequence[items.size()]; | ||||
| 		int i=0; | ||||
| 		for (StringForTyping sft: items) | ||||
| 			itemNames[i++] = sft.displayName; | ||||
| 		 | ||||
| 		builder.setItems(itemNames, | ||||
| 				new DialogInterface.OnClickListener() { | ||||
| 					public void onClick(DialogInterface dialog, int item) { | ||||
|  | ||||
| 						Log.d("KP2AK", "clicked item: " + items.get(item).key); | ||||
| 						 | ||||
| 						if (items.get(item).value.startsWith("KP2ASPECIAL")) { | ||||
| 							//change entry | ||||
| 							Log.d("KP2AK", "clicked item: " + items.get(item).value); | ||||
|  | ||||
| 							String packageName = getApplicationContext().getPackageName(); | ||||
| 							Intent startKp2aIntent = getPackageManager().getLaunchIntentForPackage(packageName); | ||||
| 							if (startKp2aIntent != null) | ||||
| 							{ | ||||
| 								startKp2aIntent.addCategory(Intent.CATEGORY_LAUNCHER); | ||||
| 								startKp2aIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK |  Intent.FLAG_ACTIVITY_CLEAR_TASK); | ||||
| 								String value = items.get(item).value; | ||||
| 								String taskName = value.substring("KP2ASPECIAL_".length());  | ||||
| 								startKp2aIntent.putExtra("KP2A_APPTASK", taskName); | ||||
| 								if (taskName.equals("SearchUrlTask")) | ||||
| 								{ | ||||
| 									startKp2aIntent.putExtra("UrlToSearch", "androidapp://"+clientPackageName); | ||||
| 								} | ||||
| 								startActivity(startKp2aIntent); | ||||
| 							} else Log.w("KP2AK", "didn't find intent for "+packageName); | ||||
| 						} else { | ||||
| 							 | ||||
| 							StringForTyping theItem = items.get(item); | ||||
| 							 | ||||
| 							commitStringForTyping(theItem); | ||||
| 							 | ||||
| 						} | ||||
| 					} | ||||
|  | ||||
| 									}); | ||||
|  | ||||
| 		builder.setNegativeButton(android.R.string.cancel, | ||||
| 				new DialogInterface.OnClickListener() { | ||||
| 					public void onClick(DialogInterface dialog, int id) { | ||||
| 						// User cancelled the dialog | ||||
| 					} | ||||
| 				}); | ||||
|  | ||||
| 		// Create the AlertDialog | ||||
| 		AlertDialog dialog = builder.create(); | ||||
| 		Window window = dialog.getWindow(); | ||||
| 		WindowManager.LayoutParams lp = window.getAttributes(); | ||||
| 		LatinKeyboardView inputView = mKeyboardSwitcher.getInputView(); | ||||
| 		lp.token = inputView.getWindowToken(); | ||||
| 		lp.type = WindowManager.LayoutParams.TYPE_APPLICATION_ATTACHED_DIALOG; | ||||
| 		window.setAttributes(lp); | ||||
| 		window.addFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM); | ||||
|  | ||||
| 		dialog.show(); | ||||
| 	} | ||||
| 	private void commitStringForTyping(StringForTyping theItem) { | ||||
| 	public void commitStringForTyping(StringForTyping theItem) { | ||||
| 		 | ||||
| 		if ((mKp2aRememberAutoFill) && (!TextUtils.isEmpty(getCurrentInputEditorInfo().hintText))) | ||||
| 		{ | ||||
| @@ -2358,13 +2275,26 @@ public class KP2AKeyboard extends InputMethodService | ||||
|          | ||||
|      | ||||
|     // receive ringer mode changes to detect silent mode | ||||
|     private BroadcastReceiver mReceiver = new BroadcastReceiver() { | ||||
|     private BroadcastReceiver mSilentModeReceiver = new BroadcastReceiver() { | ||||
|         @Override | ||||
|         public void onReceive(Context context, Intent intent) { | ||||
|             updateRingerMode(); | ||||
|         } | ||||
|     }; | ||||
|  | ||||
|  | ||||
|     private BroadcastReceiver mCommitForTypingReceiver = new BroadcastReceiver() { | ||||
|         @Override | ||||
|         public void onReceive(Context context, Intent intent) { | ||||
|             StringForTyping stringForTyping = new StringForTyping(); | ||||
|             stringForTyping.key = intent.getStringExtra("key"); | ||||
|             stringForTyping.value = intent.getStringExtra("value"); | ||||
|  | ||||
|             KP2AKeyboard.this.commitStringForTyping(stringForTyping); | ||||
|  | ||||
|         } | ||||
|     }; | ||||
|  | ||||
|     // update flags for silent mode | ||||
|     private void updateRingerMode() { | ||||
|         if (mAudioManager == null) { | ||||
|   | ||||
| @@ -0,0 +1,130 @@ | ||||
| package keepass2android.softkeyboard; | ||||
|  | ||||
| import android.app.Activity; | ||||
| import android.content.Intent; | ||||
| import android.os.Bundle; | ||||
| import android.util.Log; | ||||
| import android.util.Printer; | ||||
| import android.view.View; | ||||
| import android.view.Window; | ||||
| import android.view.WindowManager; | ||||
| import android.view.inputmethod.EditorInfo; | ||||
| import android.widget.AdapterView; | ||||
| import android.widget.ArrayAdapter; | ||||
| import android.widget.ListView; | ||||
|  | ||||
| import java.util.ArrayList; | ||||
| import java.util.List; | ||||
|  | ||||
| import keepass2android.kbbridge.StringForTyping; | ||||
|  | ||||
| public class Kp2aDialog extends Activity { | ||||
|  | ||||
|     @Override | ||||
|     protected void onCreate(Bundle savedInstanceState) { | ||||
|         super.onCreate(savedInstanceState); | ||||
|         setContentView(R.layout.activity_kp2a_dialog); | ||||
|         ListView listview = ((ListView)findViewById(R.id.mylist)); | ||||
|         final String clientPackageName = getIntent().getStringExtra("clientPackageName"); | ||||
|  | ||||
|         List<StringForTyping> availableFields = keepass2android.kbbridge.KeyboardData.availableFields; | ||||
|  | ||||
|  | ||||
|  | ||||
|         final ArrayList<StringForTyping> items = new ArrayList<StringForTyping>(); | ||||
|         for (StringForTyping entry : availableFields) | ||||
|         { | ||||
|             items.add(entry.clone()); | ||||
|         } | ||||
|  | ||||
|  | ||||
|  | ||||
|         StringForTyping openOrChangeEntry = new StringForTyping(); | ||||
|         if (keepass2android.kbbridge.KeyboardData.entryName == null) | ||||
|         { | ||||
|             openOrChangeEntry.displayName = openOrChangeEntry.key = getString(R.string.open_entry); | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             openOrChangeEntry.displayName = openOrChangeEntry.key = getString(R.string.change_entry); | ||||
|         } | ||||
|         openOrChangeEntry.value = "KP2ASPECIAL_SelectEntryTask"; | ||||
|         items.add(openOrChangeEntry); | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|         if ((clientPackageName != null) && (clientPackageName != "")) | ||||
|         { | ||||
|             StringForTyping searchEntry = new StringForTyping(); | ||||
|             try | ||||
|             { | ||||
|                 searchEntry.key = searchEntry.displayName | ||||
|                         = getString(R.string.open_entry_for_app, new Object[]{clientPackageName}); | ||||
|             } | ||||
|             catch (java.util.FormatFlagsConversionMismatchException e) //buggy crowdin support for Arabic? | ||||
|             { | ||||
|                 android.util.Log.e("KP2A", "Please report this error to crocoapps@gmail.com"); | ||||
|                 android.util.Log.e("KP2A", e.toString()); | ||||
|  | ||||
|                 searchEntry.key = searchEntry.displayName | ||||
|                         = "Search entry for app"; | ||||
|             } | ||||
|  | ||||
|             searchEntry.value = "KP2ASPECIAL_SearchUrlTask"; | ||||
|             items.add(searchEntry); | ||||
|         } | ||||
|  | ||||
|  | ||||
|  | ||||
|         String[] itemNames = new String[items.size()]; | ||||
|         int i=0; | ||||
|         for (StringForTyping sft: items) | ||||
|             itemNames[i++] = sft.displayName; | ||||
|  | ||||
|         listview.setAdapter(new ArrayAdapter<String>(this, | ||||
|                 android.R.layout.simple_list_item_1, | ||||
|                 itemNames)); | ||||
|         listview.setClickable(true); | ||||
|         listview.setOnItemClickListener(new AdapterView.OnItemClickListener() { | ||||
|             @Override | ||||
|             public void onItemClick(AdapterView<?> adapterView, View view, int item, long l) { | ||||
|                 Log.d("KP2AK", "clicked item: " + items.get(item).key); | ||||
|  | ||||
|                 if (items.get(item).value.startsWith("KP2ASPECIAL")) { | ||||
|                     //change entry | ||||
|                     Log.d("KP2AK", "clicked item: " + items.get(item).value); | ||||
|  | ||||
|                     String packageName = getApplicationContext().getPackageName(); | ||||
|                     Intent startKp2aIntent = getPackageManager().getLaunchIntentForPackage(packageName); | ||||
|                     if (startKp2aIntent != null) | ||||
|                     { | ||||
|                         startKp2aIntent.addCategory(Intent.CATEGORY_LAUNCHER); | ||||
|                         startKp2aIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK |  Intent.FLAG_ACTIVITY_CLEAR_TASK); | ||||
|                         String value = items.get(item).value; | ||||
|                         String taskName = value.substring("KP2ASPECIAL_".length()); | ||||
|                         startKp2aIntent.putExtra("KP2A_APPTASK", taskName); | ||||
|                         if (taskName.equals("SearchUrlTask")) | ||||
|                         { | ||||
|                             startKp2aIntent.putExtra("UrlToSearch", "androidapp://"+clientPackageName); | ||||
|                         } | ||||
|                         startActivity(startKp2aIntent); | ||||
|                     } else Log.w("KP2AK", "didn't find intent for "+packageName); | ||||
|                 } else { | ||||
|  | ||||
|                     StringForTyping theItem = items.get(item); | ||||
|  | ||||
|                     KP2AKeyboard.CurrentlyRunningService.commitStringForTyping(theItem); | ||||
|  | ||||
|                 } | ||||
|             } | ||||
|         }); | ||||
|  | ||||
|         findViewById(R.id.button_cancel).setOnClickListener(new View.OnClickListener() { | ||||
|             @Override | ||||
|             public void onClick(View view) { | ||||
|                 Kp2aDialog.this.finish(); | ||||
|             } | ||||
|         }); | ||||
|     } | ||||
| } | ||||
| @@ -0,0 +1,35 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <RelativeLayout | ||||
|     xmlns:android="http://schemas.android.com/apk/res/android" | ||||
|     xmlns:tools="http://schemas.android.com/tools" | ||||
|     android:layout_width="fill_parent" | ||||
|     android:layout_height="fill_parent" | ||||
|     android:orientation="vertical" | ||||
|     android:padding="12dp"> | ||||
|  | ||||
|  | ||||
|  | ||||
|     <Button | ||||
|         android:id="@+id/button_cancel" | ||||
|         android:layout_width="wrap_content" | ||||
|         android:layout_height="wrap_content" | ||||
|         android:layout_alignParentBottom="true" | ||||
|         android:layout_alignParentRight="true" | ||||
|         android:layout_marginTop="19dp" | ||||
|         android:text="@string/cancel" /> | ||||
|  | ||||
|  | ||||
|     <ListView | ||||
|         android:id="@+id/mylist" | ||||
|         android:layout_above="@id/button_cancel" | ||||
|         android:layout_width="match_parent" | ||||
|         android:layout_height="wrap_content" | ||||
|         android:layout_alignParentStart="true" | ||||
|         android:layout_alignParentTop="true" | ||||
|         tools:context="keepass2android.softkeyboard.Kp2aDialog"> | ||||
|  | ||||
|  | ||||
|     </ListView> | ||||
|  | ||||
|  | ||||
| </RelativeLayout> | ||||
		Reference in New Issue
	
	Block a user
	 Philipp Crocoll
					Philipp Crocoll