SD-188 - navigate to phone settings if permission is denied

This commit is contained in:
Bogdan Ungureanu 2022-03-24 12:16:30 +02:00
parent 66625bcdd1
commit 81937a5e0f
7 changed files with 75 additions and 42 deletions

View File

@ -1,5 +1,6 @@
package com.safemobile.enums;
public enum ProviderSettingsStatus {
ACTION_APPLICATION_DETAILS_SETTINGS
APPLICATION_DETAILS,
SETTINGS
}

View File

@ -3,18 +3,26 @@ package com.safemobile.helpers;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.provider.Settings;
import com.safemobile.enums.ProviderSettingsStatus;
public class ProviderSettingsHelper {
private static final String PACKAGE = "package";
public static final String PACKAGE = "package";
public static final String ACTION_APPLICATION_DETAILS_SETTINGS = Settings.ACTION_APPLICATION_DETAILS_SETTINGS;
public static final String ACTION_SETTINGS = Settings.ACTION_SETTINGS;
public static String getAction(ProviderSettingsStatus providerSettingsStatus){
switch (providerSettingsStatus){
case ACTION_APPLICATION_DETAILS_SETTINGS:
return "android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS";
private ProviderSettingsHelper() {
}
public static String getAction(ProviderSettingsStatus providerSettingsStatus) {
switch (providerSettingsStatus) {
case APPLICATION_DETAILS:
return ACTION_APPLICATION_DETAILS_SETTINGS;
case SETTINGS:
default:
return "android.provider.Settings";
return ACTION_SETTINGS;
}
}

View File

@ -6,7 +6,7 @@ import com.google.android.gms.tasks.Task;
public interface IDialogService {
Task<Boolean> showDialog(Activity activity, String title, String message, String cancel, String ok);
Task<Boolean> showPermissionRequestDialog(Activity activity, String title, String message, String cancel);
Task<Boolean> showPermissionRequestDialog(Activity activity, String message, String cancel);
void showError(Activity activity, String message);
}

View File

@ -27,7 +27,7 @@ public class AppParams {
/* SafeMobile Dispatch */
public static ArrayList<User> allUsers = new ArrayList<User>();
public static Theme theme = Theme.SAFENET; // the Theme type
public static Theme theme = Theme.SAFEDISPATCH; // the Theme type
/* ***************************************** */

View File

@ -14,6 +14,7 @@ import java.util.Timer;
import java.util.TimerTask;
import com.google.android.gms.tasks.Task;
import com.google.android.gms.tasks.TaskCompletionSource;
import com.safemobile.activities.AbstractEmptyActivity;
import com.safemobile.activities.AbstractLiveActivity;
import com.safemobile.activities.AbstractMessagesActivity;
@ -21,6 +22,8 @@ import com.safemobile.activities.AbstractRadioActivity;
import com.safemobile.activities.AbstractSDParentActivity;
import com.safemobile.enums.AuthorizationCode;
import com.safemobile.enums.AuthorizationStatus;
import com.safemobile.enums.ProviderSettingsStatus;
import com.safemobile.helpers.ProviderSettingsHelper;
import com.safemobile.interfaces.IPermissionModule;
import com.safemobile.interfaces.ITCPListener;
import com.safemobile.interfaces.TCPEvent;
@ -880,7 +883,7 @@ public class TabLayoutActivity extends AbstractSDParentActivity {
tabHost.setCurrentTabByTag(TEXT);
AppParams.crtTab = AppParams.Tabs.message;
Vehicle vehicle = getVehicle4Imei(getImei());
if(vehicle != null)
if (vehicle != null)
getMessageActivity().setScId(vehicle.sc_id);
getMessageActivity().LASTMESSAGES = false;
getMessageActivity().getLastSMS();
@ -1057,7 +1060,7 @@ public class TabLayoutActivity extends AbstractSDParentActivity {
SM.Debug("########### UPDATE");
int scId = demoPosition % 3 == 0 ? 101 : 102;
SuperVehicle superVehicle = (getSuperVehHash().get((long) scId));
if(superVehicle != null)
if (superVehicle != null)
superVehicle.SetNewPosition(crtPos.lat, crtPos.lng, Calendar.getInstance().getTime().getTime(), crtPos.speed);
getLiveActivity().refreshMap();
}
@ -1334,7 +1337,7 @@ public class TabLayoutActivity extends AbstractSDParentActivity {
myHandler.post(updateResults);
} else
myHandler.post(() ->
createNotification(AppParams.messageNotif));
createNotification(AppParams.messageNotif));
//list for SMS
if (AppParams.crtTab == AppParams.Tabs.message && getMessageActivity() != null) {
@ -1782,7 +1785,8 @@ public class TabLayoutActivity extends AbstractSDParentActivity {
Vehicle vehicle = getVehicle4Imei(getImei());
if (vehicle != null)
textViewNMFrom.setText(String.format("%s: %s", getString(R.string.from), vehicle.name));
else textViewNMFrom.setText(String.format("%s: %s", getString(R.string.from), getImei()));
else
textViewNMFrom.setText(String.format("%s: %s", getString(R.string.from), getImei()));
textViewNMMessage.setText(String.format("TYPE: %s", getMess()));
// show layout
layoutNewMessage.setVisibility(View.VISIBLE);
@ -2233,13 +2237,14 @@ public class TabLayoutActivity extends AbstractSDParentActivity {
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
SM.Debug("onRequestPermissionsResult", "[requestCode] " + requestCode );
SM.Debug("onRequestPermissionsResult", "[requestCode] " + requestCode);
String permission = "";
switch (requestCode) {
case PermissionModule.RECORD_AUDIO_PERMISSION_REQUEST_CODE:
permission = Manifest.permission.RECORD_AUDIO;
break;
default: throw new IllegalStateException("Unexpected value: " + requestCode);
default:
throw new IllegalStateException("Unexpected value: " + requestCode);
}
AuthorizationStatus result;
@ -2252,13 +2257,13 @@ public class TabLayoutActivity extends AbstractSDParentActivity {
if (permissions.length == 0)
return;
if (permissions[0].equals(Manifest.permission.RECORD_AUDIO)){
if (permissions[0].equals(Manifest.permission.RECORD_AUDIO)) {
onAudioPermissionChanged(result);
}
}
private void onAudioPermissionChanged(AuthorizationStatus result) {
if (result == AuthorizationStatus.AUTHORIZE){
if (result == AuthorizationStatus.AUTHORIZE) {
// select button
buttonRadio.setSelected(true);
// deselect other buttons
@ -2276,23 +2281,38 @@ public class TabLayoutActivity extends AbstractSDParentActivity {
getRadioActivity().allVehicle = getAllVehicle();
getRadioActivity().UpdateVehicle();
}
}
else {
} else {
DialogService dialogService = new DialogService();
Task<Boolean> responseTask = dialogService.showPermissionRequestDialog(this, "title", "permissions denied", getString(R.string.cancel));
Task<Boolean> responseTask = dialogService.showPermissionRequestDialog(this,
getString(R.string.permissionBlocked, getString(R.string.microphone), getString(R.string.radio_tab), getString(R.string.microphone)),
getString(R.string.cancel));
responseTask.addOnCompleteListener(task -> waitForUserInput(task.getResult()));
}
}
private void waitForUserInput(Boolean result) {
if (result)
{
//navigate to phone's settings
//ToDo: make the navigation .. see ProviderSettingsHelper
}
else
{
if (result) {
final int requestCode = 1202;
//navigate to application's settings
String action = ProviderSettingsHelper.getAction(ProviderSettingsStatus.APPLICATION_DETAILS);
if (action == null || action == "")
return;
boolean isActionApplicationDetailsSettings = action.equals(ProviderSettingsHelper.ACTION_APPLICATION_DETAILS_SETTINGS);
if (!ProviderSettingsHelper.canHandleAction(context, action))
action = ProviderSettingsHelper.getAction(ProviderSettingsStatus.SETTINGS);
Intent intent = new Intent(action);
if (isActionApplicationDetailsSettings) {
Uri uri = Uri.fromParts(ProviderSettingsHelper.PACKAGE, this.getPackageName(), null);
intent.setData(uri);
}
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
this.startActivity(intent);
}
}
}

View File

@ -2,15 +2,12 @@ package com.safemobile.lib;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import com.google.android.gms.tasks.Task;
import com.google.android.gms.tasks.TaskCompletionSource;
import com.safemobile.dispatch.R;
import com.safemobile.interfaces.IDialogService;
import java.util.concurrent.atomic.AtomicBoolean;
public class DialogService implements IDialogService {
@Override
public Task<Boolean> showDialog(Activity activity, String title, String message, String cancel, String ok) {
@ -20,7 +17,7 @@ public class DialogService implements IDialogService {
.setMessage(message)
.setCancelable(false)
.setNegativeButton(cancel, (dialog, which) -> {
taskCompletionSource.trySetResult(false);
taskCompletionSource.trySetResult(false);
dialog.dismiss();
})
.setPositiveButton(ok, (dialog, which) -> taskCompletionSource.trySetResult(true));
@ -32,19 +29,22 @@ public class DialogService implements IDialogService {
}
@Override
public Task<Boolean> showPermissionRequestDialog(Activity activity, String title, String message, String cancel) {
return showDialog(activity,title,message,cancel, activity.getString(R.string.go_to_settings));
public Task<Boolean> showPermissionRequestDialog(Activity activity, String message, String cancel) {
return showDialog(
activity,
activity.getString(R.string.permission_denied),
message,
cancel,
activity.getString(R.string.go_to_settings));
}
@Override
public void showError(Activity activity, String message) {
AlertDialog.Builder builder = new AlertDialog.Builder(activity)
.setTitle(R.string.DialoService_Info_ErrorMessage)
.setMessage(message)
.setCancelable(false)
.setNeutralButton(R.string.ok, (dialog, which) -> dialog.dismiss());
AlertDialog dialog = builder.create();
dialog.show();
showDialog(
activity,
activity.getString(R.string.DialogService_Info_ErrorMessage),
message,
null,
activity.getString(R.string.ok));
}
}

View File

@ -257,7 +257,11 @@
<string name="speedMph">%1$d mph</string>
<string name="DialoService_Info_ErrorMessage">Oops, something happened</string>
<string name="DialogService_Info_ErrorMessage">Oops, something happened</string>
<string name="go_to_settings">Go to settings</string>
<string name="permission_denied">Permission Denied</string>
<string name="permissionBlocked">%1$s permission was not accepted. To be able to use the %2$s, please open application settings and grant the %3$s permission</string>
<string name="microphone">Microphone</string>
<string name="radio_tab">Radio Tab</string>
</resources>