diff --git a/app/src/amal/res/values/colors.xml b/app/src/amal/res/values/colors.xml index afd9fd2..cd80a80 100644 --- a/app/src/amal/res/values/colors.xml +++ b/app/src/amal/res/values/colors.xml @@ -3,7 +3,7 @@ #005e8b #3d2b43 #007bff - + #77005e8b #6fc384 #e46772 #ffdb66 diff --git a/app/src/exodus/res/values/colors.xml b/app/src/exodus/res/values/colors.xml index ca2db61..7e963ad 100644 --- a/app/src/exodus/res/values/colors.xml +++ b/app/src/exodus/res/values/colors.xml @@ -3,6 +3,7 @@ #684971 #3d2b43 #3d2b43 + #77684971 #6fc384 #e46772 diff --git a/app/src/main/java/org/eu/exodus_privacy/exodusprivacy/CheckAppActivity.java b/app/src/main/java/org/eu/exodus_privacy/exodusprivacy/CheckAppActivity.java index cc320bf..2a1cbaf 100644 --- a/app/src/main/java/org/eu/exodus_privacy/exodusprivacy/CheckAppActivity.java +++ b/app/src/main/java/org/eu/exodus_privacy/exodusprivacy/CheckAppActivity.java @@ -51,8 +51,6 @@ public class CheckAppActivity extends AppCompatActivity implements NetworkListen private static final Pattern fdroidRegex = Pattern.compile("https?://f-droid\\.org/([\\w-]+/)?packages/([\\w.-]+)"); private static final Pattern googleRegex = Pattern.compile("https?://play\\.google\\.com/store/apps/details\\?id=([\\w.-]+)"); - private String app_id; - ArrayList fragments; AppCheckActivityBinding binding; TrackerListAdapter.OnTrackerClickListener onTrackerClickListener = id -> { @@ -65,6 +63,7 @@ public class CheckAppActivity extends AppCompatActivity implements NetworkListen .addToBackStack(null) .commit(); }; + private String app_id; private TrackerListAdapter.OnTrackerClickListener trackerClickListener; @Override 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 ced7510..404ffc9 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 @@ -72,8 +72,6 @@ public class MainActivity extends AppCompatActivity { private Menu toolbarMenu; private String packageName; private MainBinding binding; - private ApplicationListAdapter.OnAppClickListener onAppClickListener; - private String previousQuery = ""; private final BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener = item -> { int itemId = item.getItemId(); @@ -84,6 +82,9 @@ public class MainActivity extends AppCompatActivity { } return true; }; + private ApplicationListAdapter.OnAppClickListener onAppClickListener; + private TrackerListAdapter.OnTrackerClickListener onTrackerClickListener; + private String previousQuery = ""; private HomeFragment home; @Override @@ -142,13 +143,19 @@ public class MainActivity extends AppCompatActivity { binding.viewpager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { - } @Override public void onPageSelected(int position) { MenuItem item = binding.navView.getMenu().getItem(position); binding.navView.setSelectedItemId(item.getItemId()); + if (binding.fragmentContainer.getVisibility() == View.VISIBLE) { + while (fragments.size() > 0) { + getSupportFragmentManager().popBackStack(); + fragments.remove(fragments.size() - 1); + } + binding.fragmentContainer.setVisibility(View.GONE); + } } @Override @@ -157,18 +164,20 @@ public class MainActivity extends AppCompatActivity { } }); - TrackerListAdapter.OnTrackerClickListener onTrackerClickListener = id -> { + onTrackerClickListener = id -> { TrackerFragment tracker = TrackerFragment.newInstance(id); tracker.setOnAppClickListener(onAppClickListener); fragments.add(tracker); FragmentManager manager = getSupportFragmentManager(); FragmentTransaction transaction = manager.beginTransaction(); + binding.fragmentContainer.setVisibility(View.VISIBLE); transaction.setCustomAnimations(R.anim.slide_in_right, R.anim.slide_out_right, R.anim.slide_in_left, R.anim.slide_out_left) .replace(R.id.fragment_container, tracker) .addToBackStack(null) .commit(); }; + onAppClickListener = (vm) -> { try { @@ -256,8 +265,10 @@ public class MainActivity extends AppCompatActivity { } }); MenuItem settingsMenuItem = menu.findItem(R.id.action_settings); - Updatable fragment = fragments.get(fragments.size() - 1); - settingsMenuItem.setVisible(fragment instanceof ReportFragment); + if (fragments.size() > 0) { + Updatable fragment = fragments.get(fragments.size() - 1); + settingsMenuItem.setVisible(fragment instanceof ReportFragment); + } return true; } @@ -331,9 +342,12 @@ public class MainActivity extends AppCompatActivity { @NonNull @Override public Fragment getItem(final int position) { + //noinspection SwitchStatementWithTooFewBranches switch (position) { case 1: - return new MyTrackersFragment(); + MyTrackersFragment myTrackersFragment = new MyTrackersFragment(); + myTrackersFragment.setOnTrackerClickListener(onTrackerClickListener); + return myTrackersFragment; default: return home; } diff --git a/app/src/main/java/org/eu/exodus_privacy/exodusprivacy/Utils.java b/app/src/main/java/org/eu/exodus_privacy/exodusprivacy/Utils.java index 182e208..b66bc97 100644 --- a/app/src/main/java/org/eu/exodus_privacy/exodusprivacy/Utils.java +++ b/app/src/main/java/org/eu/exodus_privacy/exodusprivacy/Utils.java @@ -5,7 +5,9 @@ import android.content.Context; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.Signature; +import android.content.res.Resources; import android.os.Build; +import android.util.DisplayMetrics; import java.io.ByteArrayInputStream; import java.io.InputStream; @@ -16,14 +18,8 @@ import java.security.cert.CertificateFactory; import java.security.cert.X509Certificate; import java.text.SimpleDateFormat; import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; import java.util.Date; -import java.util.LinkedHashMap; -import java.util.LinkedList; -import java.util.List; import java.util.Locale; -import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -289,15 +285,16 @@ public class Utils { } - public static Map sortByValue(Map map) { - List> list = new LinkedList<>(map.entrySet()); - Collections.sort(list, (Comparator) (o1, o2) -> ((Comparable) ((Map.Entry) (o1)).getValue()).compareTo(((Map.Entry) (o2)).getValue())); - - Map result = new LinkedHashMap<>(); - for (Map.Entry entry : list) { - result.put(entry.getKey(), entry.getValue()); - } - - return result; + /** + * Converts dp to pixel + * + * @param dp float - the value in dp to convert + * @param context Context + * @return float - the converted value in pixel + */ + public static float convertDpToPixel(float dp, Context context) { + Resources resources = context.getResources(); + DisplayMetrics metrics = resources.getDisplayMetrics(); + return dp * ((float) metrics.densityDpi / DisplayMetrics.DENSITY_DEFAULT); } } diff --git a/app/src/main/java/org/eu/exodus_privacy/exodusprivacy/adapters/MyTrackersListAdapter.java b/app/src/main/java/org/eu/exodus_privacy/exodusprivacy/adapters/MyTrackersListAdapter.java index 6936a94..0cee64c 100644 --- a/app/src/main/java/org/eu/exodus_privacy/exodusprivacy/adapters/MyTrackersListAdapter.java +++ b/app/src/main/java/org/eu/exodus_privacy/exodusprivacy/adapters/MyTrackersListAdapter.java @@ -19,6 +19,7 @@ package org.eu.exodus_privacy.exodusprivacy.adapters; import android.view.LayoutInflater; import android.view.ViewGroup; +import android.view.ViewTreeObserver; import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; @@ -26,9 +27,7 @@ import androidx.recyclerview.widget.RecyclerView; import org.eu.exodus_privacy.exodusprivacy.R; import org.eu.exodus_privacy.exodusprivacy.databinding.MyTrackerItemBinding; import org.eu.exodus_privacy.exodusprivacy.objects.MyTracker; -import org.eu.exodus_privacy.exodusprivacy.objects.Tracker; -import java.util.ArrayList; import java.util.List; @@ -36,13 +35,13 @@ public class MyTrackersListAdapter extends RecyclerView.Adapter myTrackers; - private List trackersList; + private final int max; + private int viewWidth = 0; - public MyTrackersListAdapter(List mTrackers, TrackerClickListener listener) { + public MyTrackersListAdapter(List mTrackers, TrackerClickListener listener, int maxValue) { myTrackers = mTrackers; - setTrackers(mTrackers); trackerClickListener = listener; - + max = maxValue; } @NonNull @@ -54,35 +53,33 @@ public class MyTrackersListAdapter extends RecyclerView.Adapter trackerClickListener.onTrackerClick(tracker.id)); + MyTracker myTracker = myTrackers.get(position); + if (myTrackers != null) { + holder.viewDataBinding.trackerName.setText(myTracker.tracker.name); + holder.viewDataBinding.trackerCount.setText(String.valueOf(myTracker.number)); + holder.viewDataBinding.getRoot().setOnClickListener(v -> { + trackerClickListener.onTrackerClick(myTracker.tracker.id); + }); + float percent = (float) myTracker.number / max; + holder.viewDataBinding.percent.getLayoutParams().width = (int) (viewWidth * percent); + holder.viewDataBinding.percentVal.setText(String.format("%s %%", myTracker.number * 100 / myTrackers.size())); + holder.viewDataBinding.percent.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { + @Override + public void onGlobalLayout() { + holder.viewDataBinding.percent.getViewTreeObserver().removeOnGlobalLayoutListener(this); + if (viewWidth == 0) { + viewWidth = holder.viewDataBinding.percent.getWidth(); + notifyDataSetChanged(); + } + } + }); } else holder.viewDataBinding.trackerName.setText(R.string.no_trackers); } @Override public int getItemCount() { - return trackersList.size(); - } - - public void setTrackers(List myTrackers) { - trackersList = new ArrayList<>(); - if (myTrackers != null) { - for (MyTracker myTracker : myTrackers) { - trackersList.add(myTracker.tracker); - } - } - } - - private int countOccurences(String signature) { - if (myTrackers == null) return 0; - for (MyTracker myTracker : myTrackers) { - if (myTracker.signature.compareTo(signature) == 0) return myTracker.number; - } - return 0; + return myTrackers.size(); } public interface TrackerClickListener { 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 e7fdae1..4308817 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 @@ -10,7 +10,6 @@ import androidx.annotation.NonNull; import androidx.databinding.DataBindingUtil; import androidx.fragment.app.Fragment; import androidx.recyclerview.widget.LinearLayoutManager; -import androidx.recyclerview.widget.RecyclerView; import org.eu.exodus_privacy.exodusprivacy.R; import org.eu.exodus_privacy.exodusprivacy.adapters.ApplicationListAdapter; @@ -22,7 +21,7 @@ import java.util.List; public class AppListFragment extends Fragment { - private static int firstVisiblePosition = 0; + private ApplistBinding applistBinding; private List applications; private ApplicationListAdapter adapter; @@ -43,18 +42,6 @@ public class AppListFragment extends Fragment { LinearLayoutManager linearLayoutManager = new LinearLayoutManager(context); applistBinding.appList.setLayoutManager(linearLayoutManager); applistBinding.appList.setVerticalScrollBarEnabled(scrollbarEnabled); - applistBinding.appList.addOnScrollListener(new RecyclerView.OnScrollListener() { - @Override - public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) { - super.onScrollStateChanged(recyclerView, newState); - } - - @Override - public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) { - super.onScrolled(recyclerView, dx, dy); - firstVisiblePosition = linearLayoutManager.findFirstCompletelyVisibleItemPosition(); - } - }); adapter = new ApplicationListAdapter(onAppClickListener); adapter.displayAppList(applications); adapter.filter(filterType, filterObject); @@ -105,9 +92,6 @@ public class AppListFragment extends Fragment { return adapter.getDisplayedApps(); } - public void scrollTo() { - applistBinding.appList.scrollToPosition(firstVisiblePosition); - } public enum Type { NAME, 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 cd48119..27afb2b 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 @@ -114,7 +114,6 @@ public class HomeFragment extends Fragment implements ComputeAppList.Listener, U @Override public void onResume() { super.onResume(); - appListFragment.scrollTo(); } diff --git a/app/src/main/java/org/eu/exodus_privacy/exodusprivacy/fragments/MyTrackersFragment.java b/app/src/main/java/org/eu/exodus_privacy/exodusprivacy/fragments/MyTrackersFragment.java index e4582a9..be89475 100644 --- a/app/src/main/java/org/eu/exodus_privacy/exodusprivacy/fragments/MyTrackersFragment.java +++ b/app/src/main/java/org/eu/exodus_privacy/exodusprivacy/fragments/MyTrackersFragment.java @@ -35,6 +35,7 @@ import androidx.recyclerview.widget.LinearLayoutManager; import org.eu.exodus_privacy.exodusprivacy.R; import org.eu.exodus_privacy.exodusprivacy.adapters.MyTrackersListAdapter; +import org.eu.exodus_privacy.exodusprivacy.adapters.TrackerListAdapter; import org.eu.exodus_privacy.exodusprivacy.databinding.MyTrackersBinding; import org.eu.exodus_privacy.exodusprivacy.manager.DatabaseManager; import org.eu.exodus_privacy.exodusprivacy.objects.MyTracker; @@ -50,6 +51,8 @@ public class MyTrackersFragment extends Fragment implements MyTrackersListAdapte private Context context; private MyTrackersBinding trackerBinding; + private TrackerListAdapter.OnTrackerClickListener onTrackerClickListener; + @Override public void onCreate(@Nullable Bundle savedInstanceState) { @@ -75,6 +78,7 @@ public class MyTrackersFragment extends Fragment implements MyTrackersListAdapte List packageInstalled = packageManager.getInstalledPackages(PackageManager.GET_PERMISSIONS); List myTrackers = new ArrayList<>(); List added = new ArrayList<>(); + int maxValue = 0; for (PackageInfo pkgInfo : packageInstalled) { Report report; if (pkgInfo.versionName != null) @@ -102,10 +106,15 @@ public class MyTrackersFragment extends Fragment implements MyTrackersListAdapte } } } + for (MyTracker myTracker : myTrackers) { + if (myTracker.number > maxValue) + maxValue = myTracker.number; + } Handler mainHandler = new Handler(Looper.getMainLooper()); + int finalMaxValue = maxValue; Runnable myRunnable = () -> { Collections.sort(myTrackers, (obj1, obj2) -> Integer.compare(obj2.number, obj1.number)); - MyTrackersListAdapter myTrackersListAdapter = new MyTrackersListAdapter(myTrackers, MyTrackersFragment.this); + MyTrackersListAdapter myTrackersListAdapter = new MyTrackersListAdapter(myTrackers, MyTrackersFragment.this, finalMaxValue); trackerBinding.trackers.setAdapter(myTrackersListAdapter); trackerBinding.trackers.setLayoutManager(new LinearLayoutManager(context)); trackerBinding.trackers.setVisibility(View.VISIBLE); @@ -132,9 +141,12 @@ public class MyTrackersFragment extends Fragment implements MyTrackersListAdapte menu.findItem(R.id.action_filter_options).setVisible(false); } + public void setOnTrackerClickListener(TrackerListAdapter.OnTrackerClickListener listener) { + onTrackerClickListener = listener; + } @Override public void onTrackerClick(long trackerId) { - + onTrackerClickListener.onTrackerClick(trackerId); } } 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 0e83c30..e0e3c5a 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 @@ -246,7 +246,6 @@ public class NetworkManager { } - private void getApplications(Message mes) { mes.listener.onProgress(R.string.get_reports_connection, 0, 0); URL url; diff --git a/app/src/main/res/drawable/ic_baseline_navigate_next_24.xml b/app/src/main/res/drawable/ic_baseline_navigate_next_24.xml index f8eaa40..d6dc1ff 100644 --- a/app/src/main/res/drawable/ic_baseline_navigate_next_24.xml +++ b/app/src/main/res/drawable/ic_baseline_navigate_next_24.xml @@ -1,6 +1,6 @@ diff --git a/app/src/main/res/drawable/percent.xml b/app/src/main/res/drawable/percent.xml new file mode 100644 index 0000000..57ae39f --- /dev/null +++ b/app/src/main/res/drawable/percent.xml @@ -0,0 +1,13 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/my_tracker_item.xml b/app/src/main/res/layout/my_tracker_item.xml index 88f22d7..b0ee4e5 100644 --- a/app/src/main/res/layout/my_tracker_item.xml +++ b/app/src/main/res/layout/my_tracker_item.xml @@ -1,55 +1,69 @@ - - - + android:orientation="horizontal"> - - - + + + + + + - + + - + android:contentDescription="@string/list_of_apps" /> + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 16d609e..b293415 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -64,6 +64,7 @@ This app has not been analyzed! My apps Trackers + See the list of apps