mirror of
https://gitlab.com/xynngh/YetAnotherCallBlocker.git
synced 2025-02-17 04:10:36 +01:00
Improve permissions handling
Don't ask permissions for disabled functions. Show detailed message.
This commit is contained in:
parent
ace3f05ed7
commit
7ad9cecc73
@ -34,6 +34,8 @@ import dummydomain.yetanothercallblocker.work.UpdateScheduler;
|
|||||||
|
|
||||||
public class MainActivity extends AppCompatActivity {
|
public class MainActivity extends AppCompatActivity {
|
||||||
|
|
||||||
|
private final Settings settings = App.getSettings();
|
||||||
|
|
||||||
private CallLogItemRecyclerViewAdapter callLogAdapter;
|
private CallLogItemRecyclerViewAdapter callLogAdapter;
|
||||||
private List<CallLogItem> callLogItems = new ArrayList<>();
|
private List<CallLogItem> callLogItems = new ArrayList<>();
|
||||||
|
|
||||||
@ -49,17 +51,19 @@ public class MainActivity extends AppCompatActivity {
|
|||||||
RecyclerView recyclerView = findViewById(R.id.callLogList);
|
RecyclerView recyclerView = findViewById(R.id.callLogList);
|
||||||
recyclerView.setAdapter(callLogAdapter);
|
recyclerView.setAdapter(callLogAdapter);
|
||||||
|
|
||||||
Settings settings = App.getSettings();
|
|
||||||
|
|
||||||
SwitchCompat notificationsSwitch = findViewById(R.id.notificationsEnabledSwitch);
|
SwitchCompat notificationsSwitch = findViewById(R.id.notificationsEnabledSwitch);
|
||||||
notificationsSwitch.setChecked(settings.getIncomingCallNotifications());
|
notificationsSwitch.setChecked(settings.getIncomingCallNotifications());
|
||||||
notificationsSwitch.setOnCheckedChangeListener((buttonView, isChecked)
|
notificationsSwitch.setOnCheckedChangeListener((buttonView, isChecked) -> {
|
||||||
-> settings.setIncomingCallNotifications(isChecked));
|
settings.setIncomingCallNotifications(isChecked);
|
||||||
|
checkPermissions();
|
||||||
|
});
|
||||||
|
|
||||||
SwitchCompat blockCallsSwitch = findViewById(R.id.blockCallsSwitch);
|
SwitchCompat blockCallsSwitch = findViewById(R.id.blockCallsSwitch);
|
||||||
blockCallsSwitch.setChecked(settings.getBlockCalls());
|
blockCallsSwitch.setChecked(settings.getBlockCalls());
|
||||||
blockCallsSwitch.setOnCheckedChangeListener((buttonView, isChecked)
|
blockCallsSwitch.setOnCheckedChangeListener((buttonView, isChecked) -> {
|
||||||
-> settings.setBlockCalls(isChecked));
|
settings.setBlockCalls(isChecked);
|
||||||
|
checkPermissions();
|
||||||
|
});
|
||||||
|
|
||||||
UpdateScheduler updateScheduler = UpdateScheduler.get(this);
|
UpdateScheduler updateScheduler = UpdateScheduler.get(this);
|
||||||
SwitchCompat autoUpdateSwitch = findViewById(R.id.autoUpdateEnabledSwitch);
|
SwitchCompat autoUpdateSwitch = findViewById(R.id.autoUpdateEnabledSwitch);
|
||||||
@ -81,7 +85,8 @@ public class MainActivity extends AppCompatActivity {
|
|||||||
@NonNull int[] grantResults) {
|
@NonNull int[] grantResults) {
|
||||||
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
|
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
|
||||||
|
|
||||||
PermissionHelper.onRequestPermissionsResult(this, requestCode, permissions, grantResults);
|
PermissionHelper.onRequestPermissionsResult(this, requestCode, permissions, grantResults,
|
||||||
|
settings.getIncomingCallNotifications(), settings.getBlockCalls());
|
||||||
|
|
||||||
loadCallLog();
|
loadCallLog();
|
||||||
}
|
}
|
||||||
@ -94,7 +99,7 @@ public class MainActivity extends AppCompatActivity {
|
|||||||
|
|
||||||
startCheckMainDbTask();
|
startCheckMainDbTask();
|
||||||
|
|
||||||
PermissionHelper.checkPermissions(this);
|
checkPermissions();
|
||||||
|
|
||||||
loadCallLog();
|
loadCallLog();
|
||||||
}
|
}
|
||||||
@ -124,6 +129,11 @@ public class MainActivity extends AppCompatActivity {
|
|||||||
loadCallLog();
|
loadCallLog();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void checkPermissions() {
|
||||||
|
PermissionHelper.checkPermissions(this,
|
||||||
|
settings.getIncomingCallNotifications(), settings.getBlockCalls());
|
||||||
|
}
|
||||||
|
|
||||||
private void startCheckMainDbTask() {
|
private void startCheckMainDbTask() {
|
||||||
cancelCheckMainDbTask();
|
cancelCheckMainDbTask();
|
||||||
@SuppressLint("StaticFieldLeak")
|
@SuppressLint("StaticFieldLeak")
|
||||||
|
@ -11,28 +11,48 @@ import androidx.appcompat.app.AppCompatActivity;
|
|||||||
import androidx.core.app.ActivityCompat;
|
import androidx.core.app.ActivityCompat;
|
||||||
import androidx.core.content.ContextCompat;
|
import androidx.core.content.ContextCompat;
|
||||||
|
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.HashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
public class PermissionHelper {
|
public class PermissionHelper {
|
||||||
|
|
||||||
private static final int PERMISSION_REQUEST_CODE = 1;
|
private static final int PERMISSION_REQUEST_CODE = 1;
|
||||||
|
|
||||||
public static void checkPermissions(AppCompatActivity activity) {
|
private static final Logger LOG = LoggerFactory.getLogger(PermissionHelper.class);
|
||||||
List<String> requiredPermissions = new ArrayList<>();
|
|
||||||
requiredPermissions.add(Manifest.permission.READ_PHONE_STATE);
|
private static final Set<String> INFO_PERMISSIONS = new HashSet<>();
|
||||||
requiredPermissions.add(Manifest.permission.CALL_PHONE);
|
private static final Set<String> BLOCKING_PERMISSIONS = new HashSet<>();
|
||||||
|
|
||||||
|
static {
|
||||||
|
INFO_PERMISSIONS.add(Manifest.permission.READ_PHONE_STATE);
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
|
||||||
requiredPermissions.add(Manifest.permission.READ_CALL_LOG);
|
INFO_PERMISSIONS.add(Manifest.permission.READ_CALL_LOG);
|
||||||
}
|
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
|
|
||||||
requiredPermissions.add(Manifest.permission.ANSWER_PHONE_CALLS);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
List<String> missingPermissions = new ArrayList<>();
|
BLOCKING_PERMISSIONS.addAll(INFO_PERMISSIONS);
|
||||||
|
|
||||||
|
BLOCKING_PERMISSIONS.add(Manifest.permission.CALL_PHONE);
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
|
||||||
|
BLOCKING_PERMISSIONS.add(Manifest.permission.ANSWER_PHONE_CALLS);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void checkPermissions(AppCompatActivity activity, boolean info, boolean block) {
|
||||||
|
Collection<String> requiredPermissions = block ? BLOCKING_PERMISSIONS
|
||||||
|
: info ? INFO_PERMISSIONS : Collections.emptyList();
|
||||||
|
|
||||||
|
List<String> missingPermissions = new ArrayList<>(requiredPermissions.size());
|
||||||
|
|
||||||
for (String permission : requiredPermissions) {
|
for (String permission : requiredPermissions) {
|
||||||
if (ContextCompat.checkSelfPermission(activity, permission) != PackageManager.PERMISSION_GRANTED) {
|
if (ContextCompat.checkSelfPermission(activity, permission)
|
||||||
|
!= PackageManager.PERMISSION_GRANTED) {
|
||||||
missingPermissions.add(permission);
|
missingPermissions.add(permission);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -45,22 +65,50 @@ public class PermissionHelper {
|
|||||||
|
|
||||||
public static void onRequestPermissionsResult(@NonNull Context context, int requestCode,
|
public static void onRequestPermissionsResult(@NonNull Context context, int requestCode,
|
||||||
@NonNull String[] permissions,
|
@NonNull String[] permissions,
|
||||||
@NonNull int[] grantResults) {
|
@NonNull int[] grantResults,
|
||||||
boolean denied = false;
|
boolean infoExpected, boolean blockingExpected) {
|
||||||
|
if (requestCode != PERMISSION_REQUEST_CODE) return;
|
||||||
|
|
||||||
|
boolean infoDenied = false;
|
||||||
|
boolean blockingDenied = false;
|
||||||
|
|
||||||
if (permissions.length == 0) {
|
if (permissions.length == 0) {
|
||||||
denied = true;
|
infoDenied = true;
|
||||||
|
blockingDenied = true;
|
||||||
} else {
|
} else {
|
||||||
for (int grantResult : grantResults) {
|
for (int i = 0; i < permissions.length; i++) {
|
||||||
if (grantResult != PackageManager.PERMISSION_GRANTED) {
|
String permission = permissions[i];
|
||||||
denied = true;
|
if (grantResults[i] != PackageManager.PERMISSION_GRANTED) {
|
||||||
|
if (INFO_PERMISSIONS.contains(permission)) {
|
||||||
|
infoDenied = true;
|
||||||
|
blockingDenied = true;
|
||||||
break;
|
break;
|
||||||
|
} else if (BLOCKING_PERMISSIONS.contains(permission)) {
|
||||||
|
blockingDenied = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (denied) {
|
LOG.debug("onRequestPermissionsResult() infoDenied={}, blockingDenied={}",
|
||||||
Toast.makeText(context, R.string.denied_permissions_message, Toast.LENGTH_SHORT).show();
|
infoDenied, blockingDenied);
|
||||||
|
|
||||||
|
if (!blockingExpected) blockingDenied = false;
|
||||||
|
if (!infoExpected) infoDenied = false;
|
||||||
|
|
||||||
|
String message;
|
||||||
|
if (infoDenied && blockingDenied) {
|
||||||
|
message = context.getString(R.string.denied_permissions_message_blocking_and_info);
|
||||||
|
} else if (infoDenied) {
|
||||||
|
message = context.getString(R.string.denied_permissions_message_info);
|
||||||
|
} else if (blockingDenied) {
|
||||||
|
message = context.getString(R.string.denied_permissions_message_blocking);
|
||||||
|
} else {
|
||||||
|
message = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (message != null) {
|
||||||
|
Toast.makeText(context, message, Toast.LENGTH_LONG).show();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -50,7 +50,9 @@
|
|||||||
<string name="title_activity_reviews">Reviews</string>
|
<string name="title_activity_reviews">Reviews</string>
|
||||||
<string name="reviews_loading">Loading reviews…</string>
|
<string name="reviews_loading">Loading reviews…</string>
|
||||||
|
|
||||||
<string name="denied_permissions_message">Some functionality may not work due to denied permissions</string>
|
<string name="denied_permissions_message_blocking_and_info">Blocking and notification functionality may not work due to denied permissions</string>
|
||||||
|
<string name="denied_permissions_message_info">Notification functionality may not work due to denied permissions</string>
|
||||||
|
<string name="denied_permissions_message_blocking">Blocking functionality may not work due to denied permissions</string>
|
||||||
|
|
||||||
<string name="general_settings">General settings</string>
|
<string name="general_settings">General settings</string>
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user