diff --git a/app/src/main/java/com/emanuelef/remote_capture/Utils.java b/app/src/main/java/com/emanuelef/remote_capture/Utils.java index d3b25d80..22c5b70b 100644 --- a/app/src/main/java/com/emanuelef/remote_capture/Utils.java +++ b/app/src/main/java/com/emanuelef/remote_capture/Utils.java @@ -66,6 +66,7 @@ import android.text.TextUtils; import android.text.method.LinkMovementMethod; import android.text.style.StyleSpan; import android.util.Log; +import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; @@ -1274,4 +1275,16 @@ public class Utils { } else man.notify(id, notification); } + + // Set the SearchView query and expand it + public static void setSearchQuery(SearchView searchView, MenuItem searchItem, String query) { + searchView.setIconified(false); + searchItem.expandActionView(); + + searchView.setIconified(false); + searchItem.expandActionView(); + + // Delay otherwise the query won't be set when the activity is just started + searchView.post(() -> searchView.setQuery(query, true)); + } } diff --git a/app/src/main/java/com/emanuelef/remote_capture/activities/VpnExceptionsActivity.java b/app/src/main/java/com/emanuelef/remote_capture/activities/VpnExceptionsActivity.java index a5177319..4de648bb 100644 --- a/app/src/main/java/com/emanuelef/remote_capture/activities/VpnExceptionsActivity.java +++ b/app/src/main/java/com/emanuelef/remote_capture/activities/VpnExceptionsActivity.java @@ -37,17 +37,30 @@ import java.util.HashSet; import java.util.Set; public class VpnExceptionsActivity extends BaseActivity { + private VpnExceptionsFragment mFragment; + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setTitle(R.string.vpn_exceptions); setContentView(R.layout.fragment_activity); + if(savedInstanceState != null) + mFragment = (VpnExceptionsFragment) getSupportFragmentManager().getFragment(savedInstanceState, "fragment"); + if(mFragment == null) + mFragment = new VpnExceptionsFragment(); + getSupportFragmentManager().beginTransaction() - .replace(R.id.fragment, new VpnExceptionsFragment()) + .replace(R.id.fragment, mFragment) .commit(); } + @Override + protected void onSaveInstanceState(@NonNull Bundle outState) { + super.onSaveInstanceState(outState); + getSupportFragmentManager().putFragment(outState, "fragment", mFragment); + } + public static class VpnExceptionsFragment extends AppsToggles { private static final String TAG = "VpnExceptions"; private final Set mExcludedApps = new HashSet<>(); diff --git a/app/src/main/java/com/emanuelef/remote_capture/fragments/AppsToggles.java b/app/src/main/java/com/emanuelef/remote_capture/fragments/AppsToggles.java index 15f44b1f..f54eb405 100644 --- a/app/src/main/java/com/emanuelef/remote_capture/fragments/AppsToggles.java +++ b/app/src/main/java/com/emanuelef/remote_capture/fragments/AppsToggles.java @@ -20,9 +20,11 @@ package com.emanuelef.remote_capture.fragments; import android.os.Bundle; +import android.util.Log; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; +import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; @@ -35,6 +37,7 @@ import androidx.fragment.app.Fragment; import com.emanuelef.remote_capture.AppsLoader; import com.emanuelef.remote_capture.R; +import com.emanuelef.remote_capture.Utils; import com.emanuelef.remote_capture.adapters.AppsTogglesAdapter; import com.emanuelef.remote_capture.interfaces.AppsLoadListener; import com.emanuelef.remote_capture.model.AppDescriptor; @@ -47,9 +50,11 @@ import kotlin.NotImplementedError; public abstract class AppsToggles extends Fragment implements AppsLoadListener, AppsTogglesAdapter.AppToggleListener, SearchView.OnQueryTextListener { + private static final String TAG = "AppsToggles"; private AppsTogglesAdapter mAdapter; private SearchView mSearchView; private TextView mEmptyText; + private String mQueryToApply; @Override public View onCreateView(LayoutInflater inflater, @@ -71,16 +76,50 @@ public abstract class AppsToggles extends Fragment implements AppsLoadListener, mEmptyText.setText(R.string.loading_apps); recyclerView.setEmptyView(mEmptyText); + if(savedInstanceState != null) { + String filter = savedInstanceState.getString("filter"); + if((filter != null) && !filter.isEmpty()) + mQueryToApply = filter; + } + + Log.d(TAG, "mQueryToApply: " + mQueryToApply); + (new AppsLoader((AppCompatActivity) requireActivity())) .setAppsLoadListener(this) .loadAllApps(); } + @Override + public void onPause() { + super.onPause(); + + if(mSearchView != null) + mQueryToApply = mSearchView.getQuery().toString(); + } + @Override public void onCreateOptionsMenu(@NonNull Menu menu, MenuInflater menuInflater) { menuInflater.inflate(R.menu.search_menu, menu); - mSearchView = (SearchView) menu.findItem(R.id.search).getActionView(); + MenuItem searchItem = menu.findItem(R.id.search); + mSearchView = (SearchView) searchItem.getActionView(); mSearchView.setOnQueryTextListener(this); + + if((mQueryToApply != null) && (!mQueryToApply.isEmpty())) { + Log.d(TAG, "Initial filter: " + mQueryToApply); + Utils.setSearchQuery(mSearchView, searchItem, mQueryToApply); + } + } + + @Override + public void onSaveInstanceState(@NonNull Bundle outState) { + super.onSaveInstanceState(outState); + + // this is complemented by the activity onSaveInstanceState + if(mSearchView != null) { + String query = mSearchView.getQuery().toString(); + Log.d(TAG, "Saving filter: " + query); + outState.putString("filter", query); + } } @Override diff --git a/app/src/main/java/com/emanuelef/remote_capture/fragments/ConnectionsFragment.java b/app/src/main/java/com/emanuelef/remote_capture/fragments/ConnectionsFragment.java index 1d204b8c..199dad8a 100644 --- a/app/src/main/java/com/emanuelef/remote_capture/fragments/ConnectionsFragment.java +++ b/app/src/main/java/com/emanuelef/remote_capture/fragments/ConnectionsFragment.java @@ -556,14 +556,7 @@ public class ConnectionsFragment extends Fragment implements ConnectionsListener } private void setQuery(String query) { - mSearchView.setIconified(false); - mMenuItemSearch.expandActionView(); - - mSearchView.setIconified(false); - mMenuItemSearch.expandActionView(); - - // Delay otherwise the query won't be set when the activity is just started. - mSearchView.post(() -> mSearchView.setQuery(query, true)); + Utils.setSearchQuery(mSearchView, mMenuItemSearch, query); } private void recheckScroll() { diff --git a/app/src/main/res/layout/app_selection_item.xml b/app/src/main/res/layout/app_selection_item.xml index f0962b5c..08a21ec0 100644 --- a/app/src/main/res/layout/app_selection_item.xml +++ b/app/src/main/res/layout/app_selection_item.xml @@ -4,7 +4,8 @@ android:layout_width="match_parent" android:background="?attr/selectableItemBackground" android:orientation="horizontal" - android:padding="4dp" + android:paddingHorizontal="4dp" + android:paddingVertical="8dp" android:gravity="center_vertical" android:layout_height="wrap_content"> diff --git a/app/src/main/res/menu/search_menu.xml b/app/src/main/res/menu/search_menu.xml index dd5b4f47..7a7aea91 100644 --- a/app/src/main/res/menu/search_menu.xml +++ b/app/src/main/res/menu/search_menu.xml @@ -3,13 +3,10 @@ xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> - + app:showAsAction="ifRoom" /> \ No newline at end of file