Block when roaming

This commit is contained in:
M66B 2015-11-01 14:16:57 +01:00
parent 99f8cab27d
commit 4d87d0494b
15 changed files with 132 additions and 24 deletions

View File

@ -326,6 +326,7 @@ public class ActivityMain extends AppCompatActivity implements SharedPreferences
menu.findItem(R.id.menu_whitelist_wifi).setChecked(prefs.getBoolean("whitelist_wifi", true));
menu.findItem(R.id.menu_whitelist_other).setChecked(prefs.getBoolean("whitelist_other", true));
menu.findItem(R.id.menu_whitelist_roaming).setChecked(prefs.getBoolean("whitelist_roaming", true));
menu.findItem(R.id.menu_system).setChecked(prefs.getBoolean("manage_system", false));
menu.findItem(R.id.menu_export).setEnabled(getIntentCreateDocument().resolveActivity(getPackageManager()) != null);
menu.findItem(R.id.menu_import).setEnabled(getIntentOpenDocument().resolveActivity(getPackageManager()) != null);
@ -354,6 +355,10 @@ public class ActivityMain extends AppCompatActivity implements SharedPreferences
menu_whitelist_other(prefs);
return true;
case R.id.menu_whitelist_roaming:
menu_whitelist_roaming(prefs);
return true;
case R.id.menu_system:
menu_system(prefs);
return true;
@ -408,6 +413,12 @@ public class ActivityMain extends AppCompatActivity implements SharedPreferences
SinkholeService.reload("other", this);
}
private void menu_whitelist_roaming(SharedPreferences prefs) {
prefs.edit().putBoolean("whitelist_roaming", !prefs.getBoolean("whitelist_roaming", true)).apply();
updateApplicationList();
SinkholeService.reload("other", this);
}
private void menu_system(SharedPreferences prefs) {
prefs.edit().putBoolean("manage_system", !prefs.getBoolean("manage_system", true)).apply();
updateApplicationList();

View File

@ -27,6 +27,7 @@ public class Rule implements Comparable<Rule> {
public boolean wifi_blocked;
public boolean other_blocked;
public boolean unused;
public boolean roaming;
public boolean changed;
public Intent intent;
public boolean attributes = false;
@ -51,13 +52,15 @@ public class Rule implements Comparable<Rule> {
SharedPreferences wifi = context.getSharedPreferences("wifi", Context.MODE_PRIVATE);
SharedPreferences other = context.getSharedPreferences("other", Context.MODE_PRIVATE);
SharedPreferences unused = context.getSharedPreferences("unused", Context.MODE_PRIVATE);
SharedPreferences roaming = context.getSharedPreferences("roaming", Context.MODE_PRIVATE);
// Get settings
boolean whitelist_wifi = prefs.getBoolean("whitelist_wifi", true);
boolean whitelist_other = prefs.getBoolean("whitelist_other", true);
boolean whitelist_roaming = prefs.getBoolean("whitelist_roaming", true);
boolean manage_system = prefs.getBoolean("manage_system", false);
// Get predifined rules
// Get predefined rules
Map<String, Boolean> predefined = new HashMap<>();
try {
XmlResourceParser xml = context.getResources().getXml(R.xml.predefined);
@ -80,18 +83,18 @@ public class Rule implements Comparable<Rule> {
for (PackageInfo info : context.getPackageManager().getInstalledPackages(0)) {
boolean system = ((info.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0);
if (!system || manage_system || all) {
boolean isPredefined = predefined.containsKey(info.packageName);
Rule rule = new Rule(info, context);
rule.system = system;
rule.wifi_blocked = (system && !manage_system ? false :
wifi.getBoolean(info.packageName, predefined.containsKey(info.packageName)
? predefined.get(info.packageName)
: whitelist_wifi));
wifi.getBoolean(info.packageName, isPredefined ? predefined.get(info.packageName) : whitelist_wifi));
rule.other_blocked = (system && !manage_system ? false :
other.getBoolean(info.packageName, predefined.containsKey(info.packageName)
? predefined.get(info.packageName)
: whitelist_other));
other.getBoolean(info.packageName, isPredefined ? predefined.get(info.packageName) : whitelist_other));
rule.unused = unused.getBoolean(info.packageName, false);
rule.changed = (rule.wifi_blocked != whitelist_wifi || rule.other_blocked != whitelist_other);
rule.roaming = roaming.getBoolean(info.packageName, isPredefined ? predefined.get(info.packageName) : whitelist_roaming);
rule.changed = (rule.wifi_blocked != whitelist_wifi ||
rule.other_blocked != whitelist_other ||
(!rule.other_blocked || rule.unused) && rule.roaming != whitelist_roaming);
listRules.add(rule);
}
}

View File

@ -38,6 +38,7 @@ public class RuleAdapter extends RecyclerView.Adapter<RuleAdapter.ViewHolder> im
public static class ViewHolder extends RecyclerView.ViewHolder {
public View view;
public LinearLayout llApplication;
public ImageView ivIcon;
public ImageView ivExpander;
@ -45,26 +46,36 @@ public class RuleAdapter extends RecyclerView.Adapter<RuleAdapter.ViewHolder> im
public TextView tvPackage;
public CheckBox cbWifi;
public CheckBox cbOther;
public LinearLayout llAttributes;
public ImageView ivUsing;
public TextView tvRoaming;
public LinearLayout llConfiguration;
public CheckBox cbUsing;
public CheckBox cbRoaming;
public Button btnLaunch;
public ViewHolder(View itemView) {
super(itemView);
view = itemView;
llApplication = (LinearLayout) itemView.findViewById(R.id.llApplication);
ivIcon = (ImageView) itemView.findViewById(R.id.ivIcon);
ivExpander = (ImageView) itemView.findViewById(R.id.ivExpander);
tvName = (TextView) itemView.findViewById(R.id.tvName);
tvPackage = (TextView) itemView.findViewById(R.id.tvPackage);
cbWifi = (CheckBox) itemView.findViewById(R.id.cbWifi);
cbOther = (CheckBox) itemView.findViewById(R.id.cbOther);
llAttributes = (LinearLayout) itemView.findViewById(R.id.llAttributes);
ivUsing = (ImageView) itemView.findViewById(R.id.ivUsing);
tvRoaming = (TextView) itemView.findViewById(R.id.tvRoaming);
llConfiguration = (LinearLayout) itemView.findViewById(R.id.llConfiguration);
tvPackage = (TextView) itemView.findViewById(R.id.tvPackage);
cbUsing = (CheckBox) itemView.findViewById(R.id.cbUsing);
cbRoaming = (CheckBox) itemView.findViewById(R.id.cbRoaming);
btnLaunch = (Button) itemView.findViewById(R.id.btnLaunch);
}
}
@ -134,9 +145,7 @@ public class RuleAdapter extends RecyclerView.Adapter<RuleAdapter.ViewHolder> im
}
};
int color = rule.system ? colorAccent : colorText;
if (rule.disabled)
color = Color.argb(100, Color.red(color), Color.green(color), Color.blue(color));
holder.llApplication.setOnClickListener(llListener);
if (rule.info.applicationInfo.icon == 0)
Picasso.with(context).load(android.R.drawable.sym_def_app_icon).into(holder.ivIcon);
@ -146,11 +155,12 @@ public class RuleAdapter extends RecyclerView.Adapter<RuleAdapter.ViewHolder> im
}
holder.ivExpander.setImageResource(rule.attributes ? android.R.drawable.arrow_up_float : android.R.drawable.arrow_down_float);
holder.llApplication.setOnClickListener(llListener);
holder.tvName.setText(rule.name);
int color = rule.system ? colorAccent : colorText;
if (rule.disabled)
color = Color.argb(100, Color.red(color), Color.green(color), Color.blue(color));
holder.tvName.setTextColor(color);
holder.tvPackage.setText(rule.info.packageName);
holder.tvPackage.setTextColor(color);
holder.cbWifi.setOnCheckedChangeListener(null);
holder.cbWifi.setChecked(rule.wifi_blocked);
@ -162,8 +172,11 @@ public class RuleAdapter extends RecyclerView.Adapter<RuleAdapter.ViewHolder> im
holder.llAttributes.setOnClickListener(llListener);
holder.ivUsing.setVisibility(rule.unused && (rule.wifi_blocked || rule.other_blocked) ? View.VISIBLE : View.INVISIBLE);
holder.tvRoaming.setVisibility(rule.roaming && (!rule.other_blocked || rule.unused) ? View.VISIBLE : View.INVISIBLE);
holder.llConfiguration.setVisibility(rule.attributes ? View.VISIBLE : View.GONE);
holder.tvPackage.setText(rule.info.packageName);
holder.cbUsing.setOnCheckedChangeListener(null);
holder.cbUsing.setChecked(rule.unused);
holder.cbUsing.setEnabled(rule.wifi_blocked || rule.other_blocked);
@ -189,6 +202,32 @@ public class RuleAdapter extends RecyclerView.Adapter<RuleAdapter.ViewHolder> im
}
});
holder.cbRoaming.setOnCheckedChangeListener(null);
holder.cbRoaming.setChecked(rule.roaming);
holder.cbRoaming.setEnabled(!rule.other_blocked || rule.unused);
holder.cbRoaming.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
// Update rule
rule.roaming = isChecked;
// Store rule
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
SharedPreferences roaming = context.getSharedPreferences("roaming", Context.MODE_PRIVATE);
if (rule.roaming == prefs.getBoolean("whitelist_roaming", true))
roaming.edit().remove(rule.info.packageName).apply();
else
roaming.edit().putBoolean(rule.info.packageName, rule.roaming).apply();
// Update UI
notifyItemChanged(position);
// Apply updated rule
SinkholeService.reload(null, context);
}
});
holder.btnLaunch.setEnabled(rule.intent != null);
holder.btnLaunch.setOnClickListener(new View.OnClickListener() {
@Override

View File

@ -25,6 +25,7 @@ import java.nio.ByteOrder;
public class SinkholeService extends VpnService {
private static final String TAG = "NetGuard.Service";
private boolean last_roaming;
private ParcelFileDescriptor vpn = null;
private boolean debug = false;
private Thread thread = null;
@ -52,6 +53,7 @@ public class SinkholeService extends VpnService {
switch (cmd) {
case start:
if (enabled && vpn == null) {
last_roaming = Util.isRoaming(SinkholeService.this);
vpn = startVPN();
startDebug(vpn);
removeDisabledNotification();
@ -93,6 +95,10 @@ public class SinkholeService extends VpnService {
boolean wifi = Util.isWifiActive(this);
Log.i(TAG, "wifi=" + wifi);
// Check if Wi-Fi
boolean roaming = Util.isRoaming(this);
Log.i(TAG, "roaming=" + roaming);
// Check if interactive
boolean interactive = Util.isInteractive(this);
Log.i(TAG, "interactive=" + interactive);
@ -106,8 +112,9 @@ public class SinkholeService extends VpnService {
builder.addRoute("0:0:0:0:0:0:0:0", 0);
// Add list of allowed applications
for (Rule rule : Rule.getRules(true, TAG, this))
if (!(wifi ? rule.wifi_blocked : rule.other_blocked) || (rule.unused && interactive)) {
for (Rule rule : Rule.getRules(true, TAG, this)) {
boolean blocked = (wifi ? rule.wifi_blocked : rule.other_blocked);
if ((!blocked || (rule.unused && interactive)) && (wifi || !(rule.roaming && roaming))) {
Log.i(TAG, "Allowing " + rule.info.packageName);
try {
builder.addDisallowedApplication(rule.info.packageName);
@ -115,6 +122,7 @@ public class SinkholeService extends VpnService {
Log.e(TAG, ex.toString() + "\n" + Log.getStackTraceString(ex));
}
}
}
// Build configure intent
Intent configure = new Intent(this, ActivityMain.class);
@ -228,8 +236,15 @@ public class SinkholeService extends VpnService {
public void onReceive(Context context, Intent intent) {
Log.i(TAG, "Received " + intent);
Util.logExtras(TAG, intent);
if (intent.hasExtra(ConnectivityManager.EXTRA_NETWORK_TYPE) &&
intent.getIntExtra(ConnectivityManager.EXTRA_NETWORK_TYPE, ConnectivityManager.TYPE_DUMMY) == ConnectivityManager.TYPE_WIFI)
if (last_roaming != Util.isRoaming(SinkholeService.this)) {
last_roaming = !last_roaming;
Log.i(TAG, "New state roaming=" + last_roaming);
reload(null, SinkholeService.this);
} else if (intent.hasExtra(ConnectivityManager.EXTRA_NETWORK_TYPE) &&
intent.getIntExtra(ConnectivityManager.EXTRA_NETWORK_TYPE, ConnectivityManager.TYPE_DUMMY) ==
ConnectivityManager.TYPE_WIFI)
reload(null, SinkholeService.this);
}
};

View File

@ -60,16 +60,26 @@
<LinearLayout
android:id="@+id/llAttributes"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:orientation="horizontal">
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="12dp"
android:orientation="vertical">
<ImageView
android:id="@+id/ivUsing"
android:layout_width="16dp"
android:layout_height="16dp"
android:layout_gravity="center_vertical"
android:layout_marginStart="12dp"
android:layout_gravity="center_horizontal"
android:src="@drawable/using" />
<TextView
android:id="@+id/tvRoaming"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="R"
android:textAppearance="@android:style/TextAppearance.Material.Small"
android:textColor="@color/colorAccent" />
</LinearLayout>
</LinearLayout>
@ -77,7 +87,7 @@
android:id="@+id/llConfiguration"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginStart="8dp"
android:layout_marginStart="4dp"
android:orientation="vertical"
android:paddingStart="?android:attr/listPreferredItemHeightSmall"
android:paddingTop="0dp"
@ -100,6 +110,14 @@
android:text="@string/title_using"
android:textAppearance="@android:style/TextAppearance.Material.Small" />
<CheckBox
android:id="@+id/cbRoaming"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="4dp"
android:text="@string/title_roaming"
android:textAppearance="@android:style/TextAppearance.Material.Small" />
<Button
android:id="@+id/btnLaunch"
android:layout_width="wrap_content"

View File

@ -19,6 +19,10 @@
android:id="@+id/menu_whitelist_other"
android:checkable="true"
android:title="@string/menu_whitelist_other" />
<item
android:id="@+id/menu_whitelist_roaming"
android:checkable="true"
android:title="@string/menu_whitelist_roaming" />
<item
android:id="@+id/menu_system"
android:checkable="true"

View File

@ -6,6 +6,7 @@
<string name="menu_network">فتح إعدادات الشبكة</string>
<string name="menu_whitelist_wifi">حظر الواي فاي بشكل افتراضي</string>
<string name="menu_whitelist_other">حظر الشبكة بشكل افتراضي</string>
<string name="menu_whitelist_roaming">Block roaming by default</string>
<string name="menu_system">Manage system applications</string>
<string name="menu_export">Export settings</string>
<string name="menu_import">Import settings</string>
@ -19,6 +20,7 @@
<string name="msg_revoked">NetGuard has been disabled</string>
<string name="title_using">السماح عند استخدام الجهاز</string>
<string name="title_roaming">Block when roaming</string>
<string name="title_launch">Start application</string>
<string name="title_donate">Donate</string>
<string name="title_thanks">Thank you for your donation!</string>

View File

@ -6,6 +6,7 @@
<string name="menu_network">Ouvrir les paramètres réseaux</string>
<string name="menu_whitelist_wifi">Blocage Wi-Fi par défaut</string>
<string name="menu_whitelist_other">Blocage données mobiles par défaut</string>
<string name="menu_whitelist_roaming">Block roaming by default</string>
<string name="menu_system">Manage system applications</string>
<string name="menu_export">Export settings</string>
<string name="menu_import">Import settings</string>
@ -19,6 +20,7 @@
<string name="msg_revoked">NetGuard has been disabled</string>
<string name="title_using">Allow when device in use</string>
<string name="title_roaming">Block when roaming</string>
<string name="title_launch">Start application</string>
<string name="title_donate">Donate</string>
<string name="title_thanks">Thank you for your donation!</string>

View File

@ -6,6 +6,7 @@
<string name="menu_network">Apri impostazioni di rete</string>
<string name="menu_whitelist_wifi">Blocca Wi-Fi di default</string>
<string name="menu_whitelist_other">Block rete di dati di default</string>
<string name="menu_whitelist_roaming">Block roaming by default</string>
<string name="menu_system">Manage system applications</string>
<string name="menu_export">Export settings</string>
<string name="menu_import">Import settings</string>
@ -19,6 +20,7 @@
<string name="msg_revoked">NetGuard has been disabled</string>
<string name="title_using">Consenti quando il dispositivo è in uso</string>
<string name="title_roaming">Block when roaming</string>
<string name="title_launch">Start application</string>
<string name="title_donate">Donate</string>
<string name="title_thanks">Thank you for your donation!</string>

View File

@ -6,6 +6,7 @@
<string name="menu_network">네트워크 설정 열기</string>
<string name="menu_whitelist_wifi">Wi-Fi 차단을 기본 설정으로</string>
<string name="menu_whitelist_other">모바일 데이터 차단을 기본 설정으로</string>
<string name="menu_whitelist_roaming">Block roaming by default</string>
<string name="menu_system">Manage system applications</string>
<string name="menu_export">Export settings</string>
<string name="menu_import">Import settings</string>
@ -19,6 +20,7 @@
<string name="msg_revoked">넷가드가 해제되었습니다</string>
<string name="title_using">기기가 사용중일때 허용</string>
<string name="title_roaming">Block when roaming</string>
<string name="title_launch">앱 시작</string>
<string name="title_donate">기부</string>
<string name="title_thanks">기부해주셔서 감사합니다!</string>

View File

@ -6,6 +6,7 @@
<string name="menu_network">Open netwerkinstellingen</string>
<string name="menu_whitelist_wifi">Blokkeer Wi-Fi standaard</string>
<string name="menu_whitelist_other">Blokkeer mobiel standaard</string>
<string name="menu_whitelist_roaming">Blokkeer roaming standaard</string>
<string name="menu_system">Beheer systeemapplicaties</string>
<string name="menu_export">Exporteer instellingen</string>
<string name="menu_import">Importeer instellingen</string>
@ -19,6 +20,7 @@
<string name="msg_revoked">NetGuard is uitgezet</string>
<string name="title_using">Sta toe als apparaat in gebruik</string>
<string name="title_roaming">Blokkeer bij roamen</string>
<string name="title_launch">Start applicatie</string>
<string name="title_donate">Doneer</string>
<string name="title_thanks">Bedankt voor uw donatie!</string>

View File

@ -6,6 +6,7 @@
<string name="menu_network">Deschide setari retea</string>
<string name="menu_whitelist_wifi">Blocheaza implicit Wi-Fi</string>
<string name="menu_whitelist_other">Blocheaza implicit date mobile</string>
<string name="menu_whitelist_roaming">Block roaming by default</string>
<string name="menu_system">Gestionati aplicatii de sistem</string>
<string name="menu_export">Exporta setari</string>
<string name="menu_import">Importa setari</string>
@ -19,6 +20,7 @@
<string name="msg_revoked">NetGuard a fost dezactivat</string>
<string name="title_using">Permite cand dispozitivul este folosit</string>
<string name="title_roaming">Block when roaming</string>
<string name="title_launch">Porneste aplicatia</string>
<string name="title_donate">Doneaza</string>
<string name="title_thanks">Iti multumesc pentru donatie!</string>

View File

@ -6,6 +6,7 @@
<string name="menu_network">Otvoriť nastavenia sietí</string>
<string name="menu_whitelist_wifi">Predvolene blokovať Wi-Fi</string>
<string name="menu_whitelist_other">Predvolene blokovať mobilné dáta</string>
<string name="menu_whitelist_roaming">Block roaming by default</string>
<string name="menu_system">Spravovať systémové aplikácie</string>
<string name="menu_export">Exportovať nastavenia</string>
<string name="menu_import">Importovať nastavenia</string>
@ -19,6 +20,7 @@
<string name="msg_revoked">NetGuard je vypnutý</string>
<string name="title_using">Povoliť pri používaní zariadenia</string>
<string name="title_roaming">Block when roaming</string>
<string name="title_launch">Spustiť aplikáciu</string>
<string name="title_donate">Prispieť</string>
<string name="title_thanks">Ďakujeme vám za váš príspevok!</string>

View File

@ -6,6 +6,7 @@
<string name="menu_network">打开网络设置</string>
<string name="menu_whitelist_wifi">默认阻止Wi-Fi网络</string>
<string name="menu_whitelist_other">默认阻止移动网络</string>
<string name="menu_whitelist_roaming">Block roaming by default</string>
<string name="menu_system">管理系统应用</string>
<string name="menu_export">导出设置</string>
<string name="menu_import">导入设置</string>
@ -19,6 +20,7 @@
<string name="msg_revoked">NetGuard已被停用</string>
<string name="title_using">设备使用时允许运行</string>
<string name="title_roaming">Block when roaming</string>
<string name="title_launch">启动应用</string>
<string name="title_donate">捐赠</string>
<string name="title_thanks">感谢您的捐赠!</string>

View File

@ -7,6 +7,7 @@
<string name="menu_network">Open network settings</string>
<string name="menu_whitelist_wifi">Block Wi-Fi by default</string>
<string name="menu_whitelist_other">Block mobile by default</string>
<string name="menu_whitelist_roaming">Block roaming by default</string>
<string name="menu_system">Manage system applications</string>
<string name="menu_export">Export settings</string>
<string name="menu_import">Import settings</string>
@ -20,6 +21,7 @@
<string name="msg_revoked">NetGuard has been disabled</string>
<string name="title_using">Allow when device in use</string>
<string name="title_roaming">Block when roaming</string>
<string name="title_launch">Start application</string>
<string name="title_donate">Donate</string>
<string name="title_thanks">Thank you for your donation!</string>