From 6f25a8bb232833e78c23ca67f157f75d109d421b Mon Sep 17 00:00:00 2001 From: Matthew Wong Date: Tue, 14 Jul 2015 22:41:04 -0400 Subject: Create ssh keygen activity with two fragments: the keygen & a screen to show the generated public key --- .../main/java/com/zeapo/pwdstore/SshKeyGen.java | 141 +++++++++++++++++++++ .../com/zeapo/pwdstore/pwgenDialogFragment.java | 2 +- 2 files changed, 142 insertions(+), 1 deletion(-) create mode 100644 app/src/main/java/com/zeapo/pwdstore/SshKeyGen.java (limited to 'app/src/main/java') diff --git a/app/src/main/java/com/zeapo/pwdstore/SshKeyGen.java b/app/src/main/java/com/zeapo/pwdstore/SshKeyGen.java new file mode 100644 index 00000000..a1c76ffb --- /dev/null +++ b/app/src/main/java/com/zeapo/pwdstore/SshKeyGen.java @@ -0,0 +1,141 @@ +package com.zeapo.pwdstore; + +import android.app.Fragment; +import android.content.ClipData; +import android.content.ClipboardManager; +import android.content.Context; +import android.os.Bundle; +import android.support.v7.app.AppCompatActivity; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.inputmethod.InputMethodManager; +import android.widget.ArrayAdapter; +import android.widget.Spinner; +import android.widget.TextView; +import android.widget.Toast; + +import com.jcraft.jsch.JSch; +import com.jcraft.jsch.KeyPair; + +import org.apache.commons.io.FileUtils; + +import java.io.File; +import java.io.FileOutputStream; + +public class SshKeyGen extends AppCompatActivity { + + // SSH key generation UI + public static class SshKeyGenFragment extends Fragment { + public SshKeyGenFragment() { + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + View v = inflater.inflate(R.layout.fragment_ssh_keygen, container, false); + + Spinner spinner = (Spinner) v.findViewById(R.id.length); + Integer[] lengths = new Integer[]{2048, 4096}; + ArrayAdapter adapter = new ArrayAdapter(getActivity(), + android.R.layout.simple_spinner_dropdown_item, lengths); + spinner.setAdapter(adapter); + + return v; + } + } + + // Displays the generated public key .ssh_key.pub + public static class ShowSshKeyFragment extends Fragment { + public ShowSshKeyFragment() { + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + View v = inflater.inflate(R.layout.fragment_show_ssh_key, container, false); + + TextView textView = (TextView) v.findViewById(R.id.public_key); + File file = new File(getActivity().getFilesDir() + "/.ssh_key.pub"); + try { + textView.setText(FileUtils.readFileToString(file)); + Toast.makeText(getActivity(), "SSH-key generated", Toast.LENGTH_LONG).show(); + } catch (Exception e) { + System.out.println("Exception caught :("); + e.printStackTrace(); + } + + v.findViewById(R.id.ok_ssh_key).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + getActivity().finish(); + } + }); + + return v; + } + } + + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + getSupportActionBar().setDisplayHomeAsUpEnabled(true); + + setTitle("Generate SSH Key"); + + setContentView(R.layout.activity_ssh_keygen); + + if (savedInstanceState == null) { + getFragmentManager().beginTransaction() + .replace(android.R.id.content, new SshKeyGenFragment()).commit(); + } + } + + // Invoked when 'Generate' button of SshKeyGenFragment clicked. Generates a + // private and public key, then replaces the SshKeyGenFragment with a + // ShowSshKeyFragment which displays the public key. + public void generate(View view) { + InputMethodManager imm = (InputMethodManager) this.getSystemService(Context.INPUT_METHOD_SERVICE); + imm.hideSoftInputFromWindow(view.getWindowToken(), 0); + + Spinner spinner = (Spinner) findViewById(R.id.length); + int length = (Integer) spinner.getSelectedItem(); + + TextView textView = (TextView) findViewById(R.id.passphrase); + String passphrase = textView.getText().toString(); + + textView = (TextView) findViewById(R.id.comment); + String comment = textView.getText().toString(); + + JSch jsch = new JSch(); + try { + KeyPair kp = KeyPair.genKeyPair(jsch, KeyPair.RSA, length); + + File file = new File(getFilesDir() + "/.ssh_key"); + FileOutputStream out = new FileOutputStream(file, false); + kp.writePrivateKey(out, passphrase.getBytes()); + + file = new File(getFilesDir() + "/.ssh_key.pub"); + out = new FileOutputStream(file, false); + kp.writePublicKey(out, comment); + } catch (Exception e) { + System.out.println("Exception caught :("); + e.printStackTrace(); + return; + } + getFragmentManager().beginTransaction() + .replace(android.R.id.content, new ShowSshKeyFragment()).commit(); + } + + // Invoked when 'Copy' button of ShowSshKeyFragment clicked. Copies the + // displayed public key to the clipboard. + public void copy (View view) { + TextView textView = (TextView) findViewById(R.id.public_key); + ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE); + ClipData clip = ClipData.newPlainText("public key", textView.getText().toString()); + clipboard.setPrimaryClip(clip); + } + +} diff --git a/app/src/main/java/com/zeapo/pwdstore/pwgenDialogFragment.java b/app/src/main/java/com/zeapo/pwdstore/pwgenDialogFragment.java index af905b5d..0e2b96ef 100644 --- a/app/src/main/java/com/zeapo/pwdstore/pwgenDialogFragment.java +++ b/app/src/main/java/com/zeapo/pwdstore/pwgenDialogFragment.java @@ -116,7 +116,7 @@ public class pwgenDialogFragment extends DialogFragment { try { int length = Integer.valueOf(textView.getText().toString()); return pwgen.setPrefs(getActivity().getApplicationContext(), preferences, length); - } catch(NumberFormatException e) { + } catch (NumberFormatException e) { return pwgen.setPrefs(getActivity().getApplicationContext(), preferences); } } -- cgit v1.2.3 From 56cbade066eb21817a1f7f9a3b1a4c57f808828f Mon Sep 17 00:00:00 2001 From: Matthew Wong Date: Tue, 14 Jul 2015 22:42:55 -0400 Subject: Add preference to start ssh keygen --- .../main/java/com/zeapo/pwdstore/UserPreference.java | 19 +++++++++++++++++++ app/src/main/res/xml/preference.xml | 3 +++ 2 files changed, 22 insertions(+) (limited to 'app/src/main/java') diff --git a/app/src/main/java/com/zeapo/pwdstore/UserPreference.java b/app/src/main/java/com/zeapo/pwdstore/UserPreference.java index ff6f5048..dc535990 100644 --- a/app/src/main/java/com/zeapo/pwdstore/UserPreference.java +++ b/app/src/main/java/com/zeapo/pwdstore/UserPreference.java @@ -82,6 +82,14 @@ public class UserPreference extends AppCompatActivity { } }); + findPreference("ssh_keygen").setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { + @Override + public boolean onPreferenceClick(Preference preference) { + callingActivity.makeSshKey(); + return true; + } + }); + findPreference("git_server_info").setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { @@ -174,6 +182,9 @@ public class UserPreference extends AppCompatActivity { case "get_ssh_key": getSshKey(); break; + case "make_ssh_key": + makeSshKey(); + break; case "git_external": selectExternalGitRepository(); break; @@ -219,6 +230,14 @@ public class UserPreference extends AppCompatActivity { startActivityForResult(intent, IMPORT_SSH_KEY); } + /** + * Opens a key generator to generate a public/private key pair + */ + public void makeSshKey() { + Intent intent = new Intent(getApplicationContext(), SshKeyGen.class); + startActivity(intent); + } + private void copySshKey(Uri uri) throws IOException { InputStream sshKey = this.getContentResolver().openInputStream(uri); byte[] privateKey = IOUtils.toByteArray(sshKey); diff --git a/app/src/main/res/xml/preference.xml b/app/src/main/res/xml/preference.xml index 1ddcde41..e8772616 100644 --- a/app/src/main/res/xml/preference.xml +++ b/app/src/main/res/xml/preference.xml @@ -7,6 +7,9 @@ + Date: Tue, 14 Jul 2015 22:43:54 -0400 Subject: Change 'No SSH key' dialog to have options for import or generate. Also add all the strings... --- .../java/com/zeapo/pwdstore/git/GitOperation.java | 30 +++++++++++++++++----- app/src/main/res/values/strings.xml | 9 ++++++- 2 files changed, 31 insertions(+), 8 deletions(-) (limited to 'app/src/main/java') diff --git a/app/src/main/java/com/zeapo/pwdstore/git/GitOperation.java b/app/src/main/java/com/zeapo/pwdstore/git/GitOperation.java index c7b70ca4..c4d7eea4 100644 --- a/app/src/main/java/com/zeapo/pwdstore/git/GitOperation.java +++ b/app/src/main/java/com/zeapo/pwdstore/git/GitOperation.java @@ -92,7 +92,7 @@ public abstract class GitOperation { new AlertDialog.Builder(callingActivity) .setMessage(callingActivity.getResources().getString(R.string.ssh_preferences_dialog_text)) .setTitle(callingActivity.getResources().getString(R.string.ssh_preferences_dialog_title)) - .setPositiveButton(callingActivity.getResources().getString(R.string.dialog_ok), new DialogInterface.OnClickListener() { + .setPositiveButton(callingActivity.getResources().getString(R.string.ssh_preferences_dialog_import), new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int id) { try { @@ -106,12 +106,28 @@ public abstract class GitOperation { e.printStackTrace(); } } - }).setNegativeButton(callingActivity.getResources().getString(R.string.dialog_cancel), new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int id) { - // Do nothing... - } - }).show(); + }) + .setNegativeButton(callingActivity.getResources().getString(R.string.ssh_preferences_dialog_generate), new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + try { + // Duplicated code + Intent intent = new Intent(callingActivity.getApplicationContext(), UserPreference.class); + intent.putExtra("operation", "make_ssh_key"); + callingActivity.startActivityForResult(intent, GET_SSH_KEY_FROM_CLONE); + } catch (Exception e) { + System.out.println("Exception caught :("); + e.printStackTrace(); + } + } + }) + .setNeutralButton(callingActivity.getResources().getString(R.string.dialog_cancel), new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int id) { + // Finish the blank GitActivity so user doesn't have to press back + callingActivity.finish(); + } + }).show(); } else { final EditText passphrase = new EditText(callingActivity); passphrase.setHint("Passphrase"); diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index a9b03151..e746419d 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -47,8 +47,10 @@ You are about to use a read-only repository, you will not be able to push to it Did you forget to specify a username? You have to set the information about the server before synchronizing with the server - Please import your SSH key file in the preferences + Please import or generate your SSH key file in the preferences No SSH key + Import + Generate Authenticate Please provide the passphrase for your SSH key. Leave it empty if there is no passphrase. Please provide the password for this repository @@ -95,6 +97,7 @@ username Edit git server settings Import ssh-key + Generate ssh-key Delete repository Clear repository Do you want to delete the current password store directory? This will not clear your configuration. @@ -122,6 +125,10 @@ Uppercase Ambiguous + + Copy + Provide this public key to your Git server. + OK Yes -- cgit v1.2.3 From d03ab8ee3c9585e862435b621edd2360232be083 Mon Sep 17 00:00:00 2001 From: Matthew Wong Date: Wed, 15 Jul 2015 02:50:45 -0400 Subject: Make AsyncTask for ssh key generation and show a progress dialog. Show the exception if it fails --- .../main/java/com/zeapo/pwdstore/SshKeyGen.java | 100 ++++++++++++++------- 1 file changed, 70 insertions(+), 30 deletions(-) (limited to 'app/src/main/java') diff --git a/app/src/main/java/com/zeapo/pwdstore/SshKeyGen.java b/app/src/main/java/com/zeapo/pwdstore/SshKeyGen.java index a1c76ffb..17d952ad 100644 --- a/app/src/main/java/com/zeapo/pwdstore/SshKeyGen.java +++ b/app/src/main/java/com/zeapo/pwdstore/SshKeyGen.java @@ -1,9 +1,13 @@ package com.zeapo.pwdstore; +import android.app.AlertDialog; import android.app.Fragment; +import android.app.ProgressDialog; import android.content.ClipData; import android.content.ClipboardManager; import android.content.Context; +import android.content.DialogInterface; +import android.os.AsyncTask; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.LayoutInflater; @@ -37,7 +41,7 @@ public class SshKeyGen extends AppCompatActivity { Spinner spinner = (Spinner) v.findViewById(R.id.length); Integer[] lengths = new Integer[]{2048, 4096}; - ArrayAdapter adapter = new ArrayAdapter(getActivity(), + ArrayAdapter adapter = new ArrayAdapter<>(getActivity(), android.R.layout.simple_spinner_dropdown_item, lengths); spinner.setAdapter(adapter); @@ -59,7 +63,6 @@ public class SshKeyGen extends AppCompatActivity { File file = new File(getActivity().getFilesDir() + "/.ssh_key.pub"); try { textView.setText(FileUtils.readFileToString(file)); - Toast.makeText(getActivity(), "SSH-key generated", Toast.LENGTH_LONG).show(); } catch (Exception e) { System.out.println("Exception caught :("); e.printStackTrace(); @@ -81,7 +84,8 @@ public class SshKeyGen extends AppCompatActivity { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - getSupportActionBar().setDisplayHomeAsUpEnabled(true); + if (getSupportActionBar() != null) + getSupportActionBar().setDisplayHomeAsUpEnabled(true); setTitle("Generate SSH Key"); @@ -93,40 +97,76 @@ public class SshKeyGen extends AppCompatActivity { } } - // Invoked when 'Generate' button of SshKeyGenFragment clicked. Generates a - // private and public key, then replaces the SshKeyGenFragment with a - // ShowSshKeyFragment which displays the public key. - public void generate(View view) { - InputMethodManager imm = (InputMethodManager) this.getSystemService(Context.INPUT_METHOD_SERVICE); - imm.hideSoftInputFromWindow(view.getWindowToken(), 0); + private class generateTask extends AsyncTask { + private ProgressDialog pd; - Spinner spinner = (Spinner) findViewById(R.id.length); - int length = (Integer) spinner.getSelectedItem(); + protected Exception doInBackground(View... views) { + InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); + imm.hideSoftInputFromWindow(views[0].getWindowToken(), 0); - TextView textView = (TextView) findViewById(R.id.passphrase); - String passphrase = textView.getText().toString(); + Spinner spinner = (Spinner) findViewById(R.id.length); + int length = (Integer) spinner.getSelectedItem(); - textView = (TextView) findViewById(R.id.comment); - String comment = textView.getText().toString(); + TextView textView = (TextView) findViewById(R.id.passphrase); + String passphrase = textView.getText().toString(); - JSch jsch = new JSch(); - try { - KeyPair kp = KeyPair.genKeyPair(jsch, KeyPair.RSA, length); + textView = (TextView) findViewById(R.id.comment); + String comment = textView.getText().toString(); - File file = new File(getFilesDir() + "/.ssh_key"); - FileOutputStream out = new FileOutputStream(file, false); - kp.writePrivateKey(out, passphrase.getBytes()); + JSch jsch = new JSch(); + try { + KeyPair kp = KeyPair.genKeyPair(jsch, KeyPair.RSA, length); + + File file = new File(getFilesDir() + "/.ssh_key"); + FileOutputStream out = new FileOutputStream(file, false); + kp.writePrivateKey(out, passphrase.getBytes()); - file = new File(getFilesDir() + "/.ssh_key.pub"); - out = new FileOutputStream(file, false); - kp.writePublicKey(out, comment); - } catch (Exception e) { - System.out.println("Exception caught :("); - e.printStackTrace(); - return; + file = new File(getFilesDir() + "/.ssh_key.pub"); + out = new FileOutputStream(file, false); + kp.writePublicKey(out, comment); + return null; + } catch (Exception e) { + System.out.println("Exception caught :("); + e.printStackTrace(); + return e; + } } - getFragmentManager().beginTransaction() - .replace(android.R.id.content, new ShowSshKeyFragment()).commit(); + + @Override + protected void onPreExecute() { + super.onPreExecute(); + pd = ProgressDialog.show(SshKeyGen.this, "", "Generating keys"); + + } + + @Override + protected void onPostExecute(Exception e) { + super.onPostExecute(e); + pd.dismiss(); + if (e == null) { + Toast.makeText(SshKeyGen.this, "SSH-key generated", Toast.LENGTH_LONG).show(); + getFragmentManager().beginTransaction() + .replace(android.R.id.content, new ShowSshKeyFragment()).commit(); + } else { + new AlertDialog.Builder(SshKeyGen.this) + .setTitle("Error while trying to generate the ssh-key") + .setMessage(getResources().getString(R.string.ssh_key_error_dialog_text) + e.getMessage()) + .setPositiveButton(getResources().getString(R.string.dialog_ok), new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + // pass + } + }).show(); + } + + } + } + + // Invoked when 'Generate' button of SshKeyGenFragment clicked. Generates a + // private and public key, then replaces the SshKeyGenFragment with a + // ShowSshKeyFragment which displays the public key. + public void generate(View view) { + new generateTask().execute(view); } // Invoked when 'Copy' button of ShowSshKeyFragment clicked. Copies the -- cgit v1.2.3 From 61ae170f6cef761407216dcf545ebb80410ca023 Mon Sep 17 00:00:00 2001 From: Matthew Wong Date: Thu, 16 Jul 2015 03:16:25 -0400 Subject: Make the generated public key viewer a dialog instead of fragment and add a "preference" that opens the dialog. --- .../main/java/com/zeapo/pwdstore/SshKeyGen.java | 69 +++++++++++++++------- .../java/com/zeapo/pwdstore/UserPreference.java | 22 +++++++ .../com/zeapo/pwdstore/pwgenDialogFragment.java | 4 +- app/src/main/res/layout/fragment_show_ssh_key.xml | 22 ------- app/src/main/res/values/strings.xml | 5 +- app/src/main/res/xml/preference.xml | 3 + 6 files changed, 78 insertions(+), 47 deletions(-) (limited to 'app/src/main/java') diff --git a/app/src/main/java/com/zeapo/pwdstore/SshKeyGen.java b/app/src/main/java/com/zeapo/pwdstore/SshKeyGen.java index 17d952ad..dd9ef5ce 100644 --- a/app/src/main/java/com/zeapo/pwdstore/SshKeyGen.java +++ b/app/src/main/java/com/zeapo/pwdstore/SshKeyGen.java @@ -1,20 +1,25 @@ package com.zeapo.pwdstore; -import android.app.AlertDialog; +import android.app.Dialog; +import android.app.DialogFragment; import android.app.Fragment; import android.app.ProgressDialog; import android.content.ClipData; import android.content.ClipboardManager; import android.content.Context; import android.content.DialogInterface; +import android.content.SharedPreferences; import android.os.AsyncTask; import android.os.Bundle; +import android.preference.PreferenceManager; +import android.support.v7.app.AlertDialog; import android.support.v7.app.AppCompatActivity; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.inputmethod.InputMethodManager; import android.widget.ArrayAdapter; +import android.widget.Button; import android.widget.Spinner; import android.widget.TextView; import android.widget.Toast; @@ -50,14 +55,16 @@ public class SshKeyGen extends AppCompatActivity { } // Displays the generated public key .ssh_key.pub - public static class ShowSshKeyFragment extends Fragment { + public static class ShowSshKeyFragment extends DialogFragment { public ShowSshKeyFragment() { } @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, - Bundle savedInstanceState) { - View v = inflater.inflate(R.layout.fragment_show_ssh_key, container, false); + public Dialog onCreateDialog(Bundle savedInstanceState) { + AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); + LayoutInflater inflater = getActivity().getLayoutInflater(); + final View v = inflater.inflate(R.layout.fragment_show_ssh_key, null); + builder.setView(v); TextView textView = (TextView) v.findViewById(R.id.public_key); File file = new File(getActivity().getFilesDir() + "/.ssh_key.pub"); @@ -68,14 +75,40 @@ public class SshKeyGen extends AppCompatActivity { e.printStackTrace(); } - v.findViewById(R.id.ok_ssh_key).setOnClickListener(new View.OnClickListener() { + builder.setPositiveButton(getResources().getString(R.string.dialog_ok), new DialogInterface.OnClickListener() { @Override - public void onClick(View v) { - getActivity().finish(); + public void onClick(DialogInterface dialog, int which) { + if (getActivity() instanceof SshKeyGen) + getActivity().finish(); } }); - return v; + builder.setNegativeButton(getResources().getString(R.string.dialog_cancel), new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + + } + }); + + builder.setNeutralButton(getResources().getString(R.string.ssh_keygen_copy), null); + + final AlertDialog ad = builder.setTitle("Your public key").create(); + ad.setOnShowListener(new DialogInterface.OnShowListener() { + @Override + public void onShow(DialogInterface dialog) { + Button b = ad.getButton(AlertDialog.BUTTON_NEUTRAL); + b.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + TextView textView = (TextView) getDialog().findViewById(R.id.public_key); + ClipboardManager clipboard = (ClipboardManager) getActivity().getSystemService(Context.CLIPBOARD_SERVICE); + ClipData clip = ClipData.newPlainText("public key", textView.getText().toString()); + clipboard.setPrimaryClip(clip); + } + }); + } + }); + return ad; } } @@ -145,8 +178,12 @@ public class SshKeyGen extends AppCompatActivity { pd.dismiss(); if (e == null) { Toast.makeText(SshKeyGen.this, "SSH-key generated", Toast.LENGTH_LONG).show(); - getFragmentManager().beginTransaction() - .replace(android.R.id.content, new ShowSshKeyFragment()).commit(); + DialogFragment df = new ShowSshKeyFragment(); + df.show(getFragmentManager(), "public_key"); + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); + SharedPreferences.Editor editor = prefs.edit(); + editor.putBoolean("use_generated_key", true); + editor.apply(); } else { new AlertDialog.Builder(SshKeyGen.this) .setTitle("Error while trying to generate the ssh-key") @@ -168,14 +205,4 @@ public class SshKeyGen extends AppCompatActivity { public void generate(View view) { new generateTask().execute(view); } - - // Invoked when 'Copy' button of ShowSshKeyFragment clicked. Copies the - // displayed public key to the clipboard. - public void copy (View view) { - TextView textView = (TextView) findViewById(R.id.public_key); - ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE); - ClipData clip = ClipData.newPlainText("public key", textView.getText().toString()); - clipboard.setPrimaryClip(clip); - } - } diff --git a/app/src/main/java/com/zeapo/pwdstore/UserPreference.java b/app/src/main/java/com/zeapo/pwdstore/UserPreference.java index dc535990..8344e8b3 100644 --- a/app/src/main/java/com/zeapo/pwdstore/UserPreference.java +++ b/app/src/main/java/com/zeapo/pwdstore/UserPreference.java @@ -1,6 +1,7 @@ package com.zeapo.pwdstore; import android.app.AlertDialog; +import android.app.DialogFragment; import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; @@ -90,6 +91,16 @@ public class UserPreference extends AppCompatActivity { } }); + findPreference("ssh_see_key").setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { + @Override + public boolean onPreferenceClick(Preference preference) { + DialogFragment df = new SshKeyGen.ShowSshKeyFragment(); + df.show(getFragmentManager(), "public_key"); + return true; + } + }); + + findPreference("git_server_info").setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { @@ -171,6 +182,13 @@ public class UserPreference extends AppCompatActivity { findPreference("pref_select_external").setOnPreferenceChangeListener(resetRepo); findPreference("git_external").setOnPreferenceChangeListener(resetRepo); } + + @Override + public void onStart() { + super.onStart(); + final SharedPreferences sharedPreferences = getPreferenceManager().getSharedPreferences(); + findPreference("ssh_see_key").setEnabled(sharedPreferences.getBoolean("use_generated_key", false)); + } } @Override @@ -256,6 +274,10 @@ public class UserPreference extends AppCompatActivity { } copySshKey(data.getData()); Toast.makeText(this, this.getResources().getString(R.string.ssh_key_success_dialog_title), Toast.LENGTH_LONG).show(); + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); + SharedPreferences.Editor editor = prefs.edit(); + editor.putBoolean("use_generated_key", false); + editor.apply(); setResult(RESULT_OK); finish(); } catch (IOException e) { diff --git a/app/src/main/java/com/zeapo/pwdstore/pwgenDialogFragment.java b/app/src/main/java/com/zeapo/pwdstore/pwgenDialogFragment.java index 0e2b96ef..5dae4d23 100644 --- a/app/src/main/java/com/zeapo/pwdstore/pwgenDialogFragment.java +++ b/app/src/main/java/com/zeapo/pwdstore/pwgenDialogFragment.java @@ -58,8 +58,8 @@ public class pwgenDialogFragment extends DialogFragment { builder.setPositiveButton(getResources().getString(R.string.dialog_ok), new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { - TextView edit = (TextView) pwgenDialogFragment.this.getActivity().findViewById(R.id.crypto_password_edit); - TextView generate = (TextView) pwgenDialogFragment.this.getDialog().findViewById(R.id.passwordText); + TextView edit = (TextView) getActivity().findViewById(R.id.crypto_password_edit); + TextView generate = (TextView) getDialog().findViewById(R.id.passwordText); edit.append(generate.getText()); } }); diff --git a/app/src/main/res/layout/fragment_show_ssh_key.xml b/app/src/main/res/layout/fragment_show_ssh_key.xml index 6590a98f..e81ae8c4 100644 --- a/app/src/main/res/layout/fragment_show_ssh_key.xml +++ b/app/src/main/res/layout/fragment_show_ssh_key.xml @@ -24,27 +24,5 @@ android:text="@string/ssh_keygen_tip" android:textAppearance="?android:attr/textAppearanceMedium"/> - - -