SD-188 - navigate to phone settings if permission is denied
This commit is contained in:
parent
66625bcdd1
commit
81937a5e0f
@ -1,5 +1,6 @@
|
|||||||
package com.safemobile.enums;
|
package com.safemobile.enums;
|
||||||
|
|
||||||
public enum ProviderSettingsStatus {
|
public enum ProviderSettingsStatus {
|
||||||
ACTION_APPLICATION_DETAILS_SETTINGS
|
APPLICATION_DETAILS,
|
||||||
|
SETTINGS
|
||||||
}
|
}
|
||||||
|
@ -3,18 +3,26 @@ package com.safemobile.helpers;
|
|||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
|
import android.provider.Settings;
|
||||||
|
|
||||||
import com.safemobile.enums.ProviderSettingsStatus;
|
import com.safemobile.enums.ProviderSettingsStatus;
|
||||||
|
|
||||||
public class ProviderSettingsHelper {
|
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){
|
private ProviderSettingsHelper() {
|
||||||
switch (providerSettingsStatus){
|
|
||||||
case ACTION_APPLICATION_DETAILS_SETTINGS:
|
}
|
||||||
return "android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS";
|
|
||||||
|
public static String getAction(ProviderSettingsStatus providerSettingsStatus) {
|
||||||
|
switch (providerSettingsStatus) {
|
||||||
|
case APPLICATION_DETAILS:
|
||||||
|
return ACTION_APPLICATION_DETAILS_SETTINGS;
|
||||||
|
case SETTINGS:
|
||||||
default:
|
default:
|
||||||
return "android.provider.Settings";
|
return ACTION_SETTINGS;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -6,7 +6,7 @@ import com.google.android.gms.tasks.Task;
|
|||||||
|
|
||||||
public interface IDialogService {
|
public interface IDialogService {
|
||||||
Task<Boolean> showDialog(Activity activity, String title, String message, String cancel, String ok);
|
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);
|
void showError(Activity activity, String message);
|
||||||
}
|
}
|
||||||
|
@ -27,7 +27,7 @@ public class AppParams {
|
|||||||
|
|
||||||
/* SafeMobile Dispatch */
|
/* SafeMobile Dispatch */
|
||||||
public static ArrayList<User> allUsers = new ArrayList<User>();
|
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
|
||||||
|
|
||||||
|
|
||||||
/* ***************************************** */
|
/* ***************************************** */
|
||||||
|
@ -14,6 +14,7 @@ import java.util.Timer;
|
|||||||
import java.util.TimerTask;
|
import java.util.TimerTask;
|
||||||
|
|
||||||
import com.google.android.gms.tasks.Task;
|
import com.google.android.gms.tasks.Task;
|
||||||
|
import com.google.android.gms.tasks.TaskCompletionSource;
|
||||||
import com.safemobile.activities.AbstractEmptyActivity;
|
import com.safemobile.activities.AbstractEmptyActivity;
|
||||||
import com.safemobile.activities.AbstractLiveActivity;
|
import com.safemobile.activities.AbstractLiveActivity;
|
||||||
import com.safemobile.activities.AbstractMessagesActivity;
|
import com.safemobile.activities.AbstractMessagesActivity;
|
||||||
@ -21,6 +22,8 @@ import com.safemobile.activities.AbstractRadioActivity;
|
|||||||
import com.safemobile.activities.AbstractSDParentActivity;
|
import com.safemobile.activities.AbstractSDParentActivity;
|
||||||
import com.safemobile.enums.AuthorizationCode;
|
import com.safemobile.enums.AuthorizationCode;
|
||||||
import com.safemobile.enums.AuthorizationStatus;
|
import com.safemobile.enums.AuthorizationStatus;
|
||||||
|
import com.safemobile.enums.ProviderSettingsStatus;
|
||||||
|
import com.safemobile.helpers.ProviderSettingsHelper;
|
||||||
import com.safemobile.interfaces.IPermissionModule;
|
import com.safemobile.interfaces.IPermissionModule;
|
||||||
import com.safemobile.interfaces.ITCPListener;
|
import com.safemobile.interfaces.ITCPListener;
|
||||||
import com.safemobile.interfaces.TCPEvent;
|
import com.safemobile.interfaces.TCPEvent;
|
||||||
@ -880,7 +883,7 @@ public class TabLayoutActivity extends AbstractSDParentActivity {
|
|||||||
tabHost.setCurrentTabByTag(TEXT);
|
tabHost.setCurrentTabByTag(TEXT);
|
||||||
AppParams.crtTab = AppParams.Tabs.message;
|
AppParams.crtTab = AppParams.Tabs.message;
|
||||||
Vehicle vehicle = getVehicle4Imei(getImei());
|
Vehicle vehicle = getVehicle4Imei(getImei());
|
||||||
if(vehicle != null)
|
if (vehicle != null)
|
||||||
getMessageActivity().setScId(vehicle.sc_id);
|
getMessageActivity().setScId(vehicle.sc_id);
|
||||||
getMessageActivity().LASTMESSAGES = false;
|
getMessageActivity().LASTMESSAGES = false;
|
||||||
getMessageActivity().getLastSMS();
|
getMessageActivity().getLastSMS();
|
||||||
@ -1057,7 +1060,7 @@ public class TabLayoutActivity extends AbstractSDParentActivity {
|
|||||||
SM.Debug("########### UPDATE");
|
SM.Debug("########### UPDATE");
|
||||||
int scId = demoPosition % 3 == 0 ? 101 : 102;
|
int scId = demoPosition % 3 == 0 ? 101 : 102;
|
||||||
SuperVehicle superVehicle = (getSuperVehHash().get((long) scId));
|
SuperVehicle superVehicle = (getSuperVehHash().get((long) scId));
|
||||||
if(superVehicle != null)
|
if (superVehicle != null)
|
||||||
superVehicle.SetNewPosition(crtPos.lat, crtPos.lng, Calendar.getInstance().getTime().getTime(), crtPos.speed);
|
superVehicle.SetNewPosition(crtPos.lat, crtPos.lng, Calendar.getInstance().getTime().getTime(), crtPos.speed);
|
||||||
getLiveActivity().refreshMap();
|
getLiveActivity().refreshMap();
|
||||||
}
|
}
|
||||||
@ -1334,7 +1337,7 @@ public class TabLayoutActivity extends AbstractSDParentActivity {
|
|||||||
myHandler.post(updateResults);
|
myHandler.post(updateResults);
|
||||||
} else
|
} else
|
||||||
myHandler.post(() ->
|
myHandler.post(() ->
|
||||||
createNotification(AppParams.messageNotif));
|
createNotification(AppParams.messageNotif));
|
||||||
|
|
||||||
//list for SMS
|
//list for SMS
|
||||||
if (AppParams.crtTab == AppParams.Tabs.message && getMessageActivity() != null) {
|
if (AppParams.crtTab == AppParams.Tabs.message && getMessageActivity() != null) {
|
||||||
@ -1782,7 +1785,8 @@ public class TabLayoutActivity extends AbstractSDParentActivity {
|
|||||||
Vehicle vehicle = getVehicle4Imei(getImei());
|
Vehicle vehicle = getVehicle4Imei(getImei());
|
||||||
if (vehicle != null)
|
if (vehicle != null)
|
||||||
textViewNMFrom.setText(String.format("%s: %s", getString(R.string.from), vehicle.name));
|
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()));
|
textViewNMMessage.setText(String.format("TYPE: %s", getMess()));
|
||||||
// show layout
|
// show layout
|
||||||
layoutNewMessage.setVisibility(View.VISIBLE);
|
layoutNewMessage.setVisibility(View.VISIBLE);
|
||||||
@ -2233,13 +2237,14 @@ public class TabLayoutActivity extends AbstractSDParentActivity {
|
|||||||
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
|
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
|
||||||
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
|
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
|
||||||
|
|
||||||
SM.Debug("onRequestPermissionsResult", "[requestCode] " + requestCode );
|
SM.Debug("onRequestPermissionsResult", "[requestCode] " + requestCode);
|
||||||
String permission = "";
|
String permission = "";
|
||||||
switch (requestCode) {
|
switch (requestCode) {
|
||||||
case PermissionModule.RECORD_AUDIO_PERMISSION_REQUEST_CODE:
|
case PermissionModule.RECORD_AUDIO_PERMISSION_REQUEST_CODE:
|
||||||
permission = Manifest.permission.RECORD_AUDIO;
|
permission = Manifest.permission.RECORD_AUDIO;
|
||||||
break;
|
break;
|
||||||
default: throw new IllegalStateException("Unexpected value: " + requestCode);
|
default:
|
||||||
|
throw new IllegalStateException("Unexpected value: " + requestCode);
|
||||||
}
|
}
|
||||||
|
|
||||||
AuthorizationStatus result;
|
AuthorizationStatus result;
|
||||||
@ -2252,13 +2257,13 @@ public class TabLayoutActivity extends AbstractSDParentActivity {
|
|||||||
if (permissions.length == 0)
|
if (permissions.length == 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (permissions[0].equals(Manifest.permission.RECORD_AUDIO)){
|
if (permissions[0].equals(Manifest.permission.RECORD_AUDIO)) {
|
||||||
onAudioPermissionChanged(result);
|
onAudioPermissionChanged(result);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void onAudioPermissionChanged(AuthorizationStatus result) {
|
private void onAudioPermissionChanged(AuthorizationStatus result) {
|
||||||
if (result == AuthorizationStatus.AUTHORIZE){
|
if (result == AuthorizationStatus.AUTHORIZE) {
|
||||||
// select button
|
// select button
|
||||||
buttonRadio.setSelected(true);
|
buttonRadio.setSelected(true);
|
||||||
// deselect other buttons
|
// deselect other buttons
|
||||||
@ -2276,23 +2281,38 @@ public class TabLayoutActivity extends AbstractSDParentActivity {
|
|||||||
getRadioActivity().allVehicle = getAllVehicle();
|
getRadioActivity().allVehicle = getAllVehicle();
|
||||||
getRadioActivity().UpdateVehicle();
|
getRadioActivity().UpdateVehicle();
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
DialogService dialogService = new DialogService();
|
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()));
|
responseTask.addOnCompleteListener(task -> waitForUserInput(task.getResult()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void waitForUserInput(Boolean result) {
|
private void waitForUserInput(Boolean result) {
|
||||||
if (result)
|
if (result) {
|
||||||
{
|
final int requestCode = 1202;
|
||||||
//navigate to phone's settings
|
//navigate to application's settings
|
||||||
//ToDo: make the navigation .. see ProviderSettingsHelper
|
String action = ProviderSettingsHelper.getAction(ProviderSettingsStatus.APPLICATION_DETAILS);
|
||||||
}
|
if (action == null || action == "")
|
||||||
else
|
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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2,15 +2,12 @@ package com.safemobile.lib;
|
|||||||
|
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
import android.app.AlertDialog;
|
import android.app.AlertDialog;
|
||||||
import android.content.DialogInterface;
|
|
||||||
|
|
||||||
import com.google.android.gms.tasks.Task;
|
import com.google.android.gms.tasks.Task;
|
||||||
import com.google.android.gms.tasks.TaskCompletionSource;
|
import com.google.android.gms.tasks.TaskCompletionSource;
|
||||||
import com.safemobile.dispatch.R;
|
import com.safemobile.dispatch.R;
|
||||||
import com.safemobile.interfaces.IDialogService;
|
import com.safemobile.interfaces.IDialogService;
|
||||||
|
|
||||||
import java.util.concurrent.atomic.AtomicBoolean;
|
|
||||||
|
|
||||||
public class DialogService implements IDialogService {
|
public class DialogService implements IDialogService {
|
||||||
@Override
|
@Override
|
||||||
public Task<Boolean> showDialog(Activity activity, String title, String message, String cancel, String ok) {
|
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)
|
.setMessage(message)
|
||||||
.setCancelable(false)
|
.setCancelable(false)
|
||||||
.setNegativeButton(cancel, (dialog, which) -> {
|
.setNegativeButton(cancel, (dialog, which) -> {
|
||||||
taskCompletionSource.trySetResult(false);
|
taskCompletionSource.trySetResult(false);
|
||||||
dialog.dismiss();
|
dialog.dismiss();
|
||||||
})
|
})
|
||||||
.setPositiveButton(ok, (dialog, which) -> taskCompletionSource.trySetResult(true));
|
.setPositiveButton(ok, (dialog, which) -> taskCompletionSource.trySetResult(true));
|
||||||
@ -32,19 +29,22 @@ public class DialogService implements IDialogService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Task<Boolean> showPermissionRequestDialog(Activity activity, String title, String message, String cancel) {
|
public Task<Boolean> showPermissionRequestDialog(Activity activity, String message, String cancel) {
|
||||||
return showDialog(activity,title,message,cancel, activity.getString(R.string.go_to_settings));
|
return showDialog(
|
||||||
|
activity,
|
||||||
|
activity.getString(R.string.permission_denied),
|
||||||
|
message,
|
||||||
|
cancel,
|
||||||
|
activity.getString(R.string.go_to_settings));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void showError(Activity activity, String message) {
|
public void showError(Activity activity, String message) {
|
||||||
AlertDialog.Builder builder = new AlertDialog.Builder(activity)
|
showDialog(
|
||||||
.setTitle(R.string.DialoService_Info_ErrorMessage)
|
activity,
|
||||||
.setMessage(message)
|
activity.getString(R.string.DialogService_Info_ErrorMessage),
|
||||||
.setCancelable(false)
|
message,
|
||||||
.setNeutralButton(R.string.ok, (dialog, which) -> dialog.dismiss());
|
null,
|
||||||
|
activity.getString(R.string.ok));
|
||||||
AlertDialog dialog = builder.create();
|
|
||||||
dialog.show();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -257,7 +257,11 @@
|
|||||||
|
|
||||||
|
|
||||||
<string name="speedMph">%1$d mph</string>
|
<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="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>
|
</resources>
|
Loading…
Reference in New Issue
Block a user