Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
P
permission_handler
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
songyanzhi
permission_handler
Commits
4432f406
Commit
4432f406
authored
Jan 12, 2020
by
Kostya Manoilo
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Added neverAskAgain permission status for android devices
parent
3e7ee829
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
98 additions
and
16 deletions
+98
-16
android/src/main/java/com/baseflow/permissionhandler/PermissionHandlerPlugin.java
+61
-16
android/src/main/java/com/baseflow/permissionhandler/PermissionUtils.java
+32
-0
lib/src/permission_enums.dart
+5
-0
No files found.
android/src/main/java/com/baseflow/permissionhandler/PermissionHandlerPlugin.java
View file @
4432f406
...
@@ -19,6 +19,7 @@ import android.telephony.TelephonyManager;
...
@@ -19,6 +19,7 @@ import android.telephony.TelephonyManager;
import
android.text.TextUtils
;
import
android.text.TextUtils
;
import
android.util.Log
;
import
android.util.Log
;
import
androidx.annotation.RequiresApi
;
import
androidx.core.app.NotificationManagerCompat
;
import
androidx.core.app.NotificationManagerCompat
;
import
io.flutter.plugin.common.PluginRegistry.ActivityResultListener
;
import
io.flutter.plugin.common.PluginRegistry.ActivityResultListener
;
import
java.lang.annotation.Retention
;
import
java.lang.annotation.Retention
;
...
@@ -100,7 +101,7 @@ public class PermissionHandlerPlugin implements MethodCallHandler {
...
@@ -100,7 +101,7 @@ public class PermissionHandlerPlugin implements MethodCallHandler {
private
static
final
int
PERMISSION_STATUS_GRANTED
=
2
;
private
static
final
int
PERMISSION_STATUS_GRANTED
=
2
;
private
static
final
int
PERMISSION_STATUS_RESTRICTED
=
3
;
private
static
final
int
PERMISSION_STATUS_RESTRICTED
=
3
;
private
static
final
int
PERMISSION_STATUS_UNKNOWN
=
4
;
private
static
final
int
PERMISSION_STATUS_UNKNOWN
=
4
;
private
static
final
int
PERMISSION_STATUS_NEWER_ASK_AGAIN
=
5
;
@Retention
(
RetentionPolicy
.
SOURCE
)
@Retention
(
RetentionPolicy
.
SOURCE
)
@IntDef
({
@IntDef
({
PERMISSION_STATUS_DENIED
,
PERMISSION_STATUS_DENIED
,
...
@@ -108,6 +109,7 @@ public class PermissionHandlerPlugin implements MethodCallHandler {
...
@@ -108,6 +109,7 @@ public class PermissionHandlerPlugin implements MethodCallHandler {
PERMISSION_STATUS_GRANTED
,
PERMISSION_STATUS_GRANTED
,
PERMISSION_STATUS_RESTRICTED
,
PERMISSION_STATUS_RESTRICTED
,
PERMISSION_STATUS_UNKNOWN
,
PERMISSION_STATUS_UNKNOWN
,
PERMISSION_STATUS_NEWER_ASK_AGAIN
,
})
})
private
@interface
PermissionStatus
{
private
@interface
PermissionStatus
{
}
}
...
@@ -204,12 +206,6 @@ public class PermissionHandlerPlugin implements MethodCallHandler {
...
@@ -204,12 +206,6 @@ public class PermissionHandlerPlugin implements MethodCallHandler {
}
}
}
}
private
final
Registrar
mRegistrar
;
private
Result
mResult
;
private
ArrayList
<
String
>
mRequestedPermissions
;
@SuppressLint
(
"UseSparseArrays"
)
private
Map
<
Integer
,
Integer
>
mRequestResults
=
new
HashMap
<>();
@Override
@Override
public
void
onMethodCall
(
MethodCall
call
,
Result
result
)
{
public
void
onMethodCall
(
MethodCall
call
,
Result
result
)
{
switch
(
call
.
method
)
{
switch
(
call
.
method
)
{
...
@@ -302,7 +298,9 @@ public class PermissionHandlerPlugin implements MethodCallHandler {
...
@@ -302,7 +298,9 @@ public class PermissionHandlerPlugin implements MethodCallHandler {
}
}
final
int
permissionStatus
=
ContextCompat
.
checkSelfPermission
(
context
,
name
);
final
int
permissionStatus
=
ContextCompat
.
checkSelfPermission
(
context
,
name
);
if
(
permissionStatus
==
PackageManager
.
PERMISSION_DENIED
)
{
if
(
permissionStatus
==
PackageManager
.
PERMISSION_DENIED
)
{
return
PERMISSION_STATUS_DENIED
;
if
(
VERSION
.
SDK_INT
>=
VERSION_CODES
.
M
&&
isNeverAskAgainSelected
(
permission
))
{
return
PERMISSION_STATUS_NEWER_ASK_AGAIN
;
}
else
return
PERMISSION_STATUS_DENIED
;
}
else
if
(
permissionStatus
!=
PackageManager
.
PERMISSION_GRANTED
)
{
}
else
if
(
permissionStatus
!=
PackageManager
.
PERMISSION_GRANTED
)
{
return
PERMISSION_STATUS_UNKNOWN
;
return
PERMISSION_STATUS_UNKNOWN
;
}
}
...
@@ -456,21 +454,24 @@ public class PermissionHandlerPlugin implements MethodCallHandler {
...
@@ -456,21 +454,24 @@ public class PermissionHandlerPlugin implements MethodCallHandler {
if
(
permission
==
PERMISSION_GROUP_UNKNOWN
)
if
(
permission
==
PERMISSION_GROUP_UNKNOWN
)
continue
;
continue
;
final
int
result
=
grantResults
[
i
];
updatePermissionShouldShowStatus
(
permission
);
if
(
permission
==
PERMISSION_GROUP_MICROPHONE
)
{
if
(
permission
==
PERMISSION_GROUP_MICROPHONE
)
{
if
(!
mRequestResults
.
containsKey
(
PERMISSION_GROUP_MICROPHONE
))
{
if
(!
mRequestResults
.
containsKey
(
PERMISSION_GROUP_MICROPHONE
))
{
mRequestResults
.
put
(
PERMISSION_GROUP_MICROPHONE
,
toPermissionStatus
(
grantResults
[
i
]
));
mRequestResults
.
put
(
PERMISSION_GROUP_MICROPHONE
,
toPermissionStatus
(
permission
,
result
));
}
}
if
(!
mRequestResults
.
containsKey
(
PERMISSION_GROUP_SPEECH
))
{
if
(!
mRequestResults
.
containsKey
(
PERMISSION_GROUP_SPEECH
))
{
mRequestResults
.
put
(
PERMISSION_GROUP_SPEECH
,
toPermissionStatus
(
grantResults
[
i
]
));
mRequestResults
.
put
(
PERMISSION_GROUP_SPEECH
,
toPermissionStatus
(
permission
,
result
));
}
}
}
else
if
(
permission
==
PERMISSION_GROUP_LOCATION_ALWAYS
)
{
}
else
if
(
permission
==
PERMISSION_GROUP_LOCATION_ALWAYS
)
{
@PermissionStatus
int
permissionStatus
=
determineActualLocationStatus
(
grantResults
[
i
]
);
@PermissionStatus
int
permissionStatus
=
determineActualLocationStatus
(
permission
,
result
);
if
(!
mRequestResults
.
containsKey
(
PERMISSION_GROUP_LOCATION_ALWAYS
))
{
if
(!
mRequestResults
.
containsKey
(
PERMISSION_GROUP_LOCATION_ALWAYS
))
{
mRequestResults
.
put
(
PERMISSION_GROUP_LOCATION_ALWAYS
,
permissionStatus
);
mRequestResults
.
put
(
PERMISSION_GROUP_LOCATION_ALWAYS
,
permissionStatus
);
}
}
}
else
if
(
permission
==
PERMISSION_GROUP_LOCATION
)
{
}
else
if
(
permission
==
PERMISSION_GROUP_LOCATION
)
{
@PermissionStatus
int
permissionStatus
=
determineActualLocationStatus
(
grantResults
[
i
]
);
@PermissionStatus
int
permissionStatus
=
determineActualLocationStatus
(
permission
,
result
);
if
(
VERSION
.
SDK_INT
<
VERSION_CODES
.
Q
)
{
if
(
VERSION
.
SDK_INT
<
VERSION_CODES
.
Q
)
{
if
(!
mRequestResults
.
containsKey
(
PERMISSION_GROUP_LOCATION_ALWAYS
))
{
if
(!
mRequestResults
.
containsKey
(
PERMISSION_GROUP_LOCATION_ALWAYS
))
{
...
@@ -484,7 +485,7 @@ public class PermissionHandlerPlugin implements MethodCallHandler {
...
@@ -484,7 +485,7 @@ public class PermissionHandlerPlugin implements MethodCallHandler {
mRequestResults
.
put
(
permission
,
permissionStatus
);
mRequestResults
.
put
(
permission
,
permissionStatus
);
}
else
if
(!
mRequestResults
.
containsKey
(
permission
))
{
}
else
if
(!
mRequestResults
.
containsKey
(
permission
))
{
mRequestResults
.
put
(
permission
,
toPermissionStatus
(
grantResults
[
i
]
));
mRequestResults
.
put
(
permission
,
toPermissionStatus
(
permission
,
result
));
}
}
}
}
...
@@ -497,11 +498,11 @@ public class PermissionHandlerPlugin implements MethodCallHandler {
...
@@ -497,11 +498,11 @@ public class PermissionHandlerPlugin implements MethodCallHandler {
* @param grantResult Grant Result as received from the Android system.
* @param grantResult Grant Result as received from the Android system.
*/
*/
@PermissionStatus
@PermissionStatus
private
int
determineActualLocationStatus
(
int
grantResult
)
{
private
int
determineActualLocationStatus
(
@PermissionGroup
int
permission
,
int
grantResult
)
{
final
Context
context
=
final
Context
context
=
mRegistrar
.
activity
()
==
null
?
mRegistrar
.
activeContext
()
:
mRegistrar
.
activity
();
mRegistrar
.
activity
()
==
null
?
mRegistrar
.
activeContext
()
:
mRegistrar
.
activity
();
final
boolean
isLocationServiceEnabled
=
context
!=
null
&&
isLocationServiceEnabled
(
context
);
final
boolean
isLocationServiceEnabled
=
context
!=
null
&&
isLocationServiceEnabled
(
context
);
@PermissionStatus
int
permissionStatus
=
toPermissionStatus
(
grantResult
);
@PermissionStatus
int
permissionStatus
=
toPermissionStatus
(
permission
,
grantResult
);
if
(
permissionStatus
==
PERMISSION_STATUS_GRANTED
&&
!
isLocationServiceEnabled
)
{
if
(
permissionStatus
==
PERMISSION_STATUS_GRANTED
&&
!
isLocationServiceEnabled
)
{
permissionStatus
=
PERMISSION_STATUS_DISABLED
;
permissionStatus
=
PERMISSION_STATUS_DISABLED
;
}
}
...
@@ -521,7 +522,11 @@ public class PermissionHandlerPlugin implements MethodCallHandler {
...
@@ -521,7 +522,11 @@ public class PermissionHandlerPlugin implements MethodCallHandler {
}
}
@PermissionStatus
@PermissionStatus
private
int
toPermissionStatus
(
int
grantResult
)
{
private
int
toPermissionStatus
(
@PermissionGroup
int
permission
,
int
grantResult
)
{
if
(
VERSION
.
SDK_INT
>=
VERSION_CODES
.
M
&&
isNeverAskAgainSelected
(
permission
))
{
return
PERMISSION_STATUS_NEWER_ASK_AGAIN
;
}
return
grantResult
==
PackageManager
.
PERMISSION_GRANTED
?
PERMISSION_STATUS_GRANTED
:
PERMISSION_STATUS_DENIED
;
return
grantResult
==
PackageManager
.
PERMISSION_GRANTED
?
PERMISSION_STATUS_GRANTED
:
PERMISSION_STATUS_DENIED
;
}
}
...
@@ -722,6 +727,46 @@ public class PermissionHandlerPlugin implements MethodCallHandler {
...
@@ -722,6 +727,46 @@ public class PermissionHandlerPlugin implements MethodCallHandler {
return
false
;
return
false
;
}
}
private
void
updatePermissionShouldShowStatus
(
@PermissionGroup
int
permission
)
{
List
<
String
>
names
=
getManifestNames
(
permission
);
if
(
names
==
null
||
names
.
isEmpty
())
{
return
;
}
final
Context
context
=
mRegistrar
.
activity
()
==
null
?
mRegistrar
.
activeContext
()
:
mRegistrar
.
activity
();
if
(
context
==
null
)
{
return
;
}
for
(
String
name
:
names
)
{
PermissionUtils
.
setShouldShowStatus
(
context
,
name
);
}
}
@RequiresApi
(
api
=
Build
.
VERSION_CODES
.
M
)
private
boolean
isNeverAskAgainSelected
(
@PermissionGroup
int
permission
)
{
List
<
String
>
names
=
getManifestNames
(
permission
);
if
(
names
==
null
||
names
.
isEmpty
())
{
return
false
;
}
final
Activity
activity
=
mRegistrar
.
activity
();
if
(
activity
==
null
)
{
return
false
;
}
boolean
isNeverAskAgainSelected
=
false
;
for
(
String
name
:
names
)
{
isNeverAskAgainSelected
|=
PermissionUtils
.
neverAskAgainSelected
(
activity
,
name
);
}
return
isNeverAskAgainSelected
;
}
@SuppressWarnings
(
"deprecation"
)
@SuppressWarnings
(
"deprecation"
)
private
boolean
isLocationServiceEnabled
(
Context
context
)
{
private
boolean
isLocationServiceEnabled
(
Context
context
)
{
if
(
Build
.
VERSION
.
SDK_INT
>=
Build
.
VERSION_CODES
.
P
)
{
if
(
Build
.
VERSION
.
SDK_INT
>=
Build
.
VERSION_CODES
.
P
)
{
...
...
android/src/main/java/com/baseflow/permissionhandler/PermissionUtils.java
0 → 100644
View file @
4432f406
package
com
.
baseflow
.
permissionhandler
;
import
android.app.Activity
;
import
android.content.Context
;
import
android.content.SharedPreferences
;
import
android.os.Build
;
import
androidx.annotation.RequiresApi
;
import
androidx.core.app.ActivityCompat
;
public
class
PermissionUtils
{
@RequiresApi
(
api
=
Build
.
VERSION_CODES
.
M
)
static
boolean
neverAskAgainSelected
(
final
Activity
activity
,
final
String
permission
)
{
final
boolean
prevShouldShowStatus
=
getRationaleDisplayStatus
(
activity
,
permission
);
final
boolean
currShouldShowStatus
=
ActivityCompat
.
shouldShowRequestPermissionRationale
(
activity
,
permission
);
return
prevShouldShowStatus
!=
currShouldShowStatus
;
}
static
void
setShouldShowStatus
(
final
Context
context
,
final
String
permission
)
{
SharedPreferences
genPrefs
=
context
.
getSharedPreferences
(
"GENERIC_PREFERENCES"
,
Context
.
MODE_PRIVATE
);
SharedPreferences
.
Editor
editor
=
genPrefs
.
edit
();
editor
.
putBoolean
(
permission
,
true
);
editor
.
apply
();
}
private
static
boolean
getRationaleDisplayStatus
(
final
Context
context
,
final
String
permission
)
{
SharedPreferences
genPrefs
=
context
.
getSharedPreferences
(
"GENERIC_PREFERENCES"
,
Context
.
MODE_PRIVATE
);
return
genPrefs
.
getBoolean
(
permission
,
false
);
}
}
\ No newline at end of file
lib/src/permission_enums.dart
View file @
4432f406
...
@@ -21,12 +21,16 @@ class PermissionStatus {
...
@@ -21,12 +21,16 @@ class PermissionStatus {
/// Permission is in an unknown state
/// Permission is in an unknown state
static
const
PermissionStatus
unknown
=
PermissionStatus
.
_
(
4
);
static
const
PermissionStatus
unknown
=
PermissionStatus
.
_
(
4
);
/// Permission to access the requested feature is denied by the user and never show selected (only on Android).
static
const
PermissionStatus
neverAskAgain
=
PermissionStatus
.
_
(
5
);
static
const
List
<
PermissionStatus
>
values
=
<
PermissionStatus
>[
static
const
List
<
PermissionStatus
>
values
=
<
PermissionStatus
>[
denied
,
denied
,
disabled
,
disabled
,
granted
,
granted
,
restricted
,
restricted
,
unknown
,
unknown
,
neverAskAgain
,
];
];
static
const
List
<
String
>
_names
=
<
String
>[
static
const
List
<
String
>
_names
=
<
String
>[
...
@@ -35,6 +39,7 @@ class PermissionStatus {
...
@@ -35,6 +39,7 @@ class PermissionStatus {
'granted'
,
'granted'
,
'restricted'
,
'restricted'
,
'unknown'
,
'unknown'
,
'neverAskAgain'
,
];
];
@override
@override
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment