From 22e1cbb2217a58142322f62a44691182531278d5 Mon Sep 17 00:00:00 2001 From: Thomas Date: Tue, 8 Dec 2020 19:06:56 +0100 Subject: [PATCH] Filter apps --- app/src/amal/res/values/exodus.xml | 2 +- .../exodusprivacy/MainActivity.java | 53 ++++++++++++++++++- .../adapters/ApplicationListAdapter.java | 13 ----- .../fragments/AppListFragment.java | 3 +- .../fragments/ComputeAppListTask.java | 39 +++++++++----- .../exodusprivacy/fragments/HomeFragment.java | 2 +- .../exodusprivacy/manager/NetworkManager.java | 7 +-- app/src/main/res/menu/popup_menu_filter.xml | 22 ++++++++ app/src/main/res/values/strings.xml | 8 +++ 9 files changed, 116 insertions(+), 33 deletions(-) create mode 100644 app/src/main/res/menu/popup_menu_filter.xml diff --git a/app/src/amal/res/values/exodus.xml b/app/src/amal/res/values/exodus.xml index 1238531..1e1d806 100644 --- a/app/src/amal/res/values/exodus.xml +++ b/app/src/amal/res/values/exodus.xml @@ -1,6 +1,6 @@ - 9c6106a229bc5f34b5802e5861bcb87d1626617d + 16f8c1a973ecb6622a606daaef35736dc3521e30 AMAL AMAL \ No newline at end of file diff --git a/app/src/main/java/org/eu/exodus_privacy/exodusprivacy/MainActivity.java b/app/src/main/java/org/eu/exodus_privacy/exodusprivacy/MainActivity.java index 8d811be..db25784 100644 --- a/app/src/main/java/org/eu/exodus_privacy/exodusprivacy/MainActivity.java +++ b/app/src/main/java/org/eu/exodus_privacy/exodusprivacy/MainActivity.java @@ -28,8 +28,10 @@ import android.provider.Settings; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; +import android.view.View; import android.view.inputmethod.InputMethodManager; import android.widget.ImageView; +import android.widget.PopupMenu; import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.widget.SearchView; @@ -43,6 +45,7 @@ import org.eu.exodus_privacy.exodusprivacy.adapters.ApplicationListAdapter; import org.eu.exodus_privacy.exodusprivacy.adapters.ApplicationViewModel; import org.eu.exodus_privacy.exodusprivacy.adapters.TrackerListAdapter; import org.eu.exodus_privacy.exodusprivacy.databinding.MainBinding; +import org.eu.exodus_privacy.exodusprivacy.fragments.ComputeAppListTask; import org.eu.exodus_privacy.exodusprivacy.fragments.HomeFragment; import org.eu.exodus_privacy.exodusprivacy.fragments.ReportFragment; import org.eu.exodus_privacy.exodusprivacy.fragments.TrackerFragment; @@ -61,6 +64,7 @@ public class MainActivity extends AppCompatActivity { private String packageName; private MainBinding binding; private ApplicationListAdapter.OnAppClickListener onAppClickListener; + private static ComputeAppListTask.order order = ComputeAppListTask.order.DEFAULT; @Override protected void onCreate(Bundle savedInstanceState) { @@ -175,6 +179,7 @@ public class MainActivity extends AppCompatActivity { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.main, menu); MenuItem actionFilterItem = menu.findItem(R.id.action_filter); + searchView = (SearchView) actionFilterItem.getActionView(); searchView.setOnQueryTextFocusChangeListener((v, hasFocus) -> { if (hasFocus) { @@ -208,13 +213,13 @@ public class MainActivity extends AppCompatActivity { return false; } }); - MenuItem settingsMenuItem = menu.findItem(R.id.action_settings); Updatable fragment = fragments.get(fragments.size() - 1); settingsMenuItem.setVisible(fragment instanceof ReportFragment); return true; } + @Override public boolean onOptionsItemSelected(MenuItem item) { if (item.getItemId() == R.id.action_settings) { @@ -227,7 +232,53 @@ public class MainActivity extends AppCompatActivity { bar.show(); } return true; + } else if (item.getItemId() == R.id.action_filter_options) { + View menuItemView = findViewById(R.id.action_filter_options); + PopupMenu popup = new PopupMenu(binding.fragmentContainer.getContext(), menuItemView); + popup.getMenuInflater() + .inflate(R.menu.popup_menu_filter, popup.getMenu()); + MenuItem filterByNameMI = popup.getMenu().findItem(R.id.filter_by_name); + MenuItem lessTrackersMI = popup.getMenu().findItem(R.id.having_less_trackers); + MenuItem mostTrackersMI = popup.getMenu().findItem(R.id.having_most_trackers); + MenuItem lessPermissionsMI = popup.getMenu().findItem(R.id.having_less_permissions); + MenuItem mostPermissionsMI = popup.getMenu().findItem(R.id.having_most_permissions); + switch (order) { + case LESS_TRACKERS: + lessTrackersMI.setChecked(true); + break; + case MOST_TRACKERS: + mostTrackersMI.setChecked(true); + break; + case LESS_PERMISSIONS: + lessPermissionsMI.setChecked(true); + break; + case MOST_PERMISSIONS: + mostPermissionsMI.setChecked(true); + break; + default: + filterByNameMI.setChecked(true); + } + popup.setOnMenuItemClickListener(filter_item -> { + if (filter_item.getItemId() == R.id.filter_by_name) { + order = ComputeAppListTask.order.DEFAULT; + } else if (filter_item.getItemId() == R.id.having_less_trackers) { + order = ComputeAppListTask.order.LESS_TRACKERS; + } else if (filter_item.getItemId() == R.id.having_most_trackers) { + order = ComputeAppListTask.order.MOST_TRACKERS; + } else if (filter_item.getItemId() == R.id.having_most_permissions) { + order = ComputeAppListTask.order.MOST_PERMISSIONS; + } else if (filter_item.getItemId() == R.id.having_less_permissions) { + order = ComputeAppListTask.order.LESS_PERMISSIONS; + } + if (fragments != null && fragments.size() > 0 && fragments.get(0) instanceof HomeFragment) { + HomeFragment home = (HomeFragment) fragments.get(0); + home.displayAppListAsync(order); + } + return false; + }); + popup.show(); } return false; } + } diff --git a/app/src/main/java/org/eu/exodus_privacy/exodusprivacy/adapters/ApplicationListAdapter.java b/app/src/main/java/org/eu/exodus_privacy/exodusprivacy/adapters/ApplicationListAdapter.java index 8e43271..1ecea40 100644 --- a/app/src/main/java/org/eu/exodus_privacy/exodusprivacy/adapters/ApplicationListAdapter.java +++ b/app/src/main/java/org/eu/exodus_privacy/exodusprivacy/adapters/ApplicationListAdapter.java @@ -34,8 +34,6 @@ import org.eu.exodus_privacy.exodusprivacy.objects.Report; import org.eu.exodus_privacy.exodusprivacy.objects.Tracker; import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; import java.util.List; import java.util.Set; import java.util.regex.Pattern; @@ -45,16 +43,6 @@ public class ApplicationListAdapter extends RecyclerView.Adapter alphaPackageComparator = (app1, app2) -> { - if (app1.label != null && app2.label != null) - return app1.label.toString().compareToIgnoreCase(app2.label.toString()); - else if (app2.label != null) - return -1; - else if (app1.label != null) - return 1; - else - return 0; - }; private List applicationViewModels; private Object filter = ""; private AppListFragment.Type filterType = AppListFragment.Type.NAME; @@ -102,7 +90,6 @@ public class ApplicationListAdapter extends RecyclerView.Adapter applications) { applicationViewModels = applications; - Collections.sort(applicationViewModels, alphaPackageComparator); filter(filterType, filter); } diff --git a/app/src/main/java/org/eu/exodus_privacy/exodusprivacy/fragments/AppListFragment.java b/app/src/main/java/org/eu/exodus_privacy/exodusprivacy/fragments/AppListFragment.java index 6a4af55..c9d9183 100644 --- a/app/src/main/java/org/eu/exodus_privacy/exodusprivacy/fragments/AppListFragment.java +++ b/app/src/main/java/org/eu/exodus_privacy/exodusprivacy/fragments/AppListFragment.java @@ -66,11 +66,10 @@ public class AppListFragment extends Fragment { onAppClickListener = listener; } + public void setApplications(List applicationList) { applications = applicationList; if (adapter != null) - - adapter.displayAppList(applications); } diff --git a/app/src/main/java/org/eu/exodus_privacy/exodusprivacy/fragments/ComputeAppListTask.java b/app/src/main/java/org/eu/exodus_privacy/exodusprivacy/fragments/ComputeAppListTask.java index 0346dd9..ef8a605 100644 --- a/app/src/main/java/org/eu/exodus_privacy/exodusprivacy/fragments/ComputeAppListTask.java +++ b/app/src/main/java/org/eu/exodus_privacy/exodusprivacy/fragments/ComputeAppListTask.java @@ -11,10 +11,11 @@ import org.eu.exodus_privacy.exodusprivacy.manager.DatabaseManager; import java.lang.ref.WeakReference; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.Map; -class ComputeAppListTask extends AsyncTask> { +public class ComputeAppListTask extends AsyncTask> { private static final String gStore = "com.android.vending"; private static final String fdroid = "ord.fdroid.fdroid"; @@ -22,15 +23,15 @@ class ComputeAppListTask extends AsyncTask databaseManagerRef; private final WeakReference listenerRef; - List userOrderChoices; + order userOrderChoice; ComputeAppListTask(WeakReference packageManagerRef, WeakReference databaseManagerRef, - WeakReference listenerRef, List orderChoices) { + WeakReference listenerRef, order orderChoice) { this.packageManagerRef = packageManagerRef; this.databaseManagerRef = databaseManagerRef; this.listenerRef = listenerRef; - userOrderChoices = orderChoices; + userOrderChoice = orderChoice; } protected List doInBackground(Void... params) { @@ -44,18 +45,32 @@ class ComputeAppListTask extends AsyncTask order(List vms, order orderChoice) { + if (orderChoice == order.LESS_TRACKERS) { + Collections.sort(vms, (obj1, obj2) -> Integer.compare(obj1.requestedPermissions != null ? obj1.requestedPermissions.length : 0, obj2.requestedPermissions != null ? obj2.requestedPermissions.length : 0)); + Collections.sort(vms, (obj1, obj2) -> Integer.compare(obj1.trackers != null ? obj1.trackers.size() : 0, obj2.trackers != null ? obj2.trackers.size() : 0)); + } else if (orderChoice == order.MOST_TRACKERS) { + Collections.sort(vms, (obj1, obj2) -> Integer.compare(obj2.requestedPermissions != null ? obj2.requestedPermissions.length : 0, obj1.requestedPermissions != null ? obj1.requestedPermissions.length : 0)); + Collections.sort(vms, (obj1, obj2) -> Integer.compare(obj2.trackers != null ? obj2.trackers.size() : 0, obj1.trackers != null ? obj1.trackers.size() : 0)); + } else if (orderChoice == order.LESS_PERMISSIONS) { + Collections.sort(vms, (obj1, obj2) -> Integer.compare(obj1.trackers != null ? obj1.trackers.size() : 0, obj2.trackers != null ? obj2.trackers.size() : 0)); + Collections.sort(vms, (obj1, obj2) -> Integer.compare(obj1.requestedPermissions != null ? obj1.requestedPermissions.length : 0, obj2.requestedPermissions != null ? obj2.requestedPermissions.length : 0)); + } else if (orderChoice == order.MOST_PERMISSIONS) { + Collections.sort(vms, (obj1, obj2) -> Integer.compare(obj2.trackers != null ? obj2.trackers.size() : 0, obj1.trackers != null ? obj1.trackers.size() : 0)); + Collections.sort(vms, (obj1, obj2) -> Integer.compare(obj2.requestedPermissions != null ? obj2.requestedPermissions.length : 0, obj1.requestedPermissions != null ? obj1.requestedPermissions.length : 0)); + } else { + Collections.sort(vms, (obj1, obj2) -> String.valueOf(obj1.label).compareToIgnoreCase(String.valueOf(obj2.label))); } return vms; } - private List order(List vms, List orderChoices) { - List applicationViewModels = new ArrayList<>(); - - - return applicationViewModels; - } public enum order { DEFAULT, diff --git a/app/src/main/java/org/eu/exodus_privacy/exodusprivacy/fragments/HomeFragment.java b/app/src/main/java/org/eu/exodus_privacy/exodusprivacy/fragments/HomeFragment.java index d1d2fd7..90f1d08 100644 --- a/app/src/main/java/org/eu/exodus_privacy/exodusprivacy/fragments/HomeFragment.java +++ b/app/src/main/java/org/eu/exodus_privacy/exodusprivacy/fragments/HomeFragment.java @@ -173,7 +173,7 @@ public class HomeFragment extends Fragment implements ComputeAppListTask.Listene appListFragment.setFilter(AppListFragment.Type.NAME, filter); } - private void displayAppListAsync(List orderList) { + public void displayAppListAsync(ComputeAppListTask.order orderList) { homeBinding.noAppFound.setVisibility(View.GONE); if (applications.isEmpty()) { homeBinding.retrieveApp.setVisibility(View.VISIBLE); diff --git a/app/src/main/java/org/eu/exodus_privacy/exodusprivacy/manager/NetworkManager.java b/app/src/main/java/org/eu/exodus_privacy/exodusprivacy/manager/NetworkManager.java index 7c8a151..0cf1a44 100644 --- a/app/src/main/java/org/eu/exodus_privacy/exodusprivacy/manager/NetworkManager.java +++ b/app/src/main/java/org/eu/exodus_privacy/exodusprivacy/manager/NetworkManager.java @@ -24,6 +24,7 @@ import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.os.Bundle; +import org.eu.exodus_privacy.exodusprivacy.BuildConfig; import org.eu.exodus_privacy.exodusprivacy.R; import org.eu.exodus_privacy.exodusprivacy.Utils; import org.eu.exodus_privacy.exodusprivacy.listener.NetworkListener; @@ -99,7 +100,8 @@ public class NetworkManager { } private static class NetworkProcessingThread extends Thread { - private final String apiUrl = "https://reports.exodus-privacy.eu.org/api/"; + private final String domain = BuildConfig.FLAVOR.compareTo("exodus") == 0 ? "reports.exodus-privacy.eu.org" : "exodus.phm.education.gouv.fr"; + private final String apiUrl = "https://" + domain + "/api/"; private final List messageQueue; private final Semaphore sem; boolean isRunning; @@ -117,7 +119,7 @@ public class NetworkManager { @Override public void run() { isRunning = true; - Message mes = null; + Message mes; while (isRunning) { try { sem.acquire(); @@ -283,7 +285,6 @@ public class NetworkManager { e.printStackTrace(); mes.listener.onError(mes.context.getString(R.string.json_error)); } - object = null; getReports(mes, handles, packages); } mes.listener.onSuccess(); diff --git a/app/src/main/res/menu/popup_menu_filter.xml b/app/src/main/res/menu/popup_menu_filter.xml new file mode 100644 index 0000000..5fff03a --- /dev/null +++ b/app/src/main/res/menu/popup_menu_filter.xml @@ -0,0 +1,22 @@ + + + + + + + + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 04227ad..1386b38 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -53,4 +53,12 @@ Filter Application Settings + + Filter by name + Having most trackers + Having less trackers + Having most permissions + Having less permissions + +