From 195b0a10d96ad358d956381d8a0e423a8dd913c7 Mon Sep 17 00:00:00 2001 From: Arne Schwabe Date: Sun, 7 Apr 2013 14:05:05 +0200 Subject: Allow clearing of external apps --- src/de/blinkt/openvpn/api/ConfirmDialog.java | 1 + src/de/blinkt/openvpn/api/ExternalAppDatabase.java | 6 +- .../blinkt/openvpn/api/ExternalOpenVPNService.java | 4 +- .../blinkt/openvpn/fragments/GeneralSettings.java | 110 +++++++++++++++++---- 4 files changed, 100 insertions(+), 21 deletions(-) (limited to 'src/de/blinkt') diff --git a/src/de/blinkt/openvpn/api/ConfirmDialog.java b/src/de/blinkt/openvpn/api/ConfirmDialog.java index f72f4921..dfd01884 100644 --- a/src/de/blinkt/openvpn/api/ConfirmDialog.java +++ b/src/de/blinkt/openvpn/api/ConfirmDialog.java @@ -73,6 +73,7 @@ CompoundButton.OnCheckedChangeListener, DialogInterface.OnClickListener { builder.setNegativeButton(android.R.string.cancel,this); mAlert = builder.create(); + mAlert.setCanceledOnTouchOutside(false); mAlert.setOnShowListener (new OnShowListener() { diff --git a/src/de/blinkt/openvpn/api/ExternalAppDatabase.java b/src/de/blinkt/openvpn/api/ExternalAppDatabase.java index ca348152..e640a13a 100644 --- a/src/de/blinkt/openvpn/api/ExternalAppDatabase.java +++ b/src/de/blinkt/openvpn/api/ExternalAppDatabase.java @@ -25,12 +25,12 @@ public class ExternalAppDatabase { } - Set getExtAppList() { + public Set getExtAppList() { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(mContext); Set allowedapps = prefs.getStringSet(PREFERENCES_KEY, new HashSet()); return allowedapps; } - + void addApp(String packagename) { Set allowedapps = getExtAppList(); @@ -45,7 +45,7 @@ public class ExternalAppDatabase { prefedit.apply(); } - void clearAllApiApps() { + public void clearAllApiApps() { saveExtAppList(new HashSet()); } diff --git a/src/de/blinkt/openvpn/api/ExternalOpenVPNService.java b/src/de/blinkt/openvpn/api/ExternalOpenVPNService.java index fff6c34f..9e6ac9f3 100644 --- a/src/de/blinkt/openvpn/api/ExternalOpenVPNService.java +++ b/src/de/blinkt/openvpn/api/ExternalOpenVPNService.java @@ -244,7 +244,9 @@ public class ExternalOpenVPNService extends Service implements StateListener { @Override public void updateState (String state, String logmessage, int resid, ConnectionStatus level) { mMostRecentState = new UpdateMessage(state, logmessage, level); - mHandler.obtainMessage(SEND_TOALL, mMostRecentState); + Message msg = mHandler.obtainMessage(SEND_TOALL, mMostRecentState); + msg.sendToTarget(); + } private static final Handler mHandler = new Handler() { diff --git a/src/de/blinkt/openvpn/fragments/GeneralSettings.java b/src/de/blinkt/openvpn/fragments/GeneralSettings.java index 4ac0a8ac..bf391d29 100644 --- a/src/de/blinkt/openvpn/fragments/GeneralSettings.java +++ b/src/de/blinkt/openvpn/fragments/GeneralSettings.java @@ -1,31 +1,107 @@ package de.blinkt.openvpn.fragments; import java.io.File; +import android.app.AlertDialog; +import android.app.AlertDialog.Builder; +import android.app.Dialog; +import android.content.DialogInterface; +import android.content.DialogInterface.OnClickListener; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageManager; +import android.content.pm.PackageManager.NameNotFoundException; import android.os.Bundle; import android.preference.Preference; +import android.preference.Preference.OnPreferenceClickListener; import android.preference.PreferenceFragment; import de.blinkt.openvpn.R; +import de.blinkt.openvpn.api.ExternalAppDatabase; -public class GeneralSettings extends PreferenceFragment { +public class GeneralSettings extends PreferenceFragment implements OnPreferenceClickListener, OnClickListener { - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - + private ExternalAppDatabase mExtapp; + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + + // Load the preferences from an XML resource + addPreferencesFromResource(R.xml.general_settings); + + Preference loadtun = findPreference("loadTunModule"); + if(!isTunModuleAvailable()) + loadtun.setEnabled(false); - // Load the preferences from an XML resource - addPreferencesFromResource(R.xml.general_settings); - Preference loadtun = findPreference("loadTunModule"); - if(!isTunModuleAvailable()) - loadtun.setEnabled(false); + mExtapp = new ExternalAppDatabase(getActivity()); + Preference clearapi = findPreference("clearapi"); + clearapi.setOnPreferenceClickListener(this); + + setClearApiSummary(); + } + + private void setClearApiSummary() { + Preference clearapi = findPreference("clearapi"); + + if(mExtapp.getExtAppList().isEmpty()) { + clearapi.setEnabled(false); + clearapi.setSummary(R.string.no_external_app_allowed); + } else { + clearapi.setEnabled(true); + clearapi.setSummary(getString(R.string.allowed_apps,getExtAppList(", "))); } + } + + private String getExtAppList(String delim) { + ApplicationInfo app; + PackageManager pm = getActivity().getPackageManager(); + + String applist=null; + for (String packagename : mExtapp.getExtAppList()) { + try { + app = pm.getApplicationInfo(packagename, 0); + if (applist==null) + applist = ""; + else + applist += delim; + applist+=app.loadLabel(pm); - private boolean isTunModuleAvailable() { - // Check if the tun module exists on the file system - if(new File("/system/lib/modules/tun.ko").length() > 10) - return true; - return false; + } catch (NameNotFoundException e) { + // App not found. Remove it from the list + mExtapp.removeApp(packagename); + } } - - } \ No newline at end of file + return applist; + } + + private boolean isTunModuleAvailable() { + // Check if the tun module exists on the file system + if(new File("/system/lib/modules/tun.ko").length() > 10) + return true; + return false; + } + + @Override + public boolean onPreferenceClick(Preference preference) { + if(preference.getKey().equals("clearapi")){ + Builder builder = new AlertDialog.Builder(getActivity()); + builder.setPositiveButton(R.string.clear, this); + builder.setNegativeButton(android.R.string.cancel, null); + builder.setMessage(getString(R.string.clearappsdialog,getExtAppList("\n"))); + builder.show(); + } + + return true; + } + + @Override + public void onClick(DialogInterface dialog, int which) { + if( which == Dialog.BUTTON_POSITIVE){ + mExtapp.clearAllApiApps(); + setClearApiSummary(); + } + } + + + +} \ No newline at end of file -- cgit v1.2.3