diff --git a/app/app.iml b/app/app.iml index e8fbc738..f85233ab 100644 --- a/app/app.iml +++ b/app/app.iml @@ -72,14 +72,6 @@ - - - - - - - - @@ -88,6 +80,14 @@ + + + + + + + + diff --git a/app/src/main/java/eu/faircode/netguard/AdapterRule.java b/app/src/main/java/eu/faircode/netguard/AdapterRule.java index 1c7b33d3..44771db0 100644 --- a/app/src/main/java/eu/faircode/netguard/AdapterRule.java +++ b/app/src/main/java/eu/faircode/netguard/AdapterRule.java @@ -23,7 +23,6 @@ import android.Manifest; import android.annotation.TargetApi; import android.app.Activity; import android.content.Context; -import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; import android.content.pm.PackageManager; @@ -346,26 +345,8 @@ public class AdapterRule extends RecyclerView.Adapter im color = Color.argb(128, Color.red(color), Color.green(color), Color.blue(color)); holder.tvName.setTextColor(color); - // Show rule count - new AsyncTask() { - @Override - protected void onPreExecute() { - holder.tvHosts.setVisibility(View.GONE); - } - - @Override - protected Long doInBackground(Object... objects) { - return DatabaseHelper.getInstance(context).getRuleCount(rule.info.applicationInfo.uid); - } - - @Override - protected void onPostExecute(Long rules) { - if (rules > 0) { - holder.tvHosts.setVisibility(View.VISIBLE); - holder.tvHosts.setText(Long.toString(rules)); - } - } - }.execute(); + holder.tvHosts.setVisibility(rule.hosts > 0 ? View.VISIBLE : View.GONE); + holder.tvHosts.setText(Long.toString(rule.hosts)); // Lockdown settings boolean lockdown = prefs.getBoolean("lockdown", false); @@ -716,14 +697,18 @@ public class AdapterRule extends RecyclerView.Adapter im popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem menuItem) { - switch (menuItem.getItemId()) { + int menu = menuItem.getItemId(); + boolean result = false; + switch (menu) { case R.id.menu_whois: context.startActivity(lookupIP); - return true; + result = true; + break; case R.id.menu_port: context.startActivity(lookupPort); - return true; + result = true; + break; case R.id.menu_allow: if (IAB.isPurchased(ActivityPro.SKU_FILTER, context)) { @@ -731,7 +716,8 @@ public class AdapterRule extends RecyclerView.Adapter im ServiceSinkhole.reload("allow host", context); } else context.startActivity(new Intent(context, ActivityPro.class)); - return true; + result = true; + break; case R.id.menu_block: if (IAB.isPurchased(ActivityPro.SKU_FILTER, context)) { @@ -739,14 +725,31 @@ public class AdapterRule extends RecyclerView.Adapter im ServiceSinkhole.reload("block host", context); } else context.startActivity(new Intent(context, ActivityPro.class)); - return true; + result = true; + break; case R.id.menu_reset: DatabaseHelper.getInstance(context).setAccess(id, -1); ServiceSinkhole.reload("reset host", context); - return true; + result = true; + break; } - return false; + + if (menu == R.id.menu_allow || menu == R.id.menu_block || menu == R.id.menu_reset) + new AsyncTask() { + @Override + protected Long doInBackground(Object... objects) { + return DatabaseHelper.getInstance(context).getHostCount(rule.info.applicationInfo.uid, false); + } + + @Override + protected void onPostExecute(Long hosts) { + rule.hosts = hosts; + notifyDataSetChanged(); + } + }.execute(); + + return result; } }); diff --git a/app/src/main/java/eu/faircode/netguard/DatabaseHelper.java b/app/src/main/java/eu/faircode/netguard/DatabaseHelper.java index 92af577e..7df08b72 100644 --- a/app/src/main/java/eu/faircode/netguard/DatabaseHelper.java +++ b/app/src/main/java/eu/faircode/netguard/DatabaseHelper.java @@ -36,7 +36,9 @@ import java.io.File; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.concurrent.locks.ReentrantReadWriteLock; public class DatabaseHelper extends SQLiteOpenHelper { @@ -726,13 +728,25 @@ public class DatabaseHelper extends SQLiteOpenHelper { } } - public long getRuleCount(int uid) { + private static Map mapUidHosts = new HashMap<>(); + + public long getHostCount(int uid, boolean usecache) { + if (usecache) + synchronized (mapUidHosts) { + if (mapUidHosts.containsKey(uid)) + return mapUidHosts.get(uid); + } + lock.readLock().lock(); try { SQLiteDatabase db = this.getReadableDatabase(); // There is a segmented index on uid // There is an index on block - return db.compileStatement("SELECT COUNT(*) FROM access WHERE block >= 0 AND uid =" + uid).simpleQueryForLong(); + long hosts = db.compileStatement("SELECT COUNT(*) FROM access WHERE block >= 0 AND uid =" + uid).simpleQueryForLong(); + synchronized (mapUidHosts) { + mapUidHosts.put(uid, hosts); + } + return hosts; } finally { lock.readLock().unlock(); } diff --git a/app/src/main/java/eu/faircode/netguard/Rule.java b/app/src/main/java/eu/faircode/netguard/Rule.java index 123e31e5..d6b8f5bc 100644 --- a/app/src/main/java/eu/faircode/netguard/Rule.java +++ b/app/src/main/java/eu/faircode/netguard/Rule.java @@ -29,7 +29,6 @@ import android.content.res.XmlResourceParser; import android.net.Uri; import android.os.Build; import android.os.Process; -import android.os.SystemClock; import android.preference.PreferenceManager; import android.provider.Settings; import android.util.Log; @@ -79,6 +78,7 @@ public class Rule { public boolean relateduids = false; public String[] related = null; + public long hosts; public boolean changed; public boolean expanded = false; @@ -358,6 +358,7 @@ public class Rule { nobody.applicationInfo.icon = 0; listPI.add(nobody); + DatabaseHelper dh = DatabaseHelper.getInstance(context); for (PackageInfo info : listPI) try { Rule rule = new Rule(info, context); @@ -400,6 +401,8 @@ public class Rule { } rule.related = listPkg.toArray(new String[0]); + rule.hosts = dh.getHostCount(rule.info.applicationInfo.uid, true); + rule.updateChanged(default_wifi, default_other, default_roaming); listRules.add(rule); @@ -448,7 +451,7 @@ public class Rule { (wifi_blocked && screen_wifi != screen_wifi_default) || (other_blocked && screen_other != screen_other_default) || ((!other_blocked || screen_other) && roaming != default_roaming) || - lockdown || !apply); + hosts > 0 || lockdown || !apply); } public void updateChanged(Context context) {