/*
- * Copyright © 2018-2021 Soren Stoutner <soren@stoutner.com>.
+ * Copyright © 2018-2022 Soren Stoutner <soren@stoutner.com>.
*
- * This file is part of Privacy Browser <https://www.stoutner.com/privacy-browser>.
+ * This file is part of Privacy Browser Android <https://www.stoutner.com/privacy-browser-android>.
*
- * Privacy Browser is free software: you can redistribute it and/or modify
+ * Privacy Browser Android is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
- * Privacy Browser is distributed in the hope that it will be useful,
+ * Privacy Browser Android is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with Privacy Browser. If not, see <http://www.gnu.org/licenses/>.
+ * along with Privacy Browser Android. If not, see <http://www.gnu.org/licenses/>.
*/
package com.stoutner.privacybrowser.activities;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.net.Uri;
-import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.preference.PreferenceManager;
// Define the saved instance state constants.
private final String ENCRYPTION_PASSWORD_TEXTINPUTLAYOUT_VISIBILITY = "encryption_password_textinputlayout_visibility";
- private final String KITKAT_PASSWORD_ENCRYPTED_TEXTVIEW_VISIBILITY = "kitkat_password_encrypted_textview_visibility";
private final String OPEN_KEYCHAIN_REQUIRED_TEXTVIEW_VISIBILITY = "open_keychain_required_textview_visibility";
private final String FILE_LOCATION_CARD_VIEW = "file_location_card_view";
private final String FILE_NAME_LINEARLAYOUT_VISIBILITY = "file_name_linearlayout_visibility";
Spinner encryptionSpinner;
TextInputLayout encryptionPasswordTextInputLayout;
EditText encryptionPasswordEditText;
- TextView kitKatPasswordEncryptionTextView;
TextView openKeychainRequiredTextView;
CardView fileLocationCardView;
RadioButton importRadioButton;
getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE);
}
- // Set the theme.
- setTheme(R.style.PrivacyBrowser);
-
// Run the default commands.
super.onCreate(savedInstanceState);
// Display the home arrow on the support action bar.
actionBar.setDisplayHomeAsUpEnabled(true);
- // Find out if the system is running KitKat
- boolean runningKitKat = (Build.VERSION.SDK_INT == 19);
-
// Find out if OpenKeychain is installed.
try {
openKeychainInstalled = !getPackageManager().getPackageInfo("org.sufficientlysecure.keychain", 0).versionName.isEmpty();
encryptionSpinner = findViewById(R.id.encryption_spinner);
encryptionPasswordTextInputLayout = findViewById(R.id.encryption_password_textinputlayout);
encryptionPasswordEditText = findViewById(R.id.encryption_password_edittext);
- kitKatPasswordEncryptionTextView = findViewById(R.id.kitkat_password_encryption_textview);
openKeychainRequiredTextView = findViewById(R.id.openkeychain_required_textview);
fileLocationCardView = findViewById(R.id.file_location_cardview);
importRadioButton = findViewById(R.id.import_radiobutton);
case NO_ENCRYPTION:
// Hide the unneeded layout items.
encryptionPasswordTextInputLayout.setVisibility(View.GONE);
- kitKatPasswordEncryptionTextView.setVisibility(View.GONE);
openKeychainRequiredTextView.setVisibility(View.GONE);
openKeychainImportInstructionsTextView.setVisibility(View.GONE);
break;
case PASSWORD_ENCRYPTION:
- if (runningKitKat) {
- // Show the KitKat password encryption message.
- kitKatPasswordEncryptionTextView.setVisibility(View.VISIBLE);
-
- // Hide the OpenPGP required text view and the file location card.
- openKeychainRequiredTextView.setVisibility(View.GONE);
- fileLocationCardView.setVisibility(View.GONE);
- } else {
- // Hide the OpenPGP layout items.
- openKeychainRequiredTextView.setVisibility(View.GONE);
- openKeychainImportInstructionsTextView.setVisibility(View.GONE);
-
- // Show the password encryption layout items.
- encryptionPasswordTextInputLayout.setVisibility(View.VISIBLE);
+ // Hide the OpenPGP layout items.
+ openKeychainRequiredTextView.setVisibility(View.GONE);
+ openKeychainImportInstructionsTextView.setVisibility(View.GONE);
- // Show the file location card.
- fileLocationCardView.setVisibility(View.VISIBLE);
+ // Show the password encryption layout items.
+ encryptionPasswordTextInputLayout.setVisibility(View.VISIBLE);
- // Show the file name linear layout if either import or export is checked.
- if (importRadioButton.isChecked() || exportRadioButton.isChecked()) {
- fileNameLinearLayout.setVisibility(View.VISIBLE);
- }
+ // Show the file location card.
+ fileLocationCardView.setVisibility(View.VISIBLE);
- // Reset the text of the import button, which may have been changed to `Decrypt`.
- if (importRadioButton.isChecked()) {
- importExportButton.setText(R.string.import_button);
- }
+ // Show the file name linear layout if either import or export is checked.
+ if (importRadioButton.isChecked() || exportRadioButton.isChecked()) {
+ fileNameLinearLayout.setVisibility(View.VISIBLE);
+ }
- // Enable the import/button if both the password and the file name are populated.
- importExportButton.setEnabled(!fileNameEditText.getText().toString().isEmpty() && !encryptionPasswordEditText.getText().toString().isEmpty());
+ // Reset the text of the import button, which may have been changed to `Decrypt`.
+ if (importRadioButton.isChecked()) {
+ importExportButton.setText(R.string.import_button);
}
+
+ // Enable the import/button if both the password and the file name are populated.
+ importExportButton.setEnabled(!fileNameEditText.getText().toString().isEmpty() && !encryptionPasswordEditText.getText().toString().isEmpty());
break;
case OPENPGP_ENCRYPTION:
// Hide the password encryption layout items.
encryptionPasswordTextInputLayout.setVisibility(View.GONE);
- kitKatPasswordEncryptionTextView.setVisibility(View.GONE);
// Updated items based on the installation status of OpenKeychain.
if (openKeychainInstalled) { // OpenKeychain is installed.
if (savedInstanceState == null) { // The app has not been restarted.
// Initially hide the unneeded views.
encryptionPasswordTextInputLayout.setVisibility(View.GONE);
- kitKatPasswordEncryptionTextView.setVisibility(View.GONE);
openKeychainRequiredTextView.setVisibility(View.GONE);
fileNameLinearLayout.setVisibility(View.GONE);
openKeychainImportInstructionsTextView.setVisibility(View.GONE);
} else { // The app has been restarted.
// Restore the visibility of the views.
encryptionPasswordTextInputLayout.setVisibility(savedInstanceState.getInt(ENCRYPTION_PASSWORD_TEXTINPUTLAYOUT_VISIBILITY));
- kitKatPasswordEncryptionTextView.setVisibility(savedInstanceState.getInt(KITKAT_PASSWORD_ENCRYPTED_TEXTVIEW_VISIBILITY));
openKeychainRequiredTextView.setVisibility(savedInstanceState.getInt(OPEN_KEYCHAIN_REQUIRED_TEXTVIEW_VISIBILITY));
fileLocationCardView.setVisibility(savedInstanceState.getInt(FILE_LOCATION_CARD_VIEW));
fileNameLinearLayout.setVisibility(savedInstanceState.getInt(FILE_NAME_LINEARLAYOUT_VISIBILITY));
// Save the visibility of the views.
savedInstanceState.putInt(ENCRYPTION_PASSWORD_TEXTINPUTLAYOUT_VISIBILITY, encryptionPasswordTextInputLayout.getVisibility());
- savedInstanceState.putInt(KITKAT_PASSWORD_ENCRYPTED_TEXTVIEW_VISIBILITY, kitKatPasswordEncryptionTextView.getVisibility());
savedInstanceState.putInt(OPEN_KEYCHAIN_REQUIRED_TEXTVIEW_VISIBILITY, openKeychainRequiredTextView.getVisibility());
savedInstanceState.putInt(FILE_LOCATION_CARD_VIEW, fileLocationCardView.getVisibility());
savedInstanceState.putInt(FILE_NAME_LINEARLAYOUT_VISIBILITY, fileNameLinearLayout.getVisibility());
case NO_ENCRYPTION:
try {
// Get an input stream for the file name.
+ // A file may be opened directly once the minimum API >= 29. <https://developer.android.com/reference/kotlin/android/content/ContentResolver#openfile>
InputStream inputStream = getContentResolver().openInputStream(Uri.parse(fileNameString));
// Import the unencrypted file.
try {
// Get the export file output stream.
+ // A file may be opened directly once the minimum API >= 29. <https://developer.android.com/reference/kotlin/android/content/ContentResolver#openfile>
OutputStream exportFileOutputStream = getContentResolver().openOutputStream(Uri.parse(noEncryptionFileNameString));
// Export the unencrypted file.