From a6769cf32327fa1bd0412cc4f66239824d07262c Mon Sep 17 00:00:00 2001 From: amaa-99 <-> Date: Sat, 29 Jul 2023 23:31:30 +0200 Subject: [PATCH 1/4] * [Issue #1] Application crashes (immediately) after choosing ' View log' from the menu. Dropped the use of the org.ocpsoft.prettytime:prettytime library: This fixes the crashes due to the library using unsupported language features on older platforms. --- README.md | 5 --- app/proguard-rules.pro | 1 - .../dev/ukanth/ufirewall/log/LogInfo.java | 23 ------------- .../ufirewall/log/LogRecyclerViewAdapter.java | 34 ++++--------------- .../ukanth/ufirewall/service/LogService.java | 25 -------------- app/src/main/res/raw/about.html | 4 --- 6 files changed, 6 insertions(+), 86 deletions(-) diff --git a/README.md b/README.md index ca5cbfe2..1f7b071d 100644 --- a/README.md +++ b/README.md @@ -163,11 +163,6 @@ This project also uses some other open-source libraries such as: DBFlow MIT https://github.com/Raizlabs/DBFlow - - - Prettytime - Apache License 2.0 - https://github.com/ocpsoft/prettytime material-dialogs diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index bc15fdec..7d08d120 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -1,5 +1,4 @@ -keepattributes --keep class org.ocpsoft.prettytime.i18n.** -keep class * extends com.raizlabs.android.dbflow.config.DatabaseHolder { *; } -dontpreverify -dontoptimize diff --git a/app/src/main/java/dev/ukanth/ufirewall/log/LogInfo.java b/app/src/main/java/dev/ukanth/ufirewall/log/LogInfo.java index e8b1e315..5001f3e5 100644 --- a/app/src/main/java/dev/ukanth/ufirewall/log/LogInfo.java +++ b/app/src/main/java/dev/ukanth/ufirewall/log/LogInfo.java @@ -28,15 +28,9 @@ import android.util.Log; import android.util.SparseArray; -import org.ocpsoft.prettytime.PrettyTime; -import org.ocpsoft.prettytime.TimeUnit; -import org.ocpsoft.prettytime.units.JustNow; - import java.net.InetAddress; -import java.util.Date; import java.util.HashMap; import java.util.List; -import java.util.Locale; import dev.ukanth.ufirewall.Api; import dev.ukanth.ufirewall.Api.PackageInfoData; @@ -61,29 +55,12 @@ public class LogInfo { public long timestamp; int totalBlocked; - private static PrettyTime prettyTime; - - public static String pretty(Date date) { - if (prettyTime == null) { - prettyTime = new PrettyTime(new Locale(G.locale())); - for (TimeUnit t : prettyTime.getUnits()) { - if (t instanceof JustNow) { - prettyTime.removeUnit(t); - break; - } - } - } - prettyTime.setReference(date); - return prettyTime.format(new Date(0)); - } - private final HashMap dstBlocked; // Number of packets blocked per destination IP address public LogInfo() { this.dstBlocked = new HashMap(); } - public static String parseLog(Context ctx, List listLogData) { //final BufferedReader r = new BufferedReader(new StringReader(dmesg.toString())); diff --git a/app/src/main/java/dev/ukanth/ufirewall/log/LogRecyclerViewAdapter.java b/app/src/main/java/dev/ukanth/ufirewall/log/LogRecyclerViewAdapter.java index c7b75b2b..5bcd8471 100644 --- a/app/src/main/java/dev/ukanth/ufirewall/log/LogRecyclerViewAdapter.java +++ b/app/src/main/java/dev/ukanth/ufirewall/log/LogRecyclerViewAdapter.java @@ -14,30 +14,23 @@ import androidx.recyclerview.widget.RecyclerView; -import org.ocpsoft.prettytime.PrettyTime; -import org.ocpsoft.prettytime.TimeUnit; -import org.ocpsoft.prettytime.units.JustNow; - +import java.text.DateFormat; import java.util.ArrayList; -import java.util.Date; +import java.util.Calendar; import java.util.List; -import java.util.Locale; import dev.ukanth.ufirewall.Api; import dev.ukanth.ufirewall.R; -import dev.ukanth.ufirewall.util.G; /** * Created by ukanth on 25/7/16. */ public class LogRecyclerViewAdapter extends RecyclerView.Adapter { - private final List logData; private final Context context; private LogData data; private PackageInfo info; - private static PrettyTime prettyTime; private final RecyclerItemClickListener recyclerItemClickListener; private View mView; @@ -113,11 +106,11 @@ public void onBindViewHolder(ViewHolder holder, int position) { } catch (Exception e) { Log.e(TAG, e.getMessage(), e); } - try { - //if(data.getTimestamp() != null && !data.getTimestamp().isEmpty()) { - holder.lastDenied.setText(pretty(new Date(System.currentTimeMillis() - data.getTimestamp()))); - //} + Calendar calendar = Calendar.getInstance(); + calendar.setTimeInMillis(data.getTimestamp()); + DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT); + holder.lastDenied.setText(dateFormat.format(calendar.getTime())); } catch (Exception e) { holder.lastDenied.setText("-"); } @@ -130,26 +123,11 @@ public void onBindViewHolder(ViewHolder holder, int position) { holder.icon.invalidate(); } - public static String pretty(Date date) { - if (prettyTime == null) { - prettyTime = new PrettyTime(new Locale(G.locale())); - for (TimeUnit t : prettyTime.getUnits()) { - if (t instanceof JustNow) { - prettyTime.removeUnit(t); - break; - } - } - } - prettyTime.setReference(date); - return prettyTime.format(new Date(0)); - } - @Override public int getItemCount() { return logData.size(); } - public static class ViewHolder extends RecyclerView.ViewHolder { final ImageView icon; diff --git a/app/src/main/java/dev/ukanth/ufirewall/service/LogService.java b/app/src/main/java/dev/ukanth/ufirewall/service/LogService.java index eb9a1566..43169060 100644 --- a/app/src/main/java/dev/ukanth/ufirewall/service/LogService.java +++ b/app/src/main/java/dev/ukanth/ufirewall/service/LogService.java @@ -49,13 +49,7 @@ import com.topjohnwu.superuser.CallbackList; import com.topjohnwu.superuser.Shell; -import org.ocpsoft.prettytime.PrettyTime; -import org.ocpsoft.prettytime.TimeUnit; -import org.ocpsoft.prettytime.units.JustNow; - -import java.util.Date; import java.util.List; -import java.util.Locale; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -233,7 +227,6 @@ private void storeLogInfo(String line, Context context) { } } - private void checkBatteryOptimize() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { final Intent doze = new Intent(Settings.ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS); @@ -242,22 +235,6 @@ private void checkBatteryOptimize() { } } - private static PrettyTime prettyTime; - - public static String pretty(Date date) { - if (prettyTime == null) { - prettyTime = new PrettyTime(new Locale(G.locale())); - for (TimeUnit t : prettyTime.getUnits()) { - if (t instanceof JustNow) { - prettyTime.removeUnit(t); - break; - } - } - } - prettyTime.setReference(date); - return prettyTime.format(new Date(0)); - } - @SuppressLint("RestrictedApi") private void showNotification(LogInfo logInfo) { if(G.enableLogService()) { @@ -271,8 +248,6 @@ private void showNotification(LogInfo logInfo) { } } - - private static void store(final LogInfo logInfo, Context context) { try { if (logInfo != null) { diff --git a/app/src/main/res/raw/about.html b/app/src/main/res/raw/about.html index 3d8e9a49..75c3b9bf 100644 --- a/app/src/main/res/raw/about.html +++ b/app/src/main/res/raw/about.html @@ -296,10 +296,6 @@ RxJava Apache License 2.0 - - PrettyTime - Apache License 2.0 - From 72f448c0c3732ec13586b361cce0d01ad4ed0c03 Mon Sep 17 00:00:00 2001 From: amaa-99 <-> Date: Sat, 29 Jul 2023 23:35:32 +0200 Subject: [PATCH 2/4] * [Issue #1] Application crashes (immediately) after choosing ' View log' from the menu. Addressed a couple of lint warnings. --- .../ufirewall/log/LogRecyclerViewAdapter.java | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/dev/ukanth/ufirewall/log/LogRecyclerViewAdapter.java b/app/src/main/java/dev/ukanth/ufirewall/log/LogRecyclerViewAdapter.java index 5bcd8471..e2fd6253 100644 --- a/app/src/main/java/dev/ukanth/ufirewall/log/LogRecyclerViewAdapter.java +++ b/app/src/main/java/dev/ukanth/ufirewall/log/LogRecyclerViewAdapter.java @@ -3,8 +3,6 @@ import static dev.ukanth.ufirewall.Api.TAG; import android.content.Context; -import android.content.pm.PackageInfo; -import android.content.pm.PackageManager; import android.graphics.drawable.Drawable; import android.view.LayoutInflater; import android.view.View; @@ -12,6 +10,7 @@ import android.widget.ImageView; import android.widget.TextView; +import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; import java.text.DateFormat; @@ -29,10 +28,7 @@ public class LogRecyclerViewAdapter extends RecyclerView.Adapter logData; private final Context context; - private LogData data; - private PackageInfo info; private final RecyclerItemClickListener recyclerItemClickListener; - private View mView; public LogRecyclerViewAdapter(final Context context, RecyclerItemClickListener recyclerItemClickListener) { this.context = context; @@ -45,9 +41,10 @@ public void updateData(List logDataList) { logData.addAll(logDataList); } + @NonNull @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { - mView = LayoutInflater.from(parent.getContext()).inflate(R.layout.log_recycle_item, parent, false); + View mView = LayoutInflater.from(parent.getContext()).inflate(R.layout.log_recycle_item, parent, false); return new ViewHolder(mView); } @@ -97,9 +94,8 @@ private Bitmap getAppIcon26(PackageManager mPackageManager, ApplicationInfo appl @Override public void onBindViewHolder(ViewHolder holder, int position) { - data = logData.get(position); - PackageManager manager = context.getPackageManager(); - holder.bind(logData.get(position),recyclerItemClickListener); + LogData data = logData.get(position); + holder.bind(logData.get(position), recyclerItemClickListener); try { Drawable applicationIcon = Api.getApplicationIcon(context, data.getUid()); holder.icon.setBackground(applicationIcon); From 821415d7207a524fd9b899471ee6b4179d6bf263 Mon Sep 17 00:00:00 2001 From: amaa-99 <-> Date: Fri, 22 Sep 2023 11:59:58 +0200 Subject: [PATCH 3/4] * [Issue #18] The date/time formatting is not consistent across all views. Corrected the date/time format in the details view (e.g. 19:00 would get displayed as '7:00'). Changed the detail view to not show the host name field in case the host name is not known. --- .../ufirewall/activity/LogDetailActivity.java | 2 +- .../log/LogDetailRecyclerViewAdapter.java | 29 ++++++++++++------- 2 files changed, 19 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/dev/ukanth/ufirewall/activity/LogDetailActivity.java b/app/src/main/java/dev/ukanth/ufirewall/activity/LogDetailActivity.java index e48642fa..6fe905dd 100644 --- a/app/src/main/java/dev/ukanth/ufirewall/activity/LogDetailActivity.java +++ b/app/src/main/java/dev/ukanth/ufirewall/activity/LogDetailActivity.java @@ -295,7 +295,7 @@ protected Boolean doInBackground(Void... params) { return false; } } catch (Exception e) { - Log.e(Api.TAG, "Exception while retrieving data" + e.getLocalizedMessage()); + Log.e(Api.TAG, "Exception while retrieving data" + e.getLocalizedMessage()); return null; } diff --git a/app/src/main/java/dev/ukanth/ufirewall/log/LogDetailRecyclerViewAdapter.java b/app/src/main/java/dev/ukanth/ufirewall/log/LogDetailRecyclerViewAdapter.java index 0eb19009..dabd6d61 100644 --- a/app/src/main/java/dev/ukanth/ufirewall/log/LogDetailRecyclerViewAdapter.java +++ b/app/src/main/java/dev/ukanth/ufirewall/log/LogDetailRecyclerViewAdapter.java @@ -10,6 +10,7 @@ import androidx.recyclerview.widget.RecyclerView; import java.util.ArrayList; +import java.util.Calendar; import java.util.List; import dev.ukanth.ufirewall.R; @@ -47,24 +48,31 @@ public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { public void onBindViewHolder(ViewHolder holder, int position) { data = logData.get(position); if (data != null) { - holder.bind(logData.get(position), recyclerItemClickListener); - if(data.getOut() != null) { - holder.deniedTime.setText(pretty(data.getTimestamp()) + "(" + data.getOut() + ")"); - if((data.getOut().contains("lan") || data.getOut().startsWith("eth") || data.getOut().startsWith("ra") || data.getOut().startsWith("bnep"))) { + holder.bind(data, recyclerItemClickListener); + if (data.getOut() != null) { + Calendar calendar = Calendar.getInstance(); + calendar.setTimeInMillis(data.getTimestamp()); + java.text.DateFormat dateFormat = java.text.DateFormat.getDateTimeInstance(java.text.DateFormat.SHORT, java.text.DateFormat.SHORT); + String dateTime = dateFormat.format(calendar.getTime()); + holder.deniedTime.setText(dateTime + " (" + data.getOut() + ")"); + if ((data.getOut().contains("lan") || data.getOut().startsWith("eth") || data.getOut().startsWith("ra") || data.getOut().startsWith("bnep"))) { holder.icon.setImageDrawable(context.getResources().getDrawable(R.drawable.ic_wifi)); - } else{ + } else { holder.icon.setImageDrawable(context.getResources().getDrawable(R.drawable.ic_mobiledata)); } } + holder.dataDest.setText(context.getResources().getString(R.string.log_dst) + data.getDst() + ":" + data.getDpt()); holder.dataSrc.setText(context.getResources().getString(R.string.log_src) + data.getSrc() + ":" + data.getSpt()); holder.dataProto.setText(context.getResources().getString(R.string.log_proto) + data.getProto()); - holder.dataHost.setText(context.getResources().getString(R.string.host) + data.getHostname()); - } - } - public static String pretty(Long timestamp) { - return android.text.format.DateFormat.format("dd-MM-yyyy hh:mm:ss", new java.util.Date(timestamp)).toString(); + String hostName = data.getHostname(); + if (!hostName.isEmpty()) { + holder.dataHost.setText(context.getResources().getString(R.string.host) + hostName); + } else { + holder.dataHost.setVisibility(View.GONE); + } + } } @Override @@ -72,7 +80,6 @@ public int getItemCount() { return logData.size(); } - public static class ViewHolder extends RecyclerView.ViewHolder { final ImageView icon; From a5f1f160ccba63156ad674f879716000c9eb278a Mon Sep 17 00:00:00 2001 From: amaa-99 <-> Date: Fri, 22 Sep 2023 12:04:24 +0200 Subject: [PATCH 4/4] * [Issue #18] The date/time formatting is not consistent across all views. Removed commented out code and unused methods. --- .../ufirewall/log/LogDetailRecyclerViewAdapter.java | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/dev/ukanth/ufirewall/log/LogDetailRecyclerViewAdapter.java b/app/src/main/java/dev/ukanth/ufirewall/log/LogDetailRecyclerViewAdapter.java index dabd6d61..769fdbee 100644 --- a/app/src/main/java/dev/ukanth/ufirewall/log/LogDetailRecyclerViewAdapter.java +++ b/app/src/main/java/dev/ukanth/ufirewall/log/LogDetailRecyclerViewAdapter.java @@ -7,6 +7,7 @@ import android.widget.ImageView; import android.widget.TextView; +import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; import java.util.ArrayList; @@ -20,13 +21,11 @@ */ public class LogDetailRecyclerViewAdapter extends RecyclerView.Adapter { - private final List logData; private final Context context; private LogData data; private final RecyclerItemClickListener recyclerItemClickListener; - public LogDetailRecyclerViewAdapter(final Context context, RecyclerItemClickListener recyclerItemClickListener) { this.context = context; logData = new ArrayList<>(); @@ -39,6 +38,7 @@ public void updateData(List logDataList) { } @Override + @NonNull public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View mView = LayoutInflater.from(parent.getContext()).inflate(R.layout.logdetail_recycle_item, parent, false); return new ViewHolder(mView); @@ -83,9 +83,7 @@ public int getItemCount() { public static class ViewHolder extends RecyclerView.ViewHolder { final ImageView icon; - //final TextView appName; final TextView deniedTime; - //final TextView dataInterface; final TextView dataDest; final TextView dataSrc; final TextView dataProto; @@ -94,9 +92,7 @@ public static class ViewHolder extends RecyclerView.ViewHolder { public ViewHolder(View itemView) { super(itemView); icon = itemView.findViewById(R.id.data_icon); - //appName = (TextView)itemView.findViewById(R.id.app_name); deniedTime = itemView.findViewById(R.id.denied_time); - //dataInterface = (TextView)itemView.findViewById(R.id.data_interface); dataDest = itemView.findViewById(R.id.data_dest); dataSrc = itemView.findViewById(R.id.data_src); dataProto = itemView.findViewById(R.id.data_proto); @@ -112,9 +108,4 @@ public void onClick(View v) { }); } } - - public List getLogData() { - return logData; - } - }