|
23 | 23 | import android.support.v4.content.ContextCompat;
|
24 | 24 | import android.support.v7.app.AlertDialog;
|
25 | 25 | import android.support.v7.app.AppCompatActivity;
|
| 26 | +import android.util.Log; |
26 | 27 | import android.view.MenuItem;
|
27 | 28 | import android.view.View;
|
28 | 29 | import android.view.accessibility.AccessibilityManager;
|
|
45 | 46 | import java.io.File;
|
46 | 47 | import java.io.IOException;
|
47 | 48 | import java.io.InputStream;
|
| 49 | +import java.text.SimpleDateFormat; |
| 50 | +import java.util.Date; |
48 | 51 | import java.util.HashSet;
|
49 | 52 | import java.util.List;
|
| 53 | +import java.util.Locale; |
50 | 54 | import java.util.Set;
|
51 | 55 |
|
52 | 56 | public class UserPreference extends AppCompatActivity {
|
53 | 57 | private final static int IMPORT_SSH_KEY = 1;
|
54 | 58 | private final static int IMPORT_PGP_KEY = 2;
|
55 | 59 | private final static int EDIT_GIT_INFO = 3;
|
56 | 60 | private final static int SELECT_GIT_DIRECTORY = 4;
|
| 61 | + private final static int EXPORT_PASSWORDS = 5; |
57 | 62 | private final static int REQUEST_EXTERNAL_STORAGE = 50;
|
58 | 63 | private PrefsFragment prefsFragment;
|
59 | 64 |
|
@@ -205,6 +210,14 @@ public void onDismiss(DialogInterface dialog) {
|
205 | 210 | return true;
|
206 | 211 | }
|
207 | 212 | });
|
| 213 | + |
| 214 | + findPreference("export_passwords").setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { |
| 215 | + @Override |
| 216 | + public boolean onPreferenceClick(Preference preference) { |
| 217 | + callingActivity.exportPasswordsWithPermissions(); |
| 218 | + return true; |
| 219 | + } |
| 220 | + }); |
208 | 221 | }
|
209 | 222 |
|
210 | 223 | @Override
|
@@ -354,6 +367,42 @@ public void getSshKey() {
|
354 | 367 | startActivityForResult(i, IMPORT_SSH_KEY);
|
355 | 368 | }
|
356 | 369 |
|
| 370 | + public void exportPasswordsWithPermissions() { |
| 371 | + final Activity activity = this; |
| 372 | + if (ContextCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { |
| 373 | + if (ActivityCompat.shouldShowRequestPermissionRationale(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE)) { |
| 374 | + Snackbar snack = Snackbar.make(prefsFragment.getView(), |
| 375 | + "We need access to the sd-card to export the passwords", |
| 376 | + Snackbar.LENGTH_INDEFINITE) |
| 377 | + .setAction(R.string.dialog_ok, new View.OnClickListener() { |
| 378 | + @Override |
| 379 | + public void onClick(View view) { |
| 380 | + ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_EXTERNAL_STORAGE); |
| 381 | + } |
| 382 | + }); |
| 383 | + snack.show(); |
| 384 | + View view = snack.getView(); |
| 385 | + TextView tv = (TextView) view.findViewById(android.support.design.R.id.snackbar_text); |
| 386 | + tv.setTextColor(Color.WHITE); |
| 387 | + tv.setMaxLines(10); |
| 388 | + } else { |
| 389 | + // No explanation needed, we can request the permission. |
| 390 | + ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_EXTERNAL_STORAGE); |
| 391 | + } |
| 392 | + } else { |
| 393 | + Intent i = new Intent(getApplicationContext(), FilePickerActivity.class); |
| 394 | + |
| 395 | + // Set these depending on your use case. These are the defaults. |
| 396 | + i.putExtra(FilePickerActivity.EXTRA_ALLOW_MULTIPLE, false); |
| 397 | + i.putExtra(FilePickerActivity.EXTRA_ALLOW_CREATE_DIR, true); |
| 398 | + i.putExtra(FilePickerActivity.EXTRA_MODE, FilePickerActivity.MODE_DIR); |
| 399 | + |
| 400 | + i.putExtra(FilePickerActivity.EXTRA_START_PATH, Environment.getExternalStorageDirectory().getPath()); |
| 401 | + |
| 402 | + startActivityForResult(i, EXPORT_PASSWORDS); |
| 403 | + } |
| 404 | + } |
| 405 | + |
357 | 406 | /**
|
358 | 407 | * Opens a key generator to generate a public/private key pair
|
359 | 408 | */
|
@@ -457,6 +506,22 @@ public void onClick(DialogInterface dialog, int which) {
|
457 | 506 | }
|
458 | 507 | }
|
459 | 508 | break;
|
| 509 | + case EXPORT_PASSWORDS: { |
| 510 | + final Uri uri = data.getData(); |
| 511 | + final File repositoryDirectory = PasswordRepository.getRepositoryDirectory(getApplicationContext()); |
| 512 | + SimpleDateFormat fmtOut = new SimpleDateFormat("yyyy_MM_dd_HH_mm_ss", Locale.US); |
| 513 | + Date date = new Date(); |
| 514 | + String password_now = "/password_store_" + fmtOut.format(date); |
| 515 | + final File targetDirectory = new File(uri.getPath() + password_now); |
| 516 | + if (repositoryDirectory != null) { |
| 517 | + try { |
| 518 | + FileUtils.copyDirectory(repositoryDirectory, targetDirectory, true); |
| 519 | + } catch (IOException e) { |
| 520 | + Log.d("PWD_EXPORT", "Exception happened : " + e.getMessage()); |
| 521 | + } |
| 522 | + } |
| 523 | + } |
| 524 | + break; |
460 | 525 | default:
|
461 | 526 | break;
|
462 | 527 | }
|
|
0 commit comments