X-Git-Url: https://gitweb.stoutner.com/?p=PrivacyBrowserAndroid.git;a=blobdiff_plain;f=app%2Fsrc%2Fmain%2Fjava%2Fcom%2Fstoutner%2Fprivacybrowser%2Factivities%2FImportExportActivity.java;h=ca4703af5243f936774f8ffd68cf2ec7e57a7ab1;hp=3f7d2962e1bb02973ff2516e23e8754930f13ebd;hb=5d3cafb4a4fbb2bf851d36f973cc1e8b23ecebab;hpb=ba40295dffd761ccdc95d3b46ca7acbad1f00d5e diff --git a/app/src/main/java/com/stoutner/privacybrowser/activities/ImportExportActivity.java b/app/src/main/java/com/stoutner/privacybrowser/activities/ImportExportActivity.java index 3f7d2962..ca4703af 100644 --- a/app/src/main/java/com/stoutner/privacybrowser/activities/ImportExportActivity.java +++ b/app/src/main/java/com/stoutner/privacybrowser/activities/ImportExportActivity.java @@ -22,12 +22,15 @@ package com.stoutner.privacybrowser.activities; import android.Manifest; import android.app.Activity; import android.content.Intent; +import android.content.SharedPreferences; import android.content.pm.PackageManager; import android.media.MediaScannerConnection; import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.os.Environment; +import android.os.Handler; +import android.preference.PreferenceManager; import android.provider.DocumentsContract; import android.text.Editable; import android.text.TextWatcher; @@ -57,6 +60,7 @@ import com.google.android.material.textfield.TextInputLayout; import com.stoutner.privacybrowser.R; import com.stoutner.privacybrowser.dialogs.StoragePermissionDialog; +import com.stoutner.privacybrowser.helpers.FileNameHelper; import com.stoutner.privacybrowser.helpers.ImportExportDatabaseHelper; import java.io.File; @@ -88,13 +92,20 @@ public class ImportExportActivity extends AppCompatActivity implements StoragePe @Override public void onCreate(Bundle savedInstanceState) { + // Get a handle for the shared preferences. + SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this); + + // Get the theme and screenshot preferences. + boolean darkTheme = sharedPreferences.getBoolean("dark_theme", false); + boolean allowScreenshots = sharedPreferences.getBoolean("allow_screenshots", false); + // Disable screenshots if not allowed. - if (!MainWebViewActivity.allowScreenshots) { + if (!allowScreenshots) { getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE); } // Set the activity theme. - if (MainWebViewActivity.darkTheme) { + if (darkTheme) { setTheme(R.style.PrivacyBrowserDark_SecondaryActivity); } else { setTheme(R.style.PrivacyBrowserLight_SecondaryActivity); @@ -106,7 +117,7 @@ public class ImportExportActivity extends AppCompatActivity implements StoragePe // Set the content view. setContentView(R.layout.import_export_coordinatorlayout); - // Use the `SupportActionBar` from `android.support.v7.app.ActionBar` until the minimum API is >= 21. + // Set the support action bar. Toolbar toolbar = findViewById(R.id.import_export_toolbar); setSupportActionBar(toolbar); @@ -119,7 +130,7 @@ public class ImportExportActivity extends AppCompatActivity implements StoragePe // Display the home arrow on the support action bar. actionBar.setDisplayHomeAsUpEnabled(true); - // Find out if we are running KitKat + // Find out if the system is running KitKat boolean runningKitKat = (Build.VERSION.SDK_INT == 19); // Find out if OpenKeychain is installed. @@ -508,7 +519,7 @@ public class ImportExportActivity extends AppCompatActivity implements StoragePe // Check if the user has previously denied the storage permission. if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) { // Show a dialog explaining the request first. // Instantiate the storage permission alert dialog. - DialogFragment storagePermissionDialogFragment = new StoragePermissionDialog(); + DialogFragment storagePermissionDialogFragment = StoragePermissionDialog.displayDialog(0); // Show the storage permission alert dialog. The permission will be requested when the dialog is closed. storagePermissionDialogFragment.show(getSupportFragmentManager(), getString(R.string.storage_permission)); @@ -521,7 +532,7 @@ public class ImportExportActivity extends AppCompatActivity implements StoragePe } @Override - public void onCloseStoragePermissionDialog() { + public void onCloseStoragePermissionDialog(int type) { // Request the write external storage permission. The import/export will be run when it finishes. ActivityCompat.requestPermissions(this, new String[] {Manifest.permission.WRITE_EXTERNAL_STORAGE}, 0); } @@ -548,7 +559,10 @@ public class ImportExportActivity extends AppCompatActivity implements StoragePe } @Override - public void onActivityResult(int requestCode, int resultCode, Intent data) { + public void onActivityResult(int requestCode, int resultCode, Intent intent) { + // Run the default commands. + super.onActivityResult(requestCode, resultCode, intent); + switch (requestCode) { case (BROWSE_RESULT_CODE): // Don't do anything if the user pressed back from the file picker. @@ -556,49 +570,19 @@ public class ImportExportActivity extends AppCompatActivity implements StoragePe // Get a handle for the file name edit text. EditText fileNameEditText = findViewById(R.id.file_name_edittext); - // Get the file name URI. - Uri fileNameUri = data.getData(); - - // Remove the lint warning that the file name URI might be null. - assert fileNameUri != null; - - // Get the raw file name path. - String rawFileNamePath = fileNameUri.getPath(); - - // Remove the incorrect lint warning that the file name path might be null. - assert rawFileNamePath != null; - - // Check to see if the file name Path includes a valid storage location. - if (rawFileNamePath.contains(":")) { // The path is valid. - // Split the path into the initial content uri and the final path information. - String fileNameContentPath = rawFileNamePath.substring(0, rawFileNamePath.indexOf(":")); - String fileNameFinalPath = rawFileNamePath.substring(rawFileNamePath.indexOf(":") + 1); + // Instantiate the file name helper. + FileNameHelper fileNameHelper = new FileNameHelper(); - // Create the file name path string. - String fileNamePath; + // Get the file path URI from the intent. + Uri filePathUri = intent.getData(); - // Construct the file name path. - switch (fileNameContentPath) { - // The documents home has a special content path. - case "/document/home": - fileNamePath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS) + "/" + fileNameFinalPath; - break; + // Use the file path from the intent if it exists. + if (filePathUri != null) { + // Convert the file name URI to a file name path. + String fileNamePath = fileNameHelper.convertUriToFileNamePath(filePathUri); - // Everything else for the primary user should be in `/document/primary`. - case "/document/primary": - fileNamePath = Environment.getExternalStorageDirectory() + "/" + fileNameFinalPath; - break; - - // Just in case, catch everything else and place it in the external storage directory. - default: - fileNamePath = Environment.getExternalStorageDirectory() + "/" + fileNameFinalPath; - break; - } - - // Set the file name path as the text of the file name EditText. + // Set the file name path as the text of the file name edit text. fileNameEditText.setText(fileNamePath); - } else { // The path is invalid. - Snackbar.make(fileNameEditText, rawFileNamePath + " " + getString(R.string.invalid_location), Snackbar.LENGTH_INDEFINITE).show(); } } break; @@ -943,8 +927,21 @@ public class ImportExportActivity extends AppCompatActivity implements StoragePe // `Intent.FLAG_ACTIVITY_CLEAR_TASK` removes all activities from the stack. It requires `Intent.FLAG_ACTIVITY_NEW_TASK`. restartIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); - // Make it so. - startActivity(restartIntent); + // Create a restart handler. + Handler restartHandler = new Handler(); + + // Create a restart runnable. + Runnable restartRunnable = () -> { + // Restart Privacy Browser. + startActivity(restartIntent); + + // Kill this instance of Privacy Browser. Otherwise, the app exhibits sporadic behavior after the restart. + System.exit(0); + }; + + // Restart Privacy Browser after 150 milliseconds to allow enough time for the preferences to be saved. + restartHandler.postDelayed(restartRunnable, 150); + } else if (!(encryptionSpinner.getSelectedItemPosition() == OPENPGP_ENCRYPTION)){ // The import was not successful. // Display a snack bar with the import error. Snackbar.make(fileNameEditText, getString(R.string.import_failed) + " " + importStatus, Snackbar.LENGTH_INDEFINITE).show();