parent
883b623d6d
commit
3b7343bc68
|
@ -1,9 +1,11 @@
|
|||
package org.eu.exodus_privacy.exodusprivacy;
|
||||
|
||||
import android.annotation.SuppressLint;
|
||||
import android.content.Context;
|
||||
import android.content.pm.PackageInfo;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.content.pm.Signature;
|
||||
import android.os.Build;
|
||||
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.InputStream;
|
||||
|
@ -12,13 +14,21 @@ import java.security.NoSuchAlgorithmException;
|
|||
import java.security.cert.CertificateException;
|
||||
import java.security.cert.CertificateFactory;
|
||||
import java.security.cert.X509Certificate;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Date;
|
||||
import java.util.Locale;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
public class Utils {
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
public static final String TAG = "Exodus_privacy";
|
||||
|
||||
public static final String APP_PREFS = "app_prefs";
|
||||
public static final String LAST_REFRESH = "last_refresh";
|
||||
|
||||
@SuppressLint("PackageManagerGetSignatures")
|
||||
public static String getCertificateSHA1Fingerprint(PackageManager pm, String packageName) {
|
||||
int flags = PackageManager.GET_SIGNATURES;
|
||||
|
@ -84,6 +94,47 @@ public class Utils {
|
|||
return str.toString();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Convert a date in String -> format yyyy-MM-dd HH:mm:ss
|
||||
*
|
||||
* @param date Date
|
||||
* @return String
|
||||
*/
|
||||
public static String dateToString(Date date) {
|
||||
if (date == null)
|
||||
return null;
|
||||
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault());
|
||||
return dateFormat.format(date);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Convert String date from db to Date Object
|
||||
*
|
||||
* @param stringDate date to convert
|
||||
* @return Date
|
||||
*/
|
||||
public static Date stringToDate(Context context, String stringDate) {
|
||||
if (stringDate == null)
|
||||
return null;
|
||||
Locale userLocale;
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
|
||||
userLocale = context.getResources().getConfiguration().getLocales().get(0);
|
||||
} else {
|
||||
userLocale = context.getResources().getConfiguration().locale;
|
||||
}
|
||||
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", userLocale);
|
||||
Date date = null;
|
||||
try {
|
||||
date = dateFormat.parse(stringDate);
|
||||
} catch (java.text.ParseException ignored) {
|
||||
|
||||
}
|
||||
return date;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
Simple and not complete markdownToHtml converter
|
||||
*/
|
||||
|
|
|
@ -1,7 +1,9 @@
|
|||
package org.eu.exodus_privacy.exodusprivacy.fragments;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.app.AlertDialog;
|
||||
import android.content.Context;
|
||||
import android.content.SharedPreferences;
|
||||
import android.content.pm.PackageInfo;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.os.Bundle;
|
||||
|
@ -17,6 +19,7 @@ import androidx.fragment.app.FragmentManager;
|
|||
import androidx.fragment.app.FragmentTransaction;
|
||||
|
||||
import org.eu.exodus_privacy.exodusprivacy.R;
|
||||
import org.eu.exodus_privacy.exodusprivacy.Utils;
|
||||
import org.eu.exodus_privacy.exodusprivacy.adapters.ApplicationListAdapter;
|
||||
import org.eu.exodus_privacy.exodusprivacy.adapters.ApplicationViewModel;
|
||||
import org.eu.exodus_privacy.exodusprivacy.databinding.HomeBinding;
|
||||
|
@ -26,8 +29,12 @@ import org.eu.exodus_privacy.exodusprivacy.manager.NetworkManager;
|
|||
|
||||
import java.lang.ref.WeakReference;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Calendar;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
import static android.content.Context.MODE_PRIVATE;
|
||||
|
||||
public class HomeFragment extends Fragment implements ComputeAppListTask.Listener, Updatable {
|
||||
|
||||
private @Nullable
|
||||
|
@ -45,6 +52,8 @@ public class HomeFragment extends Fragment implements ComputeAppListTask.Listene
|
|||
private int lastProgress = 0;
|
||||
private int lastMaxProgress = 0;
|
||||
private int scrollTo = 0;
|
||||
private String last_refresh;
|
||||
|
||||
@Override
|
||||
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
|
||||
if (applications == null)
|
||||
|
@ -59,18 +68,24 @@ public class HomeFragment extends Fragment implements ComputeAppListTask.Listene
|
|||
Context context = homeBinding.getRoot().getContext();
|
||||
packageManager = context.getPackageManager();
|
||||
homeBinding.swipeRefresh.setOnRefreshListener(this::startRefresh);
|
||||
|
||||
SharedPreferences sharedPreferences = getContext().getSharedPreferences(Utils.APP_PREFS, MODE_PRIVATE);
|
||||
last_refresh = sharedPreferences.getString(Utils.LAST_REFRESH, null);
|
||||
|
||||
if (packageManager != null) {
|
||||
homeBinding.noPackageManager.setVisibility(View.GONE);
|
||||
|
||||
onAppsComputed(applications);
|
||||
if (applications.isEmpty())
|
||||
displayAppListAsync();
|
||||
if (startRefreshAsked)
|
||||
if (startRefreshAsked && last_refresh == null)
|
||||
startRefresh();
|
||||
else if (refreshInProgress) {
|
||||
homeBinding.layoutProgress.setVisibility(View.VISIBLE);
|
||||
homeBinding.swipeRefresh.setRefreshing(true);
|
||||
updateProgress(lastResource, lastProgress, lastMaxProgress);
|
||||
}
|
||||
|
||||
} else {
|
||||
homeBinding.noPackageManager.setVisibility(View.VISIBLE);
|
||||
}
|
||||
|
@ -188,7 +203,25 @@ public class HomeFragment extends Fragment implements ComputeAppListTask.Listene
|
|||
appListFragment.setApplications(apps);
|
||||
if (!apps.isEmpty()) {
|
||||
if (startupRefresh) {
|
||||
startRefresh();
|
||||
Calendar cal = Calendar.getInstance();
|
||||
cal.setTime(Utils.stringToDate(getContext(), last_refresh));
|
||||
cal.add(Calendar.DAY_OF_YEAR, 1);
|
||||
Date refreshAfter = cal.getTime();
|
||||
Date currentDate = new Date();
|
||||
if (last_refresh != null && !refreshInProgress && currentDate.after(refreshAfter)) {
|
||||
AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(getContext());
|
||||
dialogBuilder.setMessage(getString(R.string.refresh_needed_message, last_refresh));
|
||||
dialogBuilder.setPositiveButton(R.string.refresh, (dialog, id) -> {
|
||||
startRefresh();
|
||||
dialog.dismiss();
|
||||
});
|
||||
dialogBuilder.setNegativeButton(R.string.cancel, (dialog, id) -> dialog.dismiss());
|
||||
AlertDialog alertDialog = dialogBuilder.create();
|
||||
alertDialog.show();
|
||||
|
||||
} else if (last_refresh == null) {
|
||||
startRefresh();
|
||||
}
|
||||
startupRefresh = false;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -19,11 +19,13 @@
|
|||
package org.eu.exodus_privacy.exodusprivacy.manager;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.SharedPreferences;
|
||||
import android.net.ConnectivityManager;
|
||||
import android.net.NetworkInfo;
|
||||
import android.os.Bundle;
|
||||
|
||||
import org.eu.exodus_privacy.exodusprivacy.R;
|
||||
import org.eu.exodus_privacy.exodusprivacy.Utils;
|
||||
import org.eu.exodus_privacy.exodusprivacy.listener.NetworkListener;
|
||||
import org.eu.exodus_privacy.exodusprivacy.objects.Application;
|
||||
import org.eu.exodus_privacy.exodusprivacy.objects.Report;
|
||||
|
@ -54,6 +56,8 @@ import java.util.Random;
|
|||
import java.util.TimeZone;
|
||||
import java.util.concurrent.Semaphore;
|
||||
|
||||
import static android.content.Context.MODE_PRIVATE;
|
||||
|
||||
/*
|
||||
Singleton that handle all network connection
|
||||
*/
|
||||
|
@ -113,15 +117,20 @@ public class NetworkManager {
|
|||
@Override
|
||||
public void run() {
|
||||
isRunning = true;
|
||||
Message mes = null;
|
||||
while (isRunning) {
|
||||
try {
|
||||
sem.acquire();
|
||||
Message mes = messageQueue.remove(0);
|
||||
mes = messageQueue.remove(0);
|
||||
//noinspection SwitchStatementWithTooFewBranches
|
||||
switch (mes.type) {
|
||||
case GET_REPORTS:
|
||||
getTrackers(mes);
|
||||
getApplications(mes);
|
||||
SharedPreferences sharedPreferences = mes.context.getSharedPreferences(Utils.APP_PREFS, MODE_PRIVATE);
|
||||
SharedPreferences.Editor editor = sharedPreferences.edit();
|
||||
editor.putString(Utils.LAST_REFRESH, Utils.dateToString(new Date()));
|
||||
editor.apply();
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
|
|
@ -45,7 +45,10 @@
|
|||
<string name="tracker_presence_in">Present in:</string>
|
||||
<string name="no_app_found_tracker">This tracker seems not be present in your applications</string>
|
||||
<string name="source">Source: %s</string>
|
||||
|
||||
<string name="refresh">Refresh</string>
|
||||
<string name="cancel">Cancel</string>
|
||||
<string name="refresh_needed">Refresh needed</string>
|
||||
<string name="refresh_needed_message">Data have not been update since %1$s.\n\nWould you like to refresh them?</string>
|
||||
<!-- Menu -->
|
||||
<string name="menu_action_filter">Filter</string>
|
||||
<string name="menu_action_settings">Application Settings</string>
|
||||
|
|
Loading…
Reference in New Issue