diff --git a/res/drawable/ic_search_24.xml b/res/drawable/ic_search_24.xml new file mode 100644 index 00000000..a5687c63 --- /dev/null +++ b/res/drawable/ic_search_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/src/org/kde/kdeconnect/Plugins/NotificationsPlugin/NotificationFilterActivity.java b/src/org/kde/kdeconnect/Plugins/NotificationsPlugin/NotificationFilterActivity.java index 738738d8..1fe47981 100644 --- a/src/org/kde/kdeconnect/Plugins/NotificationsPlugin/NotificationFilterActivity.java +++ b/src/org/kde/kdeconnect/Plugins/NotificationsPlugin/NotificationFilterActivity.java @@ -17,6 +17,8 @@ import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.os.Bundle; import android.view.LayoutInflater; +import android.view.Menu; +import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; @@ -27,6 +29,7 @@ import android.widget.ListView; import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.widget.SearchView; import androidx.core.widget.TextViewCompat; import com.google.android.material.materialswitch.MaterialSwitch; @@ -36,9 +39,12 @@ import org.kde.kdeconnect.UserInterface.ThemeUtil; import org.kde.kdeconnect_tp.R; import org.kde.kdeconnect_tp.databinding.ActivityNotificationFilterBinding; +import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Objects; +import java.util.function.IntFunction; +import java.util.function.Predicate; //TODO: Turn this into a PluginSettingsFragment public class NotificationFilterActivity extends AppCompatActivity { @@ -54,18 +60,20 @@ public class NotificationFilterActivity extends AppCompatActivity { boolean isEnabled; } - private AppListInfo[] apps; + // This variable stores all app information and serves as a data source for filtering. + private List mAllApps; + private List apps; // Filtered data. class AppListAdapter extends BaseAdapter { @Override public int getCount() { - return apps.length + 1; + return apps.size() + 1; } @Override public AppListInfo getItem(int position) { - return apps[position - 1]; + return apps.get(position - 1); } @Override @@ -82,10 +90,13 @@ public class NotificationFilterActivity extends AppCompatActivity { if (position == 0) { checkedTextView.setText(R.string.all); TextViewCompat.setCompoundDrawablesRelativeWithIntrinsicBounds(checkedTextView, null, null, null, null); + binding.lvFilterApps.setItemChecked(position, appDatabase.getAllEnabled()); } else { - checkedTextView.setText(apps[position - 1].name); - TextViewCompat.setCompoundDrawablesRelativeWithIntrinsicBounds(checkedTextView, apps[position - 1].icon, null, null, null); + final AppListInfo info = apps.get(position - 1); + checkedTextView.setText(info.name); + TextViewCompat.setCompoundDrawablesRelativeWithIntrinsicBounds(checkedTextView, info.icon, null, null, null); checkedTextView.setCompoundDrawablePadding((int) (8 * getResources().getDisplayMetrics().density)); + binding.lvFilterApps.setItemChecked(position, info.isEnabled); } return view; @@ -116,18 +127,18 @@ public class NotificationFilterActivity extends AppCompatActivity { List appList = packageManager.getInstalledApplications(0); int count = appList.size(); - apps = new AppListInfo[count]; + AppListInfo[] allApps = new AppListInfo[count]; for (int i = 0; i < count; i++) { ApplicationInfo appInfo = appList.get(i); - apps[i] = new AppListInfo(); - apps[i].pkg = appInfo.packageName; - apps[i].name = appInfo.loadLabel(packageManager).toString(); - apps[i].icon = resizeIcon(appInfo.loadIcon(packageManager), 48); - apps[i].isEnabled = appDatabase.isEnabled(appInfo.packageName); + allApps[i] = new AppListInfo(); + allApps[i].pkg = appInfo.packageName; + allApps[i].name = appInfo.loadLabel(packageManager).toString(); + allApps[i].icon = resizeIcon(appInfo.loadIcon(packageManager), 48); + allApps[i].isEnabled = appDatabase.isEnabled(appInfo.packageName); } - - Arrays.sort(apps, (lhs, rhs) -> lhs.name.compareToIgnoreCase(rhs.name)); - + Arrays.sort(allApps, (lhs, rhs) -> lhs.name.compareToIgnoreCase(rhs.name)); + mAllApps = Arrays.asList(allApps); + apps = new ArrayList<>(mAllApps); runOnUiThread(this::displayAppList); }); @@ -152,14 +163,16 @@ public class NotificationFilterActivity extends AppCompatActivity { listView.setOnItemClickListener((adapterView, view, i, l) -> { if (i == 0) { boolean enabled = listView.isItemChecked(0); - for (int j = 0; j < apps.length; j++) { - listView.setItemChecked(j, enabled); + for (int j = 0; j < mAllApps.size(); j++) { + mAllApps.get(j).isEnabled = enabled; } appDatabase.setAllEnabled(enabled); + ((AppListAdapter) adapterView.getAdapter()).notifyDataSetChanged(); } else { boolean checked = listView.isItemChecked(i); - appDatabase.setEnabled(apps[i - 1].pkg, checked); - apps[i - 1].isEnabled = checked; + apps.get(i - 1).isEnabled = checked; + appDatabase.setEnabled(apps.get(i - 1).pkg, checked); + ((AppListAdapter) adapterView.getAdapter()).notifyDataSetChanged(); } }); listView.setOnItemLongClickListener((adapterView, view, i, l) -> { @@ -185,7 +198,7 @@ public class NotificationFilterActivity extends AppCompatActivity { switch (new_i){ case 0: AlertDialog.Builder myBuilder = new AlertDialog.Builder(context); - String packageName = apps[i - 1].pkg; + String packageName = apps.get(i - 1).pkg; View myView = getLayoutInflater().inflate(R.layout.privacy_options, null); CheckBox checkbox_contents = myView.findViewById(R.id.checkbox_contents); @@ -218,8 +231,8 @@ public class NotificationFilterActivity extends AppCompatActivity { }); listView.setItemChecked(0, appDatabase.getAllEnabled()); //"Select all" button - for (int i = 0; i < apps.length; i++) { - listView.setItemChecked(i + 1, apps[i].isEnabled); + for (int i = 0; i < apps.size(); i++) { + listView.setItemChecked(i + 1, apps.get(i).isEnabled); } listView.setVisibility(View.VISIBLE); @@ -246,4 +259,40 @@ public class NotificationFilterActivity extends AppCompatActivity { super.onBackPressed(); return true; } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + super.onCreateOptionsMenu(menu); + MenuItem mitem = menu.add(android.R.string.search_go); + mitem.setIcon(R.drawable.ic_search_24); + mitem.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS); + SearchView searchView = new SearchView(this); + mitem.setActionView(searchView); + searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { + @Override + public boolean onQueryTextSubmit(String query) { + return true; + } + + @Override + public boolean onQueryTextChange(String newText) { + if(mAllApps == null) return false; + apps.clear(); + if(newText.isEmpty()){ + apps.addAll(mAllApps); + } else { + for (AppListInfo s : mAllApps) { + if (s.name.toLowerCase().contains(newText.toLowerCase().trim())) + apps.add(s); + } + } + + ((AppListAdapter) binding.lvFilterApps.getAdapter()).notifyDataSetChanged(); + return true; + } + }); + + + return true; + } }