Kaynağa Gözat

Refs #2
Special prompt for InputMethodService

isundil 7 yıl önce
ebeveyn
işleme
fbc327d0d9

+ 12 - 10
app/src/main/java/info/knacki/pass/input/InputService.java

@@ -19,14 +19,15 @@ import info.knacki.pass.R;
 import info.knacki.pass.git.GitInterface;
 import info.knacki.pass.io.FileInterfaceFactory;
 import info.knacki.pass.io.PathUtils;
+import info.knacki.pass.ui.MainActivity;
 import info.knacki.pass.ui.passwordList.PasswordClickListener;
 import info.knacki.pass.ui.passwordList.PasswordListView;
-import info.knacki.pass.ui.MainActivity;
-import info.knacki.pass.ui.PasswordPicker;
+import info.knacki.pass.ui.passwordPicker.ServicePasswordPicker;
 
 public class InputService extends InputMethodService implements PasswordClickListener {
     protected PasswordListView fPasswordListView;
     private static final Logger log = Logger.getLogger(InputService.class.getName());
+    protected View fInputView;
 
     @Override
     public void onStartInputView(EditorInfo info, boolean restarting) {
@@ -36,12 +37,13 @@ public class InputService extends InputMethodService implements PasswordClickLis
         }
     }
 
+    @SuppressLint("InflateParams")
     @Override
     public View onCreateInputView() {
-        @SuppressLint("InflateParams") View view = LayoutInflater.from(this).inflate(R.layout.input, null, false);
+        fInputView = LayoutInflater.from(this).inflate(R.layout.input, null, false);
         fPasswordListView = new PasswordListView<>(this, PathUtils.GetPassDir(this));
-        ((ScrollView)view.findViewById(R.id.passwordListContainer)).addView(fPasswordListView);
-        view.findViewById(R.id.prevButton).setOnClickListener(new View.OnClickListener() {
+        ((ScrollView)fInputView.findViewById(R.id.passwordListContainer)).addView(fPasswordListView);
+        fInputView.findViewById(R.id.prevButton).setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View view) {
                 InputMethodManager service = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
@@ -53,18 +55,18 @@ public class InputService extends InputMethodService implements PasswordClickLis
                 service.showInputMethodPicker();
             }
         });
-        view.findViewById(R.id.openAppButton).setOnClickListener(new View.OnClickListener() {
+        fInputView.findViewById(R.id.openAppButton).setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View view) {
                 startActivity(new Intent(InputService.this, MainActivity.class));
             }
         });
-        return view;
+        return fInputView;
     }
 
     @Override
     public void OnPasswordClicked(File f) {
-        FileInterfaceFactory.GetFileInterface(this, new PasswordPicker(this), f).ReadFile(new GitInterface.OnResponseListener<String>() {
+        FileInterfaceFactory.GetFileInterface(this, new ServicePasswordPicker(this, fInputView), f).ReadFile(new GitInterface.OnResponseListener<String>() {
             @Override
             public void onResponse(String passwordContent) {
                 for (char i: passwordContent.toCharArray()) {
@@ -74,8 +76,8 @@ public class InputService extends InputMethodService implements PasswordClickLis
 
             @Override
             public void onError(String msg, Throwable e) {
-                Toast.makeText(InputService.this, "Error: " +e.getMessage(), Toast.LENGTH_LONG).show();
-                log.log(Level.SEVERE, e.getMessage(), e);
+                Toast.makeText(InputService.this, "Error: " + msg, Toast.LENGTH_LONG).show();
+                log.log(Level.SEVERE, msg, e);
             }
         });
         onFinishInput();

+ 1 - 0
app/src/main/java/info/knacki/pass/ui/EditPasswordActivity.java

@@ -17,6 +17,7 @@ import java.util.logging.Logger;
 import info.knacki.pass.R;
 import info.knacki.pass.git.GitInterface;
 import info.knacki.pass.io.FileInterfaceFactory;
+import info.knacki.pass.ui.passwordPicker.PasswordPicker;
 
 public class EditPasswordActivity extends AppCompatActivity {
     private static final Logger log = Logger.getLogger(EditPasswordActivity.class.getName());

+ 1 - 0
app/src/main/java/info/knacki/pass/ui/MainActivity.java

@@ -35,6 +35,7 @@ import info.knacki.pass.ui.alertPrompt.views.TextEditAndCheckbox;
 import info.knacki.pass.ui.alertPrompt.views.TextView;
 import info.knacki.pass.ui.passwordList.EditablePasswordListView;
 import info.knacki.pass.ui.passwordList.PasswordEditListener;
+import info.knacki.pass.ui.passwordPicker.PasswordPicker;
 
 public class MainActivity extends AppCompatActivity implements PasswordEditListener {
     private final Logger log = Logger.getLogger(MainActivity.class.getName());

+ 3 - 0
app/src/main/java/info/knacki/pass/ui/alertPrompt/AlertPrompt.java

@@ -71,8 +71,11 @@ public class AlertPrompt {
         return this;
     }
 
+    protected void OnBeforeShow() {}
+
     public AlertPrompt show() {
         fDialog = fAlertBuilder.create();
+        OnBeforeShow();
         fDialog.show();
         return this;
     }

+ 25 - 0
app/src/main/java/info/knacki/pass/ui/alertPrompt/ServiceAlertPrompt.java

@@ -0,0 +1,25 @@
+package info.knacki.pass.ui.alertPrompt;
+
+import android.content.Context;
+import android.view.View;
+import android.view.Window;
+import android.view.WindowManager;
+
+public class ServiceAlertPrompt extends AlertPrompt {
+    protected final View fInputView;
+
+    public ServiceAlertPrompt(Context c, View inputView) {
+        super(c);
+        fInputView = inputView;
+    }
+
+    @Override
+    protected void OnBeforeShow() {
+        final Window window = fDialog.getWindow();
+        WindowManager.LayoutParams lay = window.getAttributes();
+        lay.token = fInputView.getWindowToken();
+        lay.type = WindowManager.LayoutParams.TYPE_APPLICATION_ATTACHED_DIALOG;
+        window.setAttributes(lay);
+        window.addFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
+    }
+}

+ 7 - 3
app/src/main/java/info/knacki/pass/ui/PasswordPicker.java → app/src/main/java/info/knacki/pass/ui/passwordPicker/PasswordPicker.java

@@ -1,4 +1,4 @@
-package info.knacki.pass.ui;
+package info.knacki.pass.ui.passwordPicker;
 
 import android.content.Context;
 import android.content.DialogInterface;
@@ -12,15 +12,19 @@ import info.knacki.pass.ui.alertPrompt.AlertPrompt;
 import info.knacki.pass.ui.alertPrompt.views.SimpleTextEdit;
 
 public class PasswordPicker implements FileInterfaceFactory.PasswordGetter {
-    private final Context fContext;
+    protected final Context fContext;
 
     public PasswordPicker(Context context) {
         fContext = context;
     }
 
+    protected AlertPrompt AlertFactory() {
+        return new AlertPrompt(fContext);
+    }
+
     @Override
     public void GetPassword(final GitInterface.OnResponseListener<String> onPassword) {
-        new AlertPrompt(fContext)
+        AlertFactory()
             .setCancelable(true)
             .setView(new SimpleTextEdit(fContext).SetPassword())
             .setPositiveButton(R.string.ok, new AlertPrompt.OnClickListener() {

+ 21 - 0
app/src/main/java/info/knacki/pass/ui/passwordPicker/ServicePasswordPicker.java

@@ -0,0 +1,21 @@
+package info.knacki.pass.ui.passwordPicker;
+
+import android.content.Context;
+import android.view.View;
+
+import info.knacki.pass.ui.alertPrompt.AlertPrompt;
+import info.knacki.pass.ui.alertPrompt.ServiceAlertPrompt;
+
+public class ServicePasswordPicker extends PasswordPicker {
+    protected final View fInputView;
+
+    public ServicePasswordPicker(Context context, View inputView) {
+        super(context);
+        fInputView = inputView;
+    }
+
+    @Override
+    protected AlertPrompt AlertFactory() {
+        return new ServiceAlertPrompt(fContext, fInputView);
+    }
+}