From 8b32f82566b00d5be7283c792a6e8ddc172f389b Mon Sep 17 00:00:00 2001 From: akwizgran Date: Thu, 29 Jun 2017 18:18:39 +0100 Subject: [PATCH 1/3] Don't show tap protection dialog until it's needed. --- .../android/ScreenFilterMonitorImpl.java | 16 ++- .../briar/android/StartupFailureActivity.java | 2 +- .../briar/android/activity/BaseActivity.java | 111 ++++++++++++++---- ...t.java => ScreenFilterDialogFragment.java} | 31 ++--- .../android/splash/SplashScreenActivity.java | 3 +- .../android/widget/TapSafeFrameLayout.java | 51 ++++++++ .../api/android/ScreenFilterMonitor.java | 2 +- .../main/res/layout/alert_dialog_checkbox.xml | 13 +- briar-android/src/main/res/values/strings.xml | 5 +- briar-android/src/main/res/values/themes.xml | 1 - 10 files changed, 172 insertions(+), 63 deletions(-) rename briar-android/src/main/java/org/briarproject/briar/android/fragment/{SFDialogFragment.java => ScreenFilterDialogFragment.java} (68%) create mode 100644 briar-android/src/main/java/org/briarproject/briar/android/widget/TapSafeFrameLayout.java 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 6acf75255..b6f0ea10f 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 @@ -183,15 +183,13 @@ public class ScreenFilterMonitorImpl extends BroadcastReceiver @Override @UiThread - public void storeAppsAsShown(Collection s, boolean persistent) { - HashSet buf = new HashSet<>(s); - shownApps.addAll(buf); - if (persistent && !s.isEmpty()) { - buf.addAll(getShownScreenFilterApps()); - prefs.edit() - .putStringSet(PREF_SCREEN_FILTER_APPS, buf) - .apply(); - } + public void storeAppsAsShown(Collection shown) { + shownApps.addAll(shown); + HashSet buf = new HashSet<>(shown); + buf.addAll(getShownScreenFilterApps()); + prefs.edit() + .putStringSet(PREF_SCREEN_FILTER_APPS, buf) + .apply(); } private Set getInstalledScreenFilterApps() { diff --git a/briar-android/src/main/java/org/briarproject/briar/android/StartupFailureActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/StartupFailureActivity.java index 01a18b2f4..6a1292da6 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/StartupFailureActivity.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/StartupFailureActivity.java @@ -27,7 +27,7 @@ public class StartupFailureActivity extends BaseActivity { } @Override - protected void showNewScreenFilterWarning() { + protected void showScreenFilterWarning() { // Don't show here, service might not be available } 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 8b12f7e2b..53bdc6e1f 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 @@ -2,9 +2,13 @@ package org.briarproject.briar.android.activity; import android.os.Bundle; import android.os.IBinder; +import android.support.annotation.LayoutRes; import android.support.annotation.UiThread; import android.support.v7.app.AppCompatActivity; +import android.support.v7.widget.Toolbar; import android.view.View; +import android.view.ViewGroup; +import android.view.ViewGroup.LayoutParams; import android.view.inputmethod.InputMethodManager; import org.briarproject.bramble.api.db.DbException; @@ -13,7 +17,9 @@ import org.briarproject.briar.android.BriarApplication; import org.briarproject.briar.android.DestroyableContext; import org.briarproject.briar.android.controller.ActivityLifecycleController; import org.briarproject.briar.android.forum.ForumModule; -import org.briarproject.briar.android.fragment.SFDialogFragment; +import org.briarproject.briar.android.fragment.ScreenFilterDialogFragment; +import org.briarproject.briar.android.widget.TapSafeFrameLayout; +import org.briarproject.briar.android.widget.TapSafeFrameLayout.OnTapFilteredListener; import org.briarproject.briar.api.android.ScreenFilterMonitor; import java.util.ArrayList; @@ -23,21 +29,23 @@ import java.util.Set; import javax.annotation.Nullable; import javax.inject.Inject; +import static android.view.ViewGroup.LayoutParams.MATCH_PARENT; import static android.view.WindowManager.LayoutParams.FLAG_SECURE; import static android.view.inputmethod.InputMethodManager.SHOW_IMPLICIT; import static org.briarproject.briar.android.TestingConstants.PREVENT_SCREENSHOTS; public abstract class BaseActivity extends AppCompatActivity - implements DestroyableContext { + implements DestroyableContext, OnTapFilteredListener { + + @Inject + protected ScreenFilterMonitor screenFilterMonitor; + protected ActivityComponent activityComponent; private final List lifecycleControllers = new ArrayList<>(); private boolean destroyed = false; - - @Inject - protected ScreenFilterMonitor screenFilterMonitor; - private SFDialogFragment dialogFrag; + private ScreenFilterDialogFragment dialogFrag; public abstract void injectActivity(ActivityComponent component); @@ -65,7 +73,6 @@ public abstract class BaseActivity extends AppCompatActivity for (ActivityLifecycleController alc : lifecycleControllers) { alc.onActivityCreate(this); } - } public ActivityComponent getActivityComponent() { @@ -97,12 +104,6 @@ public abstract class BaseActivity extends AppCompatActivity } } - @Override - protected void onPostResume() { - super.onPostResume(); - showNewScreenFilterWarning(); - } - @Override protected void onPause() { super.onPause(); @@ -112,18 +113,18 @@ public abstract class BaseActivity extends AppCompatActivity } } - protected void showNewScreenFilterWarning() { - final Set apps = screenFilterMonitor.getApps(); - if (apps.isEmpty()) { - return; - } - dialogFrag = SFDialogFragment.newInstance(new ArrayList<>(apps)); + protected void showScreenFilterWarning() { + if (dialogFrag != null && dialogFrag.isVisible()) return; + Set apps = screenFilterMonitor.getApps(); + if (apps.isEmpty()) return; + dialogFrag = + ScreenFilterDialogFragment.newInstance(new ArrayList<>(apps)); dialogFrag.setCancelable(false); - dialogFrag.show(getSupportFragmentManager(), "SFDialog"); + dialogFrag.show(getSupportFragmentManager(), dialogFrag.getTag()); } - public void rememberShownApps(ArrayList s, boolean permanent) { - screenFilterMonitor.storeAppsAsShown(s, permanent); + public void rememberShownApps(ArrayList s) { + screenFilterMonitor.storeAppsAsShown(s); } @Override @@ -161,4 +162,70 @@ public abstract class BaseActivity extends AppCompatActivity supportFinishAfterTransition(); } + /* + * Wraps the given view in a wrapper that notifies this activity when an + * obscured touch has been filtered, and returns the wrapper. + */ + private View makeTapSafeWrapper(View v) { + TapSafeFrameLayout wrapper = new TapSafeFrameLayout(this); + wrapper.setLayoutParams(new LayoutParams(MATCH_PARENT, MATCH_PARENT)); + wrapper.setOnTapFilteredListener(this); + wrapper.addView(v); + return wrapper; + } + + /* + * Finds the AppCompat toolbar, if any, and configures it to filter + * obscured touches. If a custom toolbar is used, it will be part of the + * content view and thus protected by the wrapper. But the default toolbar + * is outside the wrapper. + */ + private void protectToolbar() { + View decorView = getWindow().getDecorView(); + if (decorView instanceof ViewGroup) { + Toolbar toolbar = findToolbar((ViewGroup) decorView); + if (toolbar != null) toolbar.setFilterTouchesWhenObscured(true); + } + } + + @Nullable + private Toolbar findToolbar(ViewGroup vg) { + for (int i = 0, len = vg.getChildCount(); i < len; i++) { + View child = vg.getChildAt(i); + if (child instanceof Toolbar) return (Toolbar) child; + if (child instanceof ViewGroup) { + Toolbar toolbar = findToolbar((ViewGroup) child); + if (toolbar != null) return toolbar; + } + } + return null; + } + + @Override + public void setContentView(@LayoutRes int layoutRes) { + setContentView(getLayoutInflater().inflate(layoutRes, null)); + } + + @Override + public void setContentView(View v) { + super.setContentView(makeTapSafeWrapper(v)); + protectToolbar(); + } + + @Override + public void setContentView(View v, LayoutParams layoutParams) { + super.setContentView(makeTapSafeWrapper(v), layoutParams); + protectToolbar(); + } + + @Override + public void addContentView(View v, LayoutParams layoutParams) { + super.addContentView(makeTapSafeWrapper(v), layoutParams); + protectToolbar(); + } + + @Override + public void onTapFiltered() { + showScreenFilterWarning(); + } } diff --git a/briar-android/src/main/java/org/briarproject/briar/android/fragment/SFDialogFragment.java b/briar-android/src/main/java/org/briarproject/briar/android/fragment/ScreenFilterDialogFragment.java similarity index 68% rename from briar-android/src/main/java/org/briarproject/briar/android/fragment/SFDialogFragment.java rename to briar-android/src/main/java/org/briarproject/briar/android/fragment/ScreenFilterDialogFragment.java index 248d4c49a..24c653973 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/fragment/SFDialogFragment.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/fragment/ScreenFilterDialogFragment.java @@ -22,10 +22,11 @@ import javax.annotation.Nullable; @MethodsNotNullByDefault @ParametersNotNullByDefault -public class SFDialogFragment extends DialogFragment { +public class ScreenFilterDialogFragment extends DialogFragment { - public static SFDialogFragment newInstance(ArrayList apps) { - SFDialogFragment frag = new SFDialogFragment(); + public static ScreenFilterDialogFragment newInstance( + ArrayList apps) { + ScreenFilterDialogFragment frag = new ScreenFilterDialogFragment(); Bundle args = new Bundle(); args.putStringArrayList("apps", apps); frag.setArguments(args); @@ -34,31 +35,25 @@ public class SFDialogFragment extends DialogFragment { @Override public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) { - AlertDialog.Builder builder = - new AlertDialog.Builder( - getActivity(), - R.style.BriarDialogThemeNoFilter); + 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); + // 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 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_screen_filter_reminder); + final CheckBox cb = (CheckBox) v.findViewById( + R.id.checkbox_dont_show_again); builder.setNeutralButton(R.string.continue_button, new DialogInterface.OnClickListener() { @Override - public void onClick(DialogInterface dialog, - int which) { - ((BaseActivity) getActivity()) - .rememberShownApps(apps, cb.isChecked()); + public void onClick(DialogInterface dialog, int which) { + if (cb.isChecked()) + ((BaseActivity) getActivity()).rememberShownApps(apps); } }); builder.setView(v); diff --git a/briar-android/src/main/java/org/briarproject/briar/android/splash/SplashScreenActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/splash/SplashScreenActivity.java index d67a5b6cd..7d298ef1d 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/splash/SplashScreenActivity.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/splash/SplashScreenActivity.java @@ -84,7 +84,8 @@ public class SplashScreenActivity extends BaseActivity { } @Override - protected void showNewScreenFilterWarning() { + protected void showScreenFilterWarning() { + // Ignore touches until the next activity is shown } private void enableStrictMode() { diff --git a/briar-android/src/main/java/org/briarproject/briar/android/widget/TapSafeFrameLayout.java b/briar-android/src/main/java/org/briarproject/briar/android/widget/TapSafeFrameLayout.java new file mode 100644 index 000000000..840e68b08 --- /dev/null +++ b/briar-android/src/main/java/org/briarproject/briar/android/widget/TapSafeFrameLayout.java @@ -0,0 +1,51 @@ +package org.briarproject.briar.android.widget; + +import android.content.Context; +import android.support.annotation.AttrRes; +import android.util.AttributeSet; +import android.view.MotionEvent; +import android.widget.FrameLayout; + +import org.briarproject.bramble.api.nullsafety.NotNullByDefault; + +import javax.annotation.Nullable; + +import static android.view.MotionEvent.FLAG_WINDOW_IS_OBSCURED; + +@NotNullByDefault +public class TapSafeFrameLayout extends FrameLayout { + + @Nullable + private OnTapFilteredListener listener; + + public TapSafeFrameLayout(Context context) { + super(context); + setFilterTouchesWhenObscured(false); + } + + public TapSafeFrameLayout(Context context, @Nullable AttributeSet attrs) { + super(context, attrs); + setFilterTouchesWhenObscured(false); + } + + public TapSafeFrameLayout(Context context, @Nullable AttributeSet attrs, + @AttrRes int defStyleAttr) { + super(context, attrs, defStyleAttr); + setFilterTouchesWhenObscured(false); + } + + public void setOnTapFilteredListener(OnTapFilteredListener listener) { + this.listener = listener; + } + + @Override + public boolean onFilterTouchEventForSecurity(MotionEvent e) { + boolean filter = (e.getFlags() & FLAG_WINDOW_IS_OBSCURED) != 0; + if (filter && listener != null) listener.onTapFiltered(); + return !filter; + } + + public interface OnTapFilteredListener { + void onTapFiltered(); + } +} 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 b596ecbb2..56adc4336 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 @@ -11,5 +11,5 @@ public interface ScreenFilterMonitor { Set getApps(); @UiThread - void storeAppsAsShown(Collection s, boolean persistent); + void storeAppsAsShown(Collection 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 index 718589da9..a7a7e1279 100644 --- a/briar-android/src/main/res/layout/alert_dialog_checkbox.xml +++ b/briar-android/src/main/res/layout/alert_dialog_checkbox.xml @@ -1,9 +1,9 @@ - + diff --git a/briar-android/src/main/res/values/strings.xml b/briar-android/src/main/res/values/strings.xml index 42d6ba9f2..fbbeb9fdb 100644 --- a/briar-android/src/main/res/values/strings.xml +++ b/briar-android/src/main/res/values/strings.xml @@ -381,9 +381,8 @@ Signing out of Briar… - Screen filter detected - The following apps have permission to draw over other apps:\n\n%1$s \n\nBriar will not respond to touches when another app is drawing over it. -If you experience any problems, try turning off these apps when using Briar.\n + Screen overlay detected + 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 Don\'t warn me again for these apps diff --git a/briar-android/src/main/res/values/themes.xml b/briar-android/src/main/res/values/themes.xml index f87a92356..a9b20148c 100644 --- a/briar-android/src/main/res/values/themes.xml +++ b/briar-android/src/main/res/values/themes.xml @@ -8,7 +8,6 @@ @color/briar_text_link @color/window_background @style/ActivityAnimation - true @style/PreferenceThemeOverlay.v14.Material From f3a084cfd2136c01a34b253042566f7b0d923d3c Mon Sep 17 00:00:00 2001 From: akwizgran Date: Thu, 29 Jun 2017 18:47:36 +0100 Subject: [PATCH 2/3] 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 479b3e94c..c5b09f244 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 b6f0ea10f..e1a88b592 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 apps = new HashSet<>(); - private final Set 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 f = androidExecutor.runOnUiThread(new Callable() { - @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 f = androidExecutor.runOnUiThread(new Callable() { - @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 getShownScreenFilterApps() { - // Result must not be modified - Set s = prefs.getStringSet(PREF_SCREEN_FILTER_APPS, null); - HashSet 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 getApps() { - if (!serviceStarted) { - apps.addAll(getInstalledScreenFilterApps()); - } - TreeSet buf = new TreeSet<>(); - if (apps.isEmpty()) { - return buf; - } - buf.addAll(apps); - buf.removeAll(shownApps); - return buf; - } - - @Override - @UiThread - public void storeAppsAsShown(Collection shown) { - shownApps.addAll(shown); - HashSet buf = new HashSet<>(shown); - buf.addAll(getShownScreenFilterApps()); - prefs.edit() - .putStringSet(PREF_SCREEN_FILTER_APPS, buf) - .apply(); - } - - private Set getInstalledScreenFilterApps() { - HashSet screenFilterApps = new HashSet<>(); + Set screenFilterApps = new TreeSet<>(); List 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 53bdc6e1f..bae3e7b37 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 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 24c653973..242aaed31 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 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 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 56adc4336..9df5add2f 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 getApps(); - - @UiThread - void storeAppsAsShown(Collection 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 a7a7e1279..000000000 --- a/briar-android/src/main/res/layout/alert_dialog_checkbox.xml +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - - - - diff --git a/briar-android/src/main/res/values/strings.xml b/briar-android/src/main/res/values/strings.xml index fbbeb9fdb..76405372f 100644 --- a/briar-android/src/main/res/values/strings.xml +++ b/briar-android/src/main/res/values/strings.xml @@ -382,7 +382,6 @@ Screen overlay detected - 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 - Don\'t warn me again for these apps + 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 From c977bf047d3e64c3f39ce7656a1694f5dd6dbe38 Mon Sep 17 00:00:00 2001 From: akwizgran Date: Mon, 3 Jul 2017 10:08:36 +0100 Subject: [PATCH 3/3] Removed overrides of showScreenFilterWarning. --- .../briarproject/briar/android/StartupFailureActivity.java | 5 ----- .../briarproject/briar/android/activity/BaseActivity.java | 2 +- .../briar/android/splash/SplashScreenActivity.java | 5 ----- 3 files changed, 1 insertion(+), 11 deletions(-) diff --git a/briar-android/src/main/java/org/briarproject/briar/android/StartupFailureActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/StartupFailureActivity.java index 6a1292da6..51ee125d5 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/StartupFailureActivity.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/StartupFailureActivity.java @@ -26,11 +26,6 @@ public class StartupFailureActivity extends BaseActivity { } - @Override - protected void showScreenFilterWarning() { - // Don't show here, service might not be available - } - private void handleIntent(Intent i) { StartResult result = (StartResult) i.getSerializableExtra("briar.START_RESULT"); int notificationId = i.getIntExtra("briar.FAILURE_NOTIFICATION_ID", -1); 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 bae3e7b37..e11a5bb37 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 @@ -113,7 +113,7 @@ public abstract class BaseActivity extends AppCompatActivity } } - protected void showScreenFilterWarning() { + private void showScreenFilterWarning() { if (dialogFrag != null && dialogFrag.isVisible()) return; Set apps = screenFilterMonitor.getApps(); if (apps.isEmpty()) return; diff --git a/briar-android/src/main/java/org/briarproject/briar/android/splash/SplashScreenActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/splash/SplashScreenActivity.java index 7d298ef1d..885ba7f47 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/splash/SplashScreenActivity.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/splash/SplashScreenActivity.java @@ -83,11 +83,6 @@ public class SplashScreenActivity extends BaseActivity { } } - @Override - protected void showScreenFilterWarning() { - // Ignore touches until the next activity is shown - } - private void enableStrictMode() { if (TESTING) { ThreadPolicy.Builder threadPolicy = new ThreadPolicy.Builder();