/*
- * Copyright © 2018-2019 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.database.Cursor;
import android.database.MatrixCursor;
import android.os.Bundle;
-import android.preference.PreferenceManager;
import android.view.View;
import android.view.WindowManager;
import android.widget.AdapterView;
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; // The AndroidX toolbar must be used until the minimum API >= 21.
+import androidx.appcompat.widget.Toolbar;
import androidx.fragment.app.DialogFragment;
+import androidx.preference.PreferenceManager;
import com.stoutner.privacybrowser.R;
import com.stoutner.privacybrowser.adapters.RequestsArrayAdapter;
public class RequestsActivity extends AppCompatActivity implements ViewRequestDialog.ViewRequestListener {
// The resource requests are populated by `MainWebViewActivity` before `RequestsActivity` is launched.
- public static ArrayList<String[]> resourceRequests;
+ public static List<String[]> resourceRequests;
- // The list view is used in `onCreate()` and `launchViewRequestDialog()`.
+ // Initialize the class constants.
+ private final String LISTVIEW_POSITION = "listview_position";
+
+ // Define the class views.
private ListView requestsListView;
@Override
// Get a handle for the shared preferences.
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
- // Get the screenshot and theme preferences.
- boolean allowScreenshots = sharedPreferences.getBoolean("allow_screenshots", false);
- boolean darkTheme = sharedPreferences.getBoolean("dark_theme", false);
+ // 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 (!allowScreenshots) {
getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE);
}
- // Set the activity theme.
- if (darkTheme) {
- setTheme(R.style.PrivacyBrowserDark_SecondaryActivity);
- } else {
- setTheme(R.style.PrivacyBrowserLight_SecondaryActivity);
- }
-
// Run the default commands.
super.onCreate(savedInstanceState);
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 AndroidX toolbar until the minimum API is >= 21.
Toolbar toolbar = findViewById(R.id.requests_toolbar);
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
switch ((int) id) {
case 0: // All requests.
// Get an adapter for all the request.
- ArrayAdapter<String[]> allResourceRequestsArrayAdapter = new RequestsArrayAdapter(getApplicationContext(), allResourceRequests);
+ ArrayAdapter<String[]> allResourceRequestsArrayAdapter = new RequestsArrayAdapter(context, allResourceRequests);
// Display the adapter in the list view.
requestsListView.setAdapter(allResourceRequestsArrayAdapter);
case 1: // Default requests.
// Get an adapter for the default requests.
- ArrayAdapter<String[]> defaultResourceRequestsArrayAdapter = new RequestsArrayAdapter(getApplicationContext(), defaultResourceRequests);
+ ArrayAdapter<String[]> defaultResourceRequestsArrayAdapter = new RequestsArrayAdapter(context, defaultResourceRequests);
// Display the adapter in the list view.
requestsListView.setAdapter(defaultResourceRequestsArrayAdapter);
case 2: // Allowed requests.
// Get an adapter for the allowed requests.
- ArrayAdapter<String[]> allowedResourceRequestsArrayAdapter = new RequestsArrayAdapter(getApplicationContext(), allowedResourceRequests);
+ ArrayAdapter<String[]> allowedResourceRequestsArrayAdapter = new RequestsArrayAdapter(context, allowedResourceRequests);
// Display the adapter in the list view.
requestsListView.setAdapter(allowedResourceRequestsArrayAdapter);
case 3: // Third-party requests.
// Get an adapter for the third-party requests.
- ArrayAdapter<String[]> thirdPartyResourceRequestsArrayAdapter = new RequestsArrayAdapter(getApplicationContext(), thirdPartyResourceRequests);
+ ArrayAdapter<String[]> thirdPartyResourceRequestsArrayAdapter = new RequestsArrayAdapter(context, thirdPartyResourceRequests);
//Display the adapter in the list view.
requestsListView.setAdapter(thirdPartyResourceRequestsArrayAdapter);
case 4: // Blocked requests.
// Get an adapter fo the blocked requests.
- ArrayAdapter<String[]> blockedResourceRequestsArrayAdapter = new RequestsArrayAdapter(getApplicationContext(), blockedResourceRequests);
+ ArrayAdapter<String[]> blockedResourceRequestsArrayAdapter = new RequestsArrayAdapter(context, blockedResourceRequests);
// Display the adapter in the list view.
requestsListView.setAdapter(blockedResourceRequestsArrayAdapter);
});
// Create an array adapter with the list of the resource requests.
- ArrayAdapter<String[]> resourceRequestsArrayAdapter = new RequestsArrayAdapter(getApplicationContext(), allResourceRequests);
+ ArrayAdapter<String[]> resourceRequestsArrayAdapter = new RequestsArrayAdapter(context, allResourceRequests);
// Populate the list view with the resource requests adapter.
requestsListView.setAdapter(resourceRequestsArrayAdapter);
// 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) {
DialogFragment viewRequestDialogFragment = ViewRequestDialog.request(id, isLastRequest, selectedRequestStringArray);
viewRequestDialogFragment.show(getSupportFragmentManager(), getString(R.string.request_details));
}
-}
\ No newline at end of file
+}