X-Git-Url: https://gitweb.stoutner.com/?p=PrivacyBrowserAndroid.git;a=blobdiff_plain;f=app%2Fsrc%2Fmain%2Fjava%2Fcom%2Fstoutner%2Fprivacybrowser%2Factivities%2FRequestsActivity.java;h=1dba49a45299caa9d15377f47fd9afffe7654735;hp=71ce3070ab557d01f92f037b3f7d493de3df9539;hb=8142ac5fc2489de735de4b6fa21a1eae733ccfce;hpb=b4fc354bee486a2df17b3aae6760a3c61eba1e97 diff --git a/app/src/main/java/com/stoutner/privacybrowser/activities/RequestsActivity.java b/app/src/main/java/com/stoutner/privacybrowser/activities/RequestsActivity.java index 71ce3070..1dba49a4 100644 --- a/app/src/main/java/com/stoutner/privacybrowser/activities/RequestsActivity.java +++ b/app/src/main/java/com/stoutner/privacybrowser/activities/RequestsActivity.java @@ -1,32 +1,31 @@ /* - * Copyright © 2018 Soren Stoutner . + * Copyright © 2018-2022 Soren Stoutner . * - * This file is part of Privacy Browser . + * This file is part of 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 . + * along with Privacy Browser Android. If not, see . */ package com.stoutner.privacybrowser.activities; import android.content.Context; +import android.content.Intent; +import android.content.SharedPreferences; import android.database.Cursor; import android.database.MatrixCursor; import android.os.Bundle; -import android.support.v7.app.ActionBar; -import android.support.v7.app.AppCompatActivity; -import android.support.v7.app.AppCompatDialogFragment; -import android.support.v7.widget.Toolbar; +import android.preference.PreferenceManager; import android.view.View; import android.view.WindowManager; import android.widget.AdapterView; @@ -36,40 +35,66 @@ import android.widget.ResourceCursorAdapter; import android.widget.Spinner; import android.widget.TextView; +import androidx.annotation.NonNull; +import androidx.appcompat.app.ActionBar; +import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.widget.Toolbar; +import androidx.fragment.app.DialogFragment; + import com.stoutner.privacybrowser.R; import com.stoutner.privacybrowser.adapters.RequestsArrayAdapter; import com.stoutner.privacybrowser.dialogs.ViewRequestDialog; +import com.stoutner.privacybrowser.helpers.BlocklistHelper; import java.util.ArrayList; import java.util.List; public class RequestsActivity extends AppCompatActivity implements ViewRequestDialog.ViewRequestListener { - // The list view is used in `onCreate()` and `launchViewRequestDialog()`. + // The resource requests are populated by `MainWebViewActivity` before `RequestsActivity` is launched. + public static List resourceRequests; + + // Initialize the class constants. + private final String LISTVIEW_POSITION = "listview_position"; + + // Define the class views. private ListView requestsListView; @Override public void onCreate(Bundle savedInstanceState) { + // Get a handle for the shared preferences. + SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); + + // Get the preferences. + boolean allowScreenshots = sharedPreferences.getBoolean(getString(R.string.allow_screenshots_key), false); + boolean bottomAppBar = sharedPreferences.getBoolean(getString(R.string.bottom_app_bar_key), false); + // Disable screenshots if not allowed. - if (!MainWebViewActivity.allowScreenshots) { + if (!allowScreenshots) { getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE); } - // Set the activity theme. - if (MainWebViewActivity.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); + // Get the launching intent + Intent intent = getIntent(); + + // Get the status of the third-party blocklist. + boolean blockAllThirdPartyRequests = intent.getBooleanExtra("block_all_third_party_requests", false); + // Set the content view. - setContentView(R.layout.requests_coordinatorlayout); + if (bottomAppBar) { + setContentView(R.layout.requests_bottom_appbar); + } else { + setContentView(R.layout.requests_top_appbar); + } - // Use the `SupportActionBar` from `android.support.v7.app.ActionBar` until the minimum API is >= 21. - Toolbar requestsAppBar = findViewById(R.id.requests_toolbar); - setSupportActionBar(requestsAppBar); + // Use the AndroidX toolbar until the minimum API is >= 21. + Toolbar toolbar = findViewById(R.id.requests_toolbar); + setSupportActionBar(toolbar); // Get a handle for the app bar and the list view. ActionBar appBar = getSupportActionBar(); @@ -90,9 +115,9 @@ public class RequestsActivity extends AppCompatActivity implements ViewRequestDi List blockedResourceRequests = new ArrayList<>(); // Populate the resource array lists. - for (String[] request : MainWebViewActivity.resourceRequests) { - switch (Integer.valueOf(request[MainWebViewActivity.REQUEST_DISPOSITION])) { - case MainWebViewActivity.REQUEST_DEFAULT: + for (String[] request : resourceRequests) { + switch (request[BlocklistHelper.REQUEST_DISPOSITION]) { + case BlocklistHelper.REQUEST_DEFAULT: // Add the request to the list of all requests. allResourceRequests.add(request); @@ -100,7 +125,7 @@ public class RequestsActivity extends AppCompatActivity implements ViewRequestDi defaultResourceRequests.add(request); break; - case MainWebViewActivity.REQUEST_ALLOWED: + case BlocklistHelper.REQUEST_ALLOWED: // Add the request to the list of all requests. allResourceRequests.add(request); @@ -108,7 +133,7 @@ public class RequestsActivity extends AppCompatActivity implements ViewRequestDi allowedResourceRequests.add(request); break; - case MainWebViewActivity.REQUEST_THIRD_PARTY: + case BlocklistHelper.REQUEST_THIRD_PARTY: // Add the request to the list of all requests. allResourceRequests.add(request); @@ -116,7 +141,7 @@ public class RequestsActivity extends AppCompatActivity implements ViewRequestDi thirdPartyResourceRequests.add(request); break; - case MainWebViewActivity.REQUEST_BLOCKED: + case BlocklistHelper.REQUEST_BLOCKED: // Add the request to the list of all requests. allResourceRequests.add(request); @@ -131,13 +156,13 @@ public class RequestsActivity extends AppCompatActivity implements ViewRequestDi spinnerCursor.addRow(new Object[]{0, getString(R.string.all) + " - " + allResourceRequests.size()}); spinnerCursor.addRow(new Object[]{1, getString(R.string.default_label) + " - " + defaultResourceRequests.size()}); spinnerCursor.addRow(new Object[]{2, getString(R.string.allowed_plural) + " - " + allowedResourceRequests.size()}); - if (MainWebViewActivity.blockAllThirdPartyRequests) { + if (blockAllThirdPartyRequests) { spinnerCursor.addRow(new Object[]{3, getString(R.string.third_party_plural) + " - " + thirdPartyResourceRequests.size()}); } spinnerCursor.addRow(new Object[]{4, getString(R.string.blocked_plural) + " - " + blockedResourceRequests.size()}); // Create a resource cursor adapter for the spinner. - ResourceCursorAdapter spinnerCursorAdapter = new ResourceCursorAdapter(this, R.layout.appbar_spinner_item, spinnerCursor, 0) { + ResourceCursorAdapter spinnerCursorAdapter = new ResourceCursorAdapter(this, R.layout.requests_appbar_spinner_item, spinnerCursor, 0) { @Override public void bindView(View view, Context context, Cursor cursor) { // Get a handle for the spinner item text view. @@ -149,12 +174,15 @@ public class RequestsActivity extends AppCompatActivity implements ViewRequestDi }; // Set the resource cursor adapter drop down view resource. - spinnerCursorAdapter.setDropDownViewResource(R.layout.appbar_spinner_dropdown_item); + spinnerCursorAdapter.setDropDownViewResource(R.layout.requests_appbar_spinner_dropdown_item); // Get a handle for the app bar spinner and set the adapter. Spinner appBarSpinner = findViewById(R.id.spinner); appBarSpinner.setAdapter(spinnerCursorAdapter); + // Get a handle for the context. + Context context = this; + // Handle clicks on the spinner dropdown. appBarSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override @@ -162,7 +190,7 @@ public class RequestsActivity extends AppCompatActivity implements ViewRequestDi switch ((int) id) { case 0: // All requests. // Get an adapter for all the request. - ArrayAdapter allResourceRequestsArrayAdapter = new RequestsArrayAdapter(getApplicationContext(), allResourceRequests); + ArrayAdapter allResourceRequestsArrayAdapter = new RequestsArrayAdapter(context, allResourceRequests); // Display the adapter in the list view. requestsListView.setAdapter(allResourceRequestsArrayAdapter); @@ -170,7 +198,7 @@ public class RequestsActivity extends AppCompatActivity implements ViewRequestDi case 1: // Default requests. // Get an adapter for the default requests. - ArrayAdapter defaultResourceRequestsArrayAdapter = new RequestsArrayAdapter(getApplicationContext(), defaultResourceRequests); + ArrayAdapter defaultResourceRequestsArrayAdapter = new RequestsArrayAdapter(context, defaultResourceRequests); // Display the adapter in the list view. requestsListView.setAdapter(defaultResourceRequestsArrayAdapter); @@ -178,7 +206,7 @@ public class RequestsActivity extends AppCompatActivity implements ViewRequestDi case 2: // Allowed requests. // Get an adapter for the allowed requests. - ArrayAdapter allowedResourceRequestsArrayAdapter = new RequestsArrayAdapter(getApplicationContext(), allowedResourceRequests); + ArrayAdapter allowedResourceRequestsArrayAdapter = new RequestsArrayAdapter(context, allowedResourceRequests); // Display the adapter in the list view. requestsListView.setAdapter(allowedResourceRequestsArrayAdapter); @@ -186,7 +214,7 @@ public class RequestsActivity extends AppCompatActivity implements ViewRequestDi case 3: // Third-party requests. // Get an adapter for the third-party requests. - ArrayAdapter thirdPartyResourceRequestsArrayAdapter = new RequestsArrayAdapter(getApplicationContext(), thirdPartyResourceRequests); + ArrayAdapter thirdPartyResourceRequestsArrayAdapter = new RequestsArrayAdapter(context, thirdPartyResourceRequests); //Display the adapter in the list view. requestsListView.setAdapter(thirdPartyResourceRequestsArrayAdapter); @@ -194,7 +222,7 @@ public class RequestsActivity extends AppCompatActivity implements ViewRequestDi case 4: // Blocked requests. // Get an adapter fo the blocked requests. - ArrayAdapter blockedResourceRequestsArrayAdapter = new RequestsArrayAdapter(getApplicationContext(), blockedResourceRequests); + ArrayAdapter blockedResourceRequestsArrayAdapter = new RequestsArrayAdapter(context, blockedResourceRequests); // Display the adapter in the list view. requestsListView.setAdapter(blockedResourceRequestsArrayAdapter); @@ -209,7 +237,7 @@ public class RequestsActivity extends AppCompatActivity implements ViewRequestDi }); // Create an array adapter with the list of the resource requests. - ArrayAdapter resourceRequestsArrayAdapter = new RequestsArrayAdapter(getApplicationContext(), allResourceRequests); + ArrayAdapter resourceRequestsArrayAdapter = new RequestsArrayAdapter(context, allResourceRequests); // Populate the list view with the resource requests adapter. requestsListView.setAdapter(resourceRequestsArrayAdapter); @@ -219,18 +247,36 @@ public class RequestsActivity extends AppCompatActivity implements ViewRequestDi // Display the view request dialog. The list view is 0 based, so the position must be incremented by 1. launchViewRequestDialog(position + 1); }); + + // Check to see if the activity has been restarted. + if (savedInstanceState != null) { + // Scroll to the saved position. + requestsListView.post(() -> requestsListView.setSelection(savedInstanceState.getInt(LISTVIEW_POSITION))); + } + } + + @Override + public void onSaveInstanceState(@NonNull Bundle savedInstanceState) { + // Run the default commands. + super.onSaveInstanceState(savedInstanceState); + + // Get the listview position. + int listViewPosition = requestsListView.getFirstVisiblePosition(); + + // Store the listview position in the bundle. + savedInstanceState.putInt(LISTVIEW_POSITION, listViewPosition); } @Override - public void onPrevious(int id) { + public void onPrevious(int currentId) { // Show the previous dialog. - launchViewRequestDialog(id -1); + launchViewRequestDialog(currentId -1); } @Override - public void onNext(int id) { + public void onNext(int currentId) { // Show the next dialog. - launchViewRequestDialog(id + 1); + launchViewRequestDialog(currentId + 1); } private void launchViewRequestDialog(int id) { @@ -244,7 +290,7 @@ public class RequestsActivity extends AppCompatActivity implements ViewRequestDi assert selectedRequestStringArray != null; // Show the request detail dialog. - AppCompatDialogFragment viewRequestDialogFragment = ViewRequestDialog.request(id, isLastRequest, selectedRequestStringArray); + DialogFragment viewRequestDialogFragment = ViewRequestDialog.request(id, isLastRequest, selectedRequestStringArray); viewRequestDialogFragment.show(getSupportFragmentManager(), getString(R.string.request_details)); } } \ No newline at end of file