]> gitweb.stoutner.com Git - PrivacyBrowserAndroid.git/blobdiff - app/src/main/java/com/stoutner/privacybrowser/activities/LogcatActivity.java
Switch to the new Day/Night theme. https://redmine.stoutner.com/issues/522
[PrivacyBrowserAndroid.git] / app / src / main / java / com / stoutner / privacybrowser / activities / LogcatActivity.java
index 46c0a88a837c86987748dd8938da3cf2589c963f..de0b873d8afa276757553de795f286c3bf3ed16c 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright © 2019 Soren Stoutner <soren@stoutner.com>.
+ * Copyright © 2019-2020 Soren Stoutner <soren@stoutner.com>.
  *
  * This file is part of Privacy Browser <https://www.stoutner.com/privacy-browser>.
  *
@@ -27,14 +27,16 @@ import android.content.ClipboardManager;
 import android.content.Intent;
 import android.content.SharedPreferences;
 import android.content.pm.PackageManager;
+import android.content.res.Configuration;
 import android.media.MediaScannerConnection;
 import android.net.Uri;
 import android.os.AsyncTask;
 import android.os.Bundle;
-import android.os.Environment;
 import android.preference.PreferenceManager;
+import android.util.TypedValue;
 import android.view.Menu;
 import android.view.MenuItem;
+import android.view.View;
 import android.view.WindowManager;
 import android.widget.EditText;
 import android.widget.TextView;
@@ -42,16 +44,18 @@ import android.widget.TextView;
 import androidx.annotation.NonNull;
 import androidx.appcompat.app.ActionBar;
 import androidx.appcompat.app.AppCompatActivity;
-import androidx.appcompat.widget.Toolbar;  // The AndroidX toolbar must be used until the minimum API is >= 21.
+import androidx.appcompat.widget.Toolbar;
 import androidx.core.app.ActivityCompat;
 import androidx.core.content.ContextCompat;
 import androidx.fragment.app.DialogFragment;
 import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
 
 import com.google.android.material.snackbar.Snackbar;
+
 import com.stoutner.privacybrowser.R;
 import com.stoutner.privacybrowser.dialogs.StoragePermissionDialog;
 import com.stoutner.privacybrowser.dialogs.SaveLogcatDialog;
+import com.stoutner.privacybrowser.helpers.FileNameHelper;
 
 import java.io.BufferedReader;
 import java.io.BufferedWriter;
@@ -73,8 +77,7 @@ public class LogcatActivity extends AppCompatActivity implements SaveLogcatDialo
         // 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);
+        // Get the screenshot preference.
         boolean allowScreenshots = sharedPreferences.getBoolean("allow_screenshots", false);
 
         // Disable screenshots if not allowed.
@@ -82,12 +85,8 @@ public class LogcatActivity extends AppCompatActivity implements SaveLogcatDialo
             getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE);
         }
 
-        // Set the activity theme.
-        if (darkTheme) {
-            setTheme(R.style.PrivacyBrowserDark_SecondaryActivity);
-        } else {
-            setTheme(R.style.PrivacyBrowserLight_SecondaryActivity);
-        }
+        // Set the theme.
+        setTheme(R.style.PrivacyBrowser);
 
         // Run the default commands.
         super.onCreate(savedInstanceState);
@@ -95,7 +94,7 @@ public class LogcatActivity extends AppCompatActivity implements SaveLogcatDialo
         // Set the content view.
         setContentView(R.layout.logcat_coordinatorlayout);
 
-        // The AndroidX toolbar must be used until the minimum API is >= 21.
+        // Set the toolbar as the action bar.
         Toolbar toolbar = findViewById(R.id.logcat_toolbar);
         setSupportActionBar(toolbar);
 
@@ -115,14 +114,28 @@ public class LogcatActivity extends AppCompatActivity implements SaveLogcatDialo
             new GetLogcat(this).execute();
         });
 
-        // Set the swipe to refresh color according to the theme.
-        if (darkTheme) {
-            swipeRefreshLayout.setColorSchemeResources(R.color.blue_600);
-            swipeRefreshLayout.setProgressBackgroundColorSchemeResource(R.color.gray_800);
+        // Get the current theme status.
+        int currentThemeStatus = getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK;
+
+        // Set the refresh color scheme according to the theme.
+        if (currentThemeStatus == Configuration.UI_MODE_NIGHT_YES) {
+            swipeRefreshLayout.setColorSchemeResources(R.color.blue_500);
         } else {
             swipeRefreshLayout.setColorSchemeResources(R.color.blue_700);
         }
 
+        // Initialize a color background typed value.
+        TypedValue colorBackgroundTypedValue = new TypedValue();
+
+        // Get the color background from the theme.
+        getTheme().resolveAttribute(android.R.attr.colorBackground, colorBackgroundTypedValue, true);
+
+        // Get the color background int from the typed value.
+        int colorBackgroundInt = colorBackgroundTypedValue.data;
+
+        // Set the swipe refresh background color.
+        swipeRefreshLayout.setProgressBackgroundColorSchemeColor(colorBackgroundInt);
+
         // Get the logcat.
         new GetLogcat(this).execute();
     }
@@ -166,7 +179,7 @@ public class LogcatActivity extends AppCompatActivity implements SaveLogcatDialo
                 return true;
 
             case R.id.save:
-                // Get a handle for the save alert dialog.
+                // Instantiate the save alert dialog.
                 DialogFragment saveDialogFragment = new SaveLogcatDialog();
 
                 // Show the save alert dialog.
@@ -200,8 +213,14 @@ public class LogcatActivity extends AppCompatActivity implements SaveLogcatDialo
 
     @Override
     public void onSaveLogcat(DialogFragment dialogFragment) {
+        // Get a handle for the dialog fragment.
+        Dialog dialog = dialogFragment.getDialog();
+
+        // Remove the lint warning below that the dialog fragment might be null.
+        assert dialog != null;
+
         // Get a handle for the file name edit text.
-        EditText fileNameEditText = dialogFragment.getDialog().findViewById(R.id.file_name_edittext);
+        EditText fileNameEditText = dialog.findViewById(R.id.file_name_edittext);
 
         // Get the file path string.
         filePathString = fileNameEditText.getText().toString();
@@ -228,12 +247,12 @@ public class LogcatActivity extends AppCompatActivity implements SaveLogcatDialo
                 // 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));
                 } else {  // Show the permission request directly.
-                    // Request the storage permission.  The logcat will be saved when it finishes.
+                    // Request the write external storage permission.  The logcat will be saved when it finishes.
                     ActivityCompat.requestPermissions(this, new String[] {Manifest.permission.WRITE_EXTERNAL_STORAGE}, 0);
 
                 }
@@ -242,7 +261,7 @@ public class LogcatActivity extends AppCompatActivity implements SaveLogcatDialo
     }
 
     @Override
-    public void onCloseStoragePermissionDialog() {
+    public void onCloseStoragePermissionDialog(int type) {
         // Request the write external storage permission.  The logcat will be saved when it finishes.
         ActivityCompat.requestPermissions(this, new String[] {Manifest.permission.WRITE_EXTERNAL_STORAGE}, 0);
     }
@@ -312,6 +331,9 @@ public class LogcatActivity extends AppCompatActivity implements SaveLogcatDialo
     // The activity result is called after browsing for a file in the save alert dialog.
     @Override
     public void onActivityResult(int requestCode, int resultCode, Intent data) {
+        // Run the default commands.
+        super.onActivityResult(requestCode, resultCode, data);
+
         // Don't do anything if the user pressed back from the file picker.
         if (resultCode == Activity.RESULT_OK) {
             // Get a handle for the save dialog fragment.
@@ -322,65 +344,32 @@ public class LogcatActivity extends AppCompatActivity implements SaveLogcatDialo
                 // Get a handle for the save dialog.
                 Dialog saveDialog = saveDialogFragment.getDialog();
 
-                // Get a handle for the file name edit text.
+                // Remove the lint warning below that the save dialog might be null.
+                assert saveDialog != null;
+
+                // Get a handle for the dialog views.
                 EditText fileNameEditText = saveDialog.findViewById(R.id.file_name_edittext);
+                TextView fileExistsWarningTextView = saveDialog.findViewById(R.id.file_exists_warning_textview);
+
+                // Instantiate the file name helper.
+                FileNameHelper fileNameHelper = new FileNameHelper();
+
+                // Get the file name URI from the intent.
+                Uri fileNameUri= data.getData();
 
-                // Get the file name URI.
-                Uri fileNameUri = data.getData();
-
-                // Remove the incorrect 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);
-
-                    // Create the file name path string.
-                    String fileNamePath;
-
-                    // Check to see if the current file name final patch is a complete, valid path
-                    if (fileNameFinalPath.startsWith("/storage/emulated/")) {  // The existing file name final path is a complete, valid path.
-                        // Use the provided file name path as is.
-                        fileNamePath = fileNameFinalPath;
-                    } else { // The existing file name final path is not a complete, valid path.
-                        // 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;
-
-                            // 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;
-                        }
-                    }
+                // Process the file name URI if it is not null.
+                if (fileNameUri != null) {
+                    // Convert the file name URI to a file name path.
+                    String fileNamePath = fileNameHelper.convertUriToFileNamePath(fileNameUri);
 
                     // Set the file name path as the text of the file name edit text.
                     fileNameEditText.setText(fileNamePath);
-                } else {  // The path is invalid.
-                    // Close the alert dialog.
-                    saveDialog.dismiss();
 
-                    // Get a handle for the logcat text view.
-                    TextView logcatTextView = findViewById(R.id.logcat_textview);
+                    // Move the cursor to the end of the file name edit text.
+                    fileNameEditText.setSelection(fileNamePath.length());
 
-                    // Display a snackbar with the error message.
-                    Snackbar.make(logcatTextView, rawFileNamePath + " " + getString(R.string.invalid_location), Snackbar.LENGTH_INDEFINITE).show();
+                    // Hide the file exists warning.
+                    fileExistsWarningTextView.setVisibility(View.GONE);
                 }
             }
         }