Keep search query on screen rotation in VPN exceptions

This commit is contained in:
emanuele-f 2022-07-05 18:41:02 +02:00
parent 7b15559d07
commit a620d914b7
6 changed files with 71 additions and 15 deletions

View File

@ -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));
}
}

View File

@ -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<String> mExcludedApps = new HashSet<>();

View File

@ -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

View File

@ -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() {

View File

@ -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">

View File

@ -3,13 +3,10 @@
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<!-- NOTE: "always|collapseActionView" must be set to prevent the search button from
disappearing and to avoid hiding the other elements. -->
<item
android:id="@+id/search"
android:title="@string/search"
android:icon="@drawable/ic_search"
app:actionViewClass="androidx.appcompat.widget.SearchView"
app:showAsAction="always|collapseActionView"
tools:ignore="AlwaysShowAction" />
app:showAsAction="ifRoom" />
</menu>