Added permission handling and support for API 23
This commit is contained in:
parent
a0ade8acc9
commit
b68ad65abc
@ -5,7 +5,7 @@ android {
|
|||||||
buildToolsVersion "23.0.0"
|
buildToolsVersion "23.0.0"
|
||||||
defaultConfig {
|
defaultConfig {
|
||||||
minSdkVersion 14
|
minSdkVersion 14
|
||||||
targetSdkVersion 22
|
targetSdkVersion 23
|
||||||
versionName "4.1.1a"
|
versionName "4.1.1a"
|
||||||
}
|
}
|
||||||
sourceSets {
|
sourceSets {
|
||||||
|
@ -4,8 +4,6 @@
|
|||||||
package="acr.browser.lightning" >
|
package="acr.browser.lightning" >
|
||||||
|
|
||||||
<uses-permission android:name="android.permission.INTERNET" />
|
<uses-permission android:name="android.permission.INTERNET" />
|
||||||
<uses-permission android:name="com.android.browser.permission.READ_HISTORY_BOOKMARKS" />
|
|
||||||
<uses-permission android:name="com.android.browser.permission.WRITE_HISTORY_BOOKMARKS" />
|
|
||||||
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
|
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
|
||||||
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
|
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
|
||||||
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
|
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
|
||||||
|
@ -118,6 +118,7 @@ import acr.browser.lightning.object.DrawerArrowDrawable;
|
|||||||
import acr.browser.lightning.object.SearchAdapter;
|
import acr.browser.lightning.object.SearchAdapter;
|
||||||
import acr.browser.lightning.preference.PreferenceManager;
|
import acr.browser.lightning.preference.PreferenceManager;
|
||||||
import acr.browser.lightning.receiver.NetworkReceiver;
|
import acr.browser.lightning.receiver.NetworkReceiver;
|
||||||
|
import acr.browser.lightning.utils.PermissionsManager;
|
||||||
import acr.browser.lightning.utils.ProxyUtils;
|
import acr.browser.lightning.utils.ProxyUtils;
|
||||||
import acr.browser.lightning.utils.ThemeUtils;
|
import acr.browser.lightning.utils.ThemeUtils;
|
||||||
import acr.browser.lightning.utils.UrlUtils;
|
import acr.browser.lightning.utils.UrlUtils;
|
||||||
@ -2868,4 +2869,10 @@ public abstract class BrowserActivity extends ThemableBrowserActivity implements
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
|
||||||
|
PermissionsManager.getInstance().notifyPermissionsChange(permissions);
|
||||||
|
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
package acr.browser.lightning.activity;
|
package acr.browser.lightning.activity;
|
||||||
|
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
|
import android.support.annotation.NonNull;
|
||||||
import android.support.v7.widget.Toolbar;
|
import android.support.v7.widget.Toolbar;
|
||||||
import android.view.MenuItem;
|
import android.view.MenuItem;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
@ -14,6 +15,7 @@ import java.util.ArrayList;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import acr.browser.lightning.R;
|
import acr.browser.lightning.R;
|
||||||
|
import acr.browser.lightning.utils.PermissionsManager;
|
||||||
|
|
||||||
public class SettingsActivity extends ThemableSettingsActivity {
|
public class SettingsActivity extends ThemableSettingsActivity {
|
||||||
|
|
||||||
@ -56,4 +58,10 @@ public class SettingsActivity extends ThemableSettingsActivity {
|
|||||||
finish();
|
finish();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
|
||||||
|
PermissionsManager.getInstance().notifyPermissionsChange(permissions);
|
||||||
|
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -3,8 +3,10 @@
|
|||||||
*/
|
*/
|
||||||
package acr.browser.lightning.fragment;
|
package acr.browser.lightning.fragment;
|
||||||
|
|
||||||
|
import android.Manifest;
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
import android.content.DialogInterface;
|
import android.content.DialogInterface;
|
||||||
|
import android.os.Build;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.os.Environment;
|
import android.os.Environment;
|
||||||
import android.preference.Preference;
|
import android.preference.Preference;
|
||||||
@ -17,7 +19,7 @@ import java.util.Comparator;
|
|||||||
|
|
||||||
import acr.browser.lightning.R;
|
import acr.browser.lightning.R;
|
||||||
import acr.browser.lightning.database.BookmarkManager;
|
import acr.browser.lightning.database.BookmarkManager;
|
||||||
import acr.browser.lightning.preference.PreferenceManager;
|
import acr.browser.lightning.utils.PermissionsManager;
|
||||||
|
|
||||||
public class BookmarkSettingsFragment extends PreferenceFragment implements Preference.OnPreferenceClickListener {
|
public class BookmarkSettingsFragment extends PreferenceFragment implements Preference.OnPreferenceClickListener {
|
||||||
|
|
||||||
@ -28,6 +30,11 @@ public class BookmarkSettingsFragment extends PreferenceFragment implements Pref
|
|||||||
private BookmarkManager mBookmarkManager;
|
private BookmarkManager mBookmarkManager;
|
||||||
private File[] mFileList;
|
private File[] mFileList;
|
||||||
private String[] mFileNameList;
|
private String[] mFileNameList;
|
||||||
|
private PermissionsManager mPermissionsManager;
|
||||||
|
private static String[] REQUIRED_PERMISSIONS = new String[]{
|
||||||
|
Manifest.permission.READ_EXTERNAL_STORAGE,
|
||||||
|
Manifest.permission.WRITE_EXTERNAL_STORAGE
|
||||||
|
};
|
||||||
private static final File mPath = new File(Environment.getExternalStorageDirectory().toString());
|
private static final File mPath = new File(Environment.getExternalStorageDirectory().toString());
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -41,11 +48,14 @@ public class BookmarkSettingsFragment extends PreferenceFragment implements Pref
|
|||||||
mBookmarkManager = BookmarkManager.getInstance(mActivity.getApplicationContext());
|
mBookmarkManager = BookmarkManager.getInstance(mActivity.getApplicationContext());
|
||||||
|
|
||||||
initPrefs();
|
initPrefs();
|
||||||
|
|
||||||
|
mPermissionsManager = PermissionsManager.getInstance();
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
|
||||||
|
mPermissionsManager.requestPermissionsIfNecessary(getActivity(), REQUIRED_PERMISSIONS);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void initPrefs() {
|
private void initPrefs() {
|
||||||
// mPreferences storage
|
|
||||||
PreferenceManager mPreferences = PreferenceManager.getInstance();
|
|
||||||
|
|
||||||
Preference exportpref = findPreference(SETTINGS_EXPORT);
|
Preference exportpref = findPreference(SETTINGS_EXPORT);
|
||||||
Preference importpref = findPreference(SETTINGS_IMPORT);
|
Preference importpref = findPreference(SETTINGS_IMPORT);
|
||||||
@ -58,11 +68,15 @@ public class BookmarkSettingsFragment extends PreferenceFragment implements Pref
|
|||||||
public boolean onPreferenceClick(Preference preference) {
|
public boolean onPreferenceClick(Preference preference) {
|
||||||
switch (preference.getKey()) {
|
switch (preference.getKey()) {
|
||||||
case SETTINGS_EXPORT:
|
case SETTINGS_EXPORT:
|
||||||
mBookmarkManager.exportBookmarks(getActivity());
|
if (PermissionsManager.checkPermissions(getActivity(), REQUIRED_PERMISSIONS)) {
|
||||||
|
mBookmarkManager.exportBookmarks(getActivity());
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
case SETTINGS_IMPORT:
|
case SETTINGS_IMPORT:
|
||||||
loadFileList(null);
|
if (PermissionsManager.checkPermissions(getActivity(), REQUIRED_PERMISSIONS)) {
|
||||||
createDialog();
|
loadFileList(null);
|
||||||
|
createDialog();
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
default:
|
default:
|
||||||
return false;
|
return false;
|
||||||
@ -87,12 +101,11 @@ public class BookmarkSettingsFragment extends PreferenceFragment implements Pref
|
|||||||
mFileList = new File[0];
|
mFileList = new File[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
Arrays.sort(mFileList, new SortName());
|
|
||||||
|
|
||||||
if (mFileList == null) {
|
if (mFileList == null) {
|
||||||
mFileNameList = new String[0];
|
mFileNameList = new String[0];
|
||||||
mFileList = new File[0];
|
mFileList = new File[0];
|
||||||
} else {
|
} else {
|
||||||
|
Arrays.sort(mFileList, new SortName());
|
||||||
mFileNameList = new String[mFileList.length];
|
mFileNameList = new String[mFileList.length];
|
||||||
}
|
}
|
||||||
for (int n = 0; n < mFileList.length; n++) {
|
for (int n = 0; n < mFileList.length; n++) {
|
||||||
|
@ -0,0 +1,75 @@
|
|||||||
|
package acr.browser.lightning.utils;
|
||||||
|
|
||||||
|
import android.app.Activity;
|
||||||
|
import android.content.pm.PackageManager;
|
||||||
|
import android.os.Build;
|
||||||
|
import android.support.annotation.NonNull;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Copyright 8/22/2015 Anthony Restaino
|
||||||
|
*/
|
||||||
|
public class PermissionsManager {
|
||||||
|
|
||||||
|
private static PermissionsManager mInstance;
|
||||||
|
private Set<String> mPendingRequests = new HashSet<>();
|
||||||
|
|
||||||
|
public static PermissionsManager getInstance() {
|
||||||
|
if (mInstance == null) {
|
||||||
|
mInstance = new PermissionsManager();
|
||||||
|
}
|
||||||
|
return mInstance;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void requestPermissionsIfNecessary(Activity activity, @NonNull String[] permissions) {
|
||||||
|
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M || activity == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
List<String> permList = new ArrayList<>();
|
||||||
|
for (String perm : permissions) {
|
||||||
|
if (activity.checkSelfPermission(perm) != PackageManager.PERMISSION_GRANTED
|
||||||
|
&& !mPendingRequests.contains(perm)) {
|
||||||
|
permList.add(perm);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!permList.isEmpty()) {
|
||||||
|
String[] permsToRequest = permList.toArray(new String[permList.size()]);
|
||||||
|
mPendingRequests.addAll(permList);
|
||||||
|
activity.requestPermissions(permsToRequest, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean checkPermission(Activity activity, @NonNull String permission) {
|
||||||
|
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
|
||||||
|
return true;
|
||||||
|
} else if (activity == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return activity.checkSelfPermission(permission) == PackageManager.PERMISSION_GRANTED;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean checkPermissions(Activity activity, @NonNull String[] permissions) {
|
||||||
|
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
|
||||||
|
return true;
|
||||||
|
} else if (activity == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
boolean permissionsNecessary = true;
|
||||||
|
for (String perm : permissions) {
|
||||||
|
permissionsNecessary &= activity.checkSelfPermission(perm) == PackageManager.PERMISSION_GRANTED;
|
||||||
|
}
|
||||||
|
return permissionsNecessary;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void notifyPermissionsChange(String[] permissions) {
|
||||||
|
for (String perm : permissions) {
|
||||||
|
mPendingRequests.remove(perm);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -4,6 +4,7 @@
|
|||||||
|
|
||||||
package acr.browser.lightning.view;
|
package acr.browser.lightning.view;
|
||||||
|
|
||||||
|
import android.Manifest;
|
||||||
import android.annotation.SuppressLint;
|
import android.annotation.SuppressLint;
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
import android.content.ActivityNotFoundException;
|
import android.content.ActivityNotFoundException;
|
||||||
@ -62,6 +63,7 @@ import acr.browser.lightning.download.LightningDownloadListener;
|
|||||||
import acr.browser.lightning.preference.PreferenceManager;
|
import acr.browser.lightning.preference.PreferenceManager;
|
||||||
import acr.browser.lightning.utils.AdBlock;
|
import acr.browser.lightning.utils.AdBlock;
|
||||||
import acr.browser.lightning.utils.IntentUtils;
|
import acr.browser.lightning.utils.IntentUtils;
|
||||||
|
import acr.browser.lightning.utils.PermissionsManager;
|
||||||
import acr.browser.lightning.utils.ThemeUtils;
|
import acr.browser.lightning.utils.ThemeUtils;
|
||||||
import acr.browser.lightning.utils.Utils;
|
import acr.browser.lightning.utils.Utils;
|
||||||
|
|
||||||
@ -93,6 +95,8 @@ public class LightningView {
|
|||||||
0, 0, -1.0f, 0, 255, // blue
|
0, 0, -1.0f, 0, 255, // blue
|
||||||
0, 0, 0, 1.0f, 0 // alpha
|
0, 0, 0, 1.0f, 0 // alpha
|
||||||
};
|
};
|
||||||
|
private PermissionsManager mPermissionsManager;
|
||||||
|
private static final String[] PERMISSIONS = new String[]{Manifest.permission.ACCESS_FINE_LOCATION};
|
||||||
|
|
||||||
public LightningView(Activity activity, String url, boolean darkTheme, boolean isIncognito) {
|
public LightningView(Activity activity, String url, boolean darkTheme, boolean isIncognito) {
|
||||||
|
|
||||||
@ -101,6 +105,7 @@ public class LightningView {
|
|||||||
mIsIncognitoTab = isIncognito;
|
mIsIncognitoTab = isIncognito;
|
||||||
mTitle = new Title(activity, darkTheme);
|
mTitle = new Title(activity, darkTheme);
|
||||||
mAdBlock = AdBlock.getInstance(activity.getApplicationContext());
|
mAdBlock = AdBlock.getInstance(activity.getApplicationContext());
|
||||||
|
mPermissionsManager = PermissionsManager.getInstance();
|
||||||
|
|
||||||
mWebpageBitmap = mTitle.mDefaultIcon;
|
mWebpageBitmap = mTitle.mDefaultIcon;
|
||||||
|
|
||||||
@ -288,10 +293,13 @@ public class LightningView {
|
|||||||
|
|
||||||
if (!mIsIncognitoTab) {
|
if (!mIsIncognitoTab) {
|
||||||
settings.setGeolocationEnabled(mPreferences.getLocationEnabled());
|
settings.setGeolocationEnabled(mPreferences.getLocationEnabled());
|
||||||
|
if (mPreferences.getLocationEnabled() && !PermissionsManager.checkPermissions(mActivity, PERMISSIONS)) {
|
||||||
|
mPermissionsManager.requestPermissionsIfNecessary(mActivity, PERMISSIONS);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
settings.setGeolocationEnabled(false);
|
settings.setGeolocationEnabled(false);
|
||||||
}
|
}
|
||||||
if (API < 19) {
|
if (API < Build.VERSION_CODES.KITKAT) {
|
||||||
switch (mPreferences.getFlashSupport()) {
|
switch (mPreferences.getFlashSupport()) {
|
||||||
case 0:
|
case 0:
|
||||||
settings.setPluginState(PluginState.OFF);
|
settings.setPluginState(PluginState.OFF);
|
||||||
@ -709,10 +717,10 @@ public class LightningView {
|
|||||||
|
|
||||||
public class LightningWebClient extends WebViewClient {
|
public class LightningWebClient extends WebViewClient {
|
||||||
|
|
||||||
final Context mActivity;
|
final Activity mActivity;
|
||||||
|
|
||||||
LightningWebClient(Context context) {
|
LightningWebClient(Activity activity) {
|
||||||
mActivity = context;
|
mActivity = activity;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -932,10 +940,10 @@ public class LightningView {
|
|||||||
|
|
||||||
public class LightningChromeClient extends WebChromeClient {
|
public class LightningChromeClient extends WebChromeClient {
|
||||||
|
|
||||||
final Context mActivity;
|
final Activity mActivity;
|
||||||
|
|
||||||
LightningChromeClient(Context context) {
|
LightningChromeClient(Activity activity) {
|
||||||
mActivity = context;
|
mActivity = activity;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -969,6 +977,7 @@ public class LightningView {
|
|||||||
@Override
|
@Override
|
||||||
public void onGeolocationPermissionsShowPrompt(final String origin,
|
public void onGeolocationPermissionsShowPrompt(final String origin,
|
||||||
final GeolocationPermissions.Callback callback) {
|
final GeolocationPermissions.Callback callback) {
|
||||||
|
mPermissionsManager.requestPermissionsIfNecessary(mActivity, PERMISSIONS);
|
||||||
final boolean remember = true;
|
final boolean remember = true;
|
||||||
AlertDialog.Builder builder = new AlertDialog.Builder(mActivity);
|
AlertDialog.Builder builder = new AlertDialog.Builder(mActivity);
|
||||||
builder.setTitle(mActivity.getString(R.string.location));
|
builder.setTitle(mActivity.getString(R.string.location));
|
||||||
|
Loading…
Reference in New Issue
Block a user