From 622f41f11f92005e2dd3791fd13b0ace294958d5 Mon Sep 17 00:00:00 2001 From: "Jason A. Donenfeld" Date: Sun, 29 Apr 2018 02:04:28 +0200 Subject: Allow exporting to zip file Signed-off-by: Jason A. Donenfeld --- .../android/activity/SettingsActivity.java | 50 ++++++++++++++++++++++ 1 file changed, 50 insertions(+) (limited to 'app/src/main/java/com/wireguard/android/activity') diff --git a/app/src/main/java/com/wireguard/android/activity/SettingsActivity.java b/app/src/main/java/com/wireguard/android/activity/SettingsActivity.java index e3cd46b1..41761b32 100644 --- a/app/src/main/java/com/wireguard/android/activity/SettingsActivity.java +++ b/app/src/main/java/com/wireguard/android/activity/SettingsActivity.java @@ -1,6 +1,7 @@ package com.wireguard.android.activity; import android.app.Activity; +import android.content.pm.PackageManager; import android.os.Bundle; import android.preference.Preference; import android.preference.PreferenceFragment; @@ -9,11 +10,60 @@ import com.wireguard.android.Application; import com.wireguard.android.R; import com.wireguard.android.backend.WgQuickBackend; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; + /** * Interface for changing application-global persistent settings. */ public class SettingsActivity extends Activity { + @FunctionalInterface + public interface PermissionRequestCallback { + void done(String[] permissions, int[] grantResults); + } + + private HashMap permissionRequestCallbacks = new HashMap<>(); + private int permissionRequestCounter = 0; + + public synchronized void ensurePermissions(String[] permissions, PermissionRequestCallback cb) { + /* TODO(MSF): since when porting to AppCompat, you'll be replacing checkSelfPermission + * and requestPermission with AppCompat.checkSelfPermission and AppCompat.requestPermission, + * you can remove this SDK_INT block entirely here, and count on the compat lib to do + * the right thing. */ + if (android.os.Build.VERSION.SDK_INT < 23) { + int[] granted = new int[permissions.length]; + Arrays.fill(granted, PackageManager.PERMISSION_GRANTED); + cb.done(permissions, granted); + } else { + List needPermissions = new ArrayList<>(permissions.length); + for (final String permission : permissions) { + if (getApplicationContext().checkSelfPermission(permission) != PackageManager.PERMISSION_GRANTED) + needPermissions.add(permission); + } + if (needPermissions.isEmpty()) { + int[] granted = new int[permissions.length]; + Arrays.fill(granted, PackageManager.PERMISSION_GRANTED); + cb.done(permissions, granted); + return; + } + int idx = permissionRequestCounter++; + permissionRequestCallbacks.put(idx, cb); + requestPermissions(needPermissions.toArray(new String[needPermissions.size()]), idx); + } + } + + @Override + public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { + final PermissionRequestCallback f = permissionRequestCallbacks.get(requestCode); + if (f != null) { + permissionRequestCallbacks.remove(requestCode); + f.done(permissions, grantResults); + } + } + @Override protected void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); -- cgit v1.2.3