From f3a084cfd2136c01a34b253042566f7b0d923d3c Mon Sep 17 00:00:00 2001 From: akwizgran <akwizgran@users.sourceforge.net> Date: Thu, 29 Jun 2017 18:47:36 +0100 Subject: [PATCH] Removed option to remember shown overlay apps. --- .../briarproject/briar/android/AppModule.java | 8 +- .../android/ScreenFilterMonitorImpl.java | 154 +----------------- .../briar/android/activity/BaseActivity.java | 4 - .../fragment/ScreenFilterDialogFragment.java | 28 +--- .../api/android/ScreenFilterMonitor.java | 4 - .../main/res/layout/alert_dialog_checkbox.xml | 39 ----- briar-android/src/main/res/values/strings.xml | 3 +- 7 files changed, 15 insertions(+), 225 deletions(-) delete mode 100644 briar-android/src/main/res/layout/alert_dialog_checkbox.xml diff --git a/briar-android/src/main/java/org/briarproject/briar/android/AppModule.java b/briar-android/src/main/java/org/briarproject/briar/android/AppModule.java index 479b3e94ca..c5b09f2443 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/AppModule.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/AppModule.java @@ -38,8 +38,6 @@ public class AppModule { static class EagerSingletons { @Inject AndroidNotificationManager androidNotificationManager; - @Inject - ScreenFilterMonitor screenFilterMonitor; } private final Application application; @@ -171,10 +169,8 @@ public class AppModule { } @Provides - @Singleton ScreenFilterMonitor provideScreenFilterMonitor( - LifecycleManager lifecycleManager, ScreenFilterMonitorImpl sfm) { - lifecycleManager.registerService(sfm); - return sfm; + ScreenFilterMonitorImpl screenFilterMonitor) { + return screenFilterMonitor; } } diff --git a/briar-android/src/main/java/org/briarproject/briar/android/ScreenFilterMonitorImpl.java b/briar-android/src/main/java/org/briarproject/briar/android/ScreenFilterMonitorImpl.java index b6f0ea10fc..e1a88b5928 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/ScreenFilterMonitorImpl.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/ScreenFilterMonitorImpl.java @@ -1,23 +1,13 @@ package org.briarproject.briar.android; import android.app.Application; -import android.content.BroadcastReceiver; -import android.content.Context; -import android.content.Intent; -import android.content.IntentFilter; -import android.content.SharedPreferences; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.Signature; import android.support.annotation.UiThread; -import android.support.v7.preference.PreferenceManager; -import org.briarproject.bramble.api.lifecycle.Service; -import org.briarproject.bramble.api.lifecycle.ServiceException; -import org.briarproject.bramble.api.nullsafety.MethodsNotNullByDefault; -import org.briarproject.bramble.api.nullsafety.ParametersNotNullByDefault; -import org.briarproject.bramble.api.system.AndroidExecutor; +import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.bramble.util.StringUtils; import org.briarproject.briar.api.android.ScreenFilterMonitor; @@ -26,38 +16,26 @@ import java.io.InputStream; import java.security.cert.CertificateException; import java.security.cert.CertificateFactory; import java.security.cert.X509Certificate; -import java.util.Collection; -import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.TreeSet; -import java.util.concurrent.Callable; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.Future; -import java.util.concurrent.atomic.AtomicBoolean; import java.util.logging.Logger; import javax.annotation.Nullable; import javax.inject.Inject; import static android.Manifest.permission.SYSTEM_ALERT_WINDOW; -import static android.content.Intent.ACTION_PACKAGE_ADDED; -import static android.content.Intent.EXTRA_REPLACING; import static android.content.pm.ApplicationInfo.FLAG_SYSTEM; import static android.content.pm.ApplicationInfo.FLAG_UPDATED_SYSTEM_APP; import static android.content.pm.PackageManager.GET_PERMISSIONS; import static android.content.pm.PackageManager.GET_SIGNATURES; import static java.util.logging.Level.WARNING; -@MethodsNotNullByDefault -@ParametersNotNullByDefault -public class ScreenFilterMonitorImpl extends BroadcastReceiver - implements Service, ScreenFilterMonitor { +@NotNullByDefault +class ScreenFilterMonitorImpl implements ScreenFilterMonitor { private static final Logger LOG = Logger.getLogger(ScreenFilterMonitorImpl.class.getName()); - private static final String PREF_SCREEN_FILTER_APPS = - "shownScreenFilterApps"; /* * Ignore Play Services if it uses this package name and public key - it's @@ -78,122 +56,17 @@ public class ScreenFilterMonitorImpl extends BroadcastReceiver "82BA35E003C1B4B10DD244A8EE24FFFD333872AB5221985EDAB0FC0D" + "0B145B6AA192858E79020103"; - private final Context appContext; - private final AndroidExecutor androidExecutor; private final PackageManager pm; - private final SharedPreferences prefs; - private final AtomicBoolean used = new AtomicBoolean(false); - - // The following must only be accessed on the UI thread - private final Set<String> apps = new HashSet<>(); - private final Set<String> shownApps; - private boolean serviceStarted = false; @Inject - ScreenFilterMonitorImpl(AndroidExecutor executor, Application app) { - this.androidExecutor = executor; - this.appContext = app; - pm = appContext.getPackageManager(); - prefs = PreferenceManager.getDefaultSharedPreferences(appContext); - shownApps = getShownScreenFilterApps(); - } - - @Override - public void startService() throws ServiceException { - if (used.getAndSet(true)) throw new IllegalStateException(); - Future<Void> f = androidExecutor.runOnUiThread(new Callable<Void>() { - @Override - public Void call() { - IntentFilter intentFilter = new IntentFilter(); - intentFilter.addAction(ACTION_PACKAGE_ADDED); - intentFilter.addDataScheme("package"); - appContext.registerReceiver(ScreenFilterMonitorImpl.this, - intentFilter); - apps.addAll(getInstalledScreenFilterApps()); - serviceStarted = true; - return null; - } - }); - try { - f.get(); - } catch (InterruptedException | ExecutionException e) { - throw new ServiceException(e); - } - } - - @Override - public void stopService() throws ServiceException { - Future<Void> f = androidExecutor.runOnUiThread(new Callable<Void>() { - @Override - public Void call() { - serviceStarted = false; - appContext.unregisterReceiver(ScreenFilterMonitorImpl.this); - return null; - } - }); - try { - f.get(); - } catch (InterruptedException | ExecutionException e) { - throw new ServiceException(e); - } - } - - private Set<String> getShownScreenFilterApps() { - // Result must not be modified - Set<String> s = prefs.getStringSet(PREF_SCREEN_FILTER_APPS, null); - HashSet<String> result = new HashSet<>(); - if (s != null) { - result.addAll(s); - } - return result; - } - - @Override - public void onReceive(Context context, Intent intent) { - if (!intent.getBooleanExtra(EXTRA_REPLACING, false)) { - final String packageName = - intent.getData().getEncodedSchemeSpecificPart(); - androidExecutor.runOnUiThread(new Runnable() { - @Override - public void run() { - String pkg = isOverlayApp(packageName); - if (pkg == null) { - return; - } - apps.add(pkg); - } - }); - } + ScreenFilterMonitorImpl(Application app) { + pm = app.getPackageManager(); } @Override @UiThread public Set<String> getApps() { - if (!serviceStarted) { - apps.addAll(getInstalledScreenFilterApps()); - } - TreeSet<String> buf = new TreeSet<>(); - if (apps.isEmpty()) { - return buf; - } - buf.addAll(apps); - buf.removeAll(shownApps); - return buf; - } - - @Override - @UiThread - public void storeAppsAsShown(Collection<String> shown) { - shownApps.addAll(shown); - HashSet<String> buf = new HashSet<>(shown); - buf.addAll(getShownScreenFilterApps()); - prefs.edit() - .putStringSet(PREF_SCREEN_FILTER_APPS, buf) - .apply(); - } - - private Set<String> getInstalledScreenFilterApps() { - HashSet<String> screenFilterApps = new HashSet<>(); + Set<String> screenFilterApps = new TreeSet<>(); List<PackageInfo> packageInfos = pm.getInstalledPackages(GET_PERMISSIONS); for (PackageInfo packageInfo : packageInfos) { @@ -207,21 +80,6 @@ public class ScreenFilterMonitorImpl extends BroadcastReceiver return screenFilterApps; } - // Checks if a package uses the SYSTEM_ALERT_WINDOW permission and if so - // returns the app name. - @Nullable - private String isOverlayApp(String pkg) { - try { - PackageInfo pkgInfo = pm.getPackageInfo(pkg, GET_PERMISSIONS); - if (isOverlayApp(pkgInfo)) { - return pkgToString(pkgInfo); - } - } catch (NameNotFoundException e) { - if (LOG.isLoggable(WARNING)) LOG.log(WARNING, e.toString(), e); - } - return null; - } - // Fetches the application name for a given package. @Nullable private String pkgToString(PackageInfo pkgInfo) { diff --git a/briar-android/src/main/java/org/briarproject/briar/android/activity/BaseActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/activity/BaseActivity.java index 53bdc6e1fe..bae3e7b378 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/activity/BaseActivity.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/activity/BaseActivity.java @@ -123,10 +123,6 @@ public abstract class BaseActivity extends AppCompatActivity dialogFrag.show(getSupportFragmentManager(), dialogFrag.getTag()); } - public void rememberShownApps(ArrayList<String> s) { - screenFilterMonitor.storeAppsAsShown(s); - } - @Override protected void onDestroy() { super.onDestroy(); diff --git a/briar-android/src/main/java/org/briarproject/briar/android/fragment/ScreenFilterDialogFragment.java b/briar-android/src/main/java/org/briarproject/briar/android/fragment/ScreenFilterDialogFragment.java index 24c6539732..242aaed31b 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/fragment/ScreenFilterDialogFragment.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/fragment/ScreenFilterDialogFragment.java @@ -6,22 +6,15 @@ import android.os.Bundle; import android.support.v4.app.DialogFragment; import android.support.v7.app.AlertDialog; import android.text.TextUtils; -import android.view.LayoutInflater; -import android.view.View; -import android.widget.CheckBox; -import android.widget.TextView; -import org.briarproject.bramble.api.nullsafety.MethodsNotNullByDefault; -import org.briarproject.bramble.api.nullsafety.ParametersNotNullByDefault; +import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.briar.R; -import org.briarproject.briar.android.activity.BaseActivity; import java.util.ArrayList; import javax.annotation.Nullable; -@MethodsNotNullByDefault -@ParametersNotNullByDefault +@NotNullByDefault public class ScreenFilterDialogFragment extends DialogFragment { public static ScreenFilterDialogFragment newInstance( @@ -38,25 +31,16 @@ public class ScreenFilterDialogFragment extends DialogFragment { AlertDialog.Builder builder = new AlertDialog.Builder(getActivity(), R.style.BriarDialogThemeNoFilter); builder.setTitle(R.string.screen_filter_title); - LayoutInflater li = getActivity().getLayoutInflater(); - // Pass null here because it's an AlertDialog - View v = li.inflate(R.layout.alert_dialog_checkbox, null, false); - TextView t = (TextView) v.findViewById(R.id.alert_dialog_text); - final ArrayList<String> apps = - getArguments().getStringArrayList("apps"); - t.setText(getString(R.string.screen_filter_body, TextUtils - .join("\n", apps))); - final CheckBox cb = (CheckBox) v.findViewById( - R.id.checkbox_dont_show_again); + ArrayList<String> apps = getArguments().getStringArrayList("apps"); + builder.setMessage(getString(R.string.screen_filter_body, + TextUtils.join("\n", apps))); builder.setNeutralButton(R.string.continue_button, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { - if (cb.isChecked()) - ((BaseActivity) getActivity()).rememberShownApps(apps); + dialog.dismiss(); } }); - builder.setView(v); return builder.create(); } } diff --git a/briar-android/src/main/java/org/briarproject/briar/api/android/ScreenFilterMonitor.java b/briar-android/src/main/java/org/briarproject/briar/api/android/ScreenFilterMonitor.java index 56adc43364..9df5add2f7 100644 --- a/briar-android/src/main/java/org/briarproject/briar/api/android/ScreenFilterMonitor.java +++ b/briar-android/src/main/java/org/briarproject/briar/api/android/ScreenFilterMonitor.java @@ -2,14 +2,10 @@ package org.briarproject.briar.api.android; import android.support.annotation.UiThread; -import java.util.Collection; import java.util.Set; public interface ScreenFilterMonitor { @UiThread Set<String> getApps(); - - @UiThread - void storeAppsAsShown(Collection<String> shown); } diff --git a/briar-android/src/main/res/layout/alert_dialog_checkbox.xml b/briar-android/src/main/res/layout/alert_dialog_checkbox.xml deleted file mode 100644 index a7a7e1279c..0000000000 --- a/briar-android/src/main/res/layout/alert_dialog_checkbox.xml +++ /dev/null @@ -1,39 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<LinearLayout - xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:orientation="vertical"> - - <ScrollView - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_weight="1" - android:fadeScrollbars="false" - android:paddingLeft="20dp" - android:paddingRight="20dp" - android:paddingStart="20dp" - android:paddingTop="20dp" - android:theme="@style/BriarTheme"> - - <TextView - android:id="@+id/alert_dialog_text" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:paddingLeft="3dp" - android:paddingRight="6dp" - android:text="TextView" - android:textAppearance="@style/BriarTextBody" - android:theme="@+theme/BriarDialogTheme"/> - </ScrollView> - - <CheckBox - android:id="@+id/checkbox_dont_show_again" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_marginLeft="15dp" - android:layout_marginStart="15dp" - android:layout_weight="0" - android:text="@string/checkbox_dont_show_again" - android:textAppearance="@style/BriarTextBody"/> -</LinearLayout> diff --git a/briar-android/src/main/res/values/strings.xml b/briar-android/src/main/res/values/strings.xml index fbbeb9fdbd..76405372fa 100644 --- a/briar-android/src/main/res/values/strings.xml +++ b/briar-android/src/main/res/values/strings.xml @@ -382,7 +382,6 @@ <!-- Screen Filters & Tapjacking --> <string name="screen_filter_title">Screen overlay detected</string> - <string name="screen_filter_body">Another app is drawing on top of Briar. To protect your security, Briar will not respond to touches while another app is drawing on top.\n\nThe following apps have permission to draw on top:\n\n%1$s \n\nTry turning off these apps when using Briar.\n</string> - <string name="checkbox_dont_show_again">Don\'t warn me again for these apps</string> + <string name="screen_filter_body">Another app is drawing on top of Briar. To protect your security, Briar will not respond to touches when another app is drawing on top.\n\nTry turning off the following apps when using Briar:\n\n%1$s</string> </resources> -- GitLab