diff --git a/libSafeMobile/src/main/java/com/safemobile/enums/ProviderSettingsStatus.java b/libSafeMobile/src/main/java/com/safemobile/enums/ProviderSettingsStatus.java new file mode 100644 index 0000000..bc7f2fb --- /dev/null +++ b/libSafeMobile/src/main/java/com/safemobile/enums/ProviderSettingsStatus.java @@ -0,0 +1,5 @@ +package com.safemobile.enums; + +public enum ProviderSettingsStatus { + ACTION_APPLICATION_DETAILS_SETTINGS +} diff --git a/libSafeMobile/src/main/java/com/safemobile/helpers/ProviderSettingsHelper.java b/libSafeMobile/src/main/java/com/safemobile/helpers/ProviderSettingsHelper.java new file mode 100644 index 0000000..60d2fa8 --- /dev/null +++ b/libSafeMobile/src/main/java/com/safemobile/helpers/ProviderSettingsHelper.java @@ -0,0 +1,29 @@ +package com.safemobile.helpers; + +import android.content.Context; +import android.content.Intent; +import android.net.Uri; + +import com.safemobile.enums.ProviderSettingsStatus; + +public class ProviderSettingsHelper { + private static final String PACKAGE = "package"; + + public static String getAction(ProviderSettingsStatus providerSettingsStatus){ + switch (providerSettingsStatus){ + case ACTION_APPLICATION_DETAILS_SETTINGS: + return "android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS"; + default: + return "android.provider.Settings"; + } + } + + public static boolean canHandleAction(Context context, String action) { + Intent intent = new Intent(action); + Uri uri = Uri.fromParts(PACKAGE, context.getPackageName(), null); + + intent.setData(uri); + + return context.getPackageManager() != null && intent.resolveActivity(context.getPackageManager()) != null; + } +} diff --git a/libSafeMobile/src/main/java/com/safemobile/interfaces/IDialogService.java b/libSafeMobile/src/main/java/com/safemobile/interfaces/IDialogService.java new file mode 100644 index 0000000..6d0601b --- /dev/null +++ b/libSafeMobile/src/main/java/com/safemobile/interfaces/IDialogService.java @@ -0,0 +1,12 @@ +package com.safemobile.interfaces; + +import android.app.Activity; + +import com.google.android.gms.tasks.Task; + +public interface IDialogService { + Task showDialog(Activity activity, String title, String message, String cancel, String ok); + Task showPermissionRequestDialog(Activity activity, String title, String message, String cancel); + + void showError(Activity activity, String message); +} diff --git a/safeDispatch/src/main/java/com/safemobile/dispatch/TabLayoutActivity.java b/safeDispatch/src/main/java/com/safemobile/dispatch/TabLayoutActivity.java index 78a2a57..cd95b6c 100644 --- a/safeDispatch/src/main/java/com/safemobile/dispatch/TabLayoutActivity.java +++ b/safeDispatch/src/main/java/com/safemobile/dispatch/TabLayoutActivity.java @@ -13,21 +13,27 @@ import java.util.Objects; import java.util.Timer; import java.util.TimerTask; +import com.google.android.gms.tasks.Task; import com.safemobile.activities.AbstractEmptyActivity; import com.safemobile.activities.AbstractLiveActivity; import com.safemobile.activities.AbstractMessagesActivity; import com.safemobile.activities.AbstractRadioActivity; import com.safemobile.activities.AbstractSDParentActivity; +import com.safemobile.enums.AuthorizationCode; +import com.safemobile.enums.AuthorizationStatus; +import com.safemobile.interfaces.IPermissionModule; import com.safemobile.interfaces.ITCPListener; import com.safemobile.interfaces.TCPEvent; import com.safemobile.lib.Alarm; import com.safemobile.lib.AlarmMSG; import com.safemobile.lib.AppParams; +import com.safemobile.lib.DialogService; import com.safemobile.lib.GPSmsg; import com.safemobile.lib.HistCountmsg; import com.safemobile.lib.HistPos; import com.safemobile.lib.HistPosmsg; import com.safemobile.lib.OperationCodes; +import com.safemobile.lib.PermissionModule; import com.safemobile.lib.RadioMSG; import com.safemobile.lib.LastPos; import com.safemobile.lib.LastPosmsg; @@ -46,6 +52,7 @@ import com.safemobile.services.TCPService; import com.safemobile.services.TCPhandler; import com.safemobile.services.TCPService.TCPBinder; +import android.Manifest; import android.annotation.SuppressLint; import android.app.Dialog; import android.app.Notification; @@ -57,6 +64,7 @@ import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.ServiceConnection; +import android.content.pm.PackageManager; import android.content.res.AssetManager; import android.content.res.Configuration; import android.content.res.Resources; @@ -81,6 +89,8 @@ import android.widget.TextView; import android.widget.Toast; import android.widget.TabHost.TabSpec; +import androidx.annotation.NonNull; + public class TabLayoutActivity extends AbstractSDParentActivity { /* Misc */ @@ -562,6 +572,15 @@ public class TabLayoutActivity extends AbstractSDParentActivity { buttonRadio.setVisibility(View.GONE); buttonRadio.setOnClickListener(v -> { if (!buttonRadio.isSelected()) { + + // check audio permission + IPermissionModule permissionModule = new PermissionModule(); + AuthorizationStatus audioAuthorizationStatus = permissionModule.getAuthorizationStatus(this, AuthorizationCode.RECORD_AUDIO); + if (audioAuthorizationStatus != AuthorizationStatus.AUTHORIZE) { + permissionModule.requestAuthorization(this, AuthorizationCode.RECORD_AUDIO); + return; + } + // select button buttonRadio.setSelected(true); // deselect other buttons @@ -2209,4 +2228,71 @@ public class TabLayoutActivity extends AbstractSDParentActivity { intent.putExtra("extra", new SerializedObject(object, action)); getBaseContext().sendBroadcast(intent); } + + @Override + public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults); + + 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); + } + + AuthorizationStatus result; + if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { + result = AuthorizationStatus.AUTHORIZE; + } else { + result = AuthorizationStatus.DENIED; + } + + if (permissions.length == 0) + return; + + if (permissions[0].equals(Manifest.permission.RECORD_AUDIO)){ + onAudioPermissionChanged(result); + } + } + + private void onAudioPermissionChanged(AuthorizationStatus result) { + if (result == AuthorizationStatus.AUTHORIZE){ + // select button + buttonRadio.setSelected(true); + // deselect other buttons + buttonAlarms.setSelected(false); + buttonLive.setSelected(false); + buttonRecordings.setSelected(false); + buttonHistory.setSelected(false); + buttonSetup.setSelected(false); + buttonText.setSelected(false); + // select tab + tabHost.setCurrentTabByTag(RADIO); + AppParams.crtTab = AppParams.Tabs.radio; + + if (getRadioActivity() != null && getRadioActivity().allVehicle != null && getRadioActivity().allVehicle.isEmpty()) { + getRadioActivity().allVehicle = getAllVehicle(); + getRadioActivity().UpdateVehicle(); + } + } + else { + DialogService dialogService = new DialogService(); + Task responseTask = dialogService.showPermissionRequestDialog(this, "title", "permissions denied", 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 + { + + } + } } diff --git a/safeDispatch/src/main/java/com/safemobile/lib/DialogService.java b/safeDispatch/src/main/java/com/safemobile/lib/DialogService.java new file mode 100644 index 0000000..abd3cbe --- /dev/null +++ b/safeDispatch/src/main/java/com/safemobile/lib/DialogService.java @@ -0,0 +1,50 @@ +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 showDialog(Activity activity, String title, String message, String cancel, String ok) { + TaskCompletionSource taskCompletionSource = new TaskCompletionSource<>(); + AlertDialog.Builder builder = new AlertDialog.Builder(activity) + .setTitle(title) + .setMessage(message) + .setCancelable(false) + .setNegativeButton(cancel, (dialog, which) -> { + taskCompletionSource.trySetResult(false); + dialog.dismiss(); + }) + .setPositiveButton(ok, (dialog, which) -> taskCompletionSource.trySetResult(true)); + + AlertDialog dialog = builder.create(); + dialog.show(); + + return taskCompletionSource.getTask(); + } + + @Override + public Task showPermissionRequestDialog(Activity activity, String title, String message, String cancel) { + return showDialog(activity,title,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(); + } +} diff --git a/safeDispatch/src/main/java/com/safemobile/lib/PermissionService.java b/safeDispatch/src/main/java/com/safemobile/lib/PermissionModule.java similarity index 98% rename from safeDispatch/src/main/java/com/safemobile/lib/PermissionService.java rename to safeDispatch/src/main/java/com/safemobile/lib/PermissionModule.java index b33a923..3c9c139 100644 --- a/safeDispatch/src/main/java/com/safemobile/lib/PermissionService.java +++ b/safeDispatch/src/main/java/com/safemobile/lib/PermissionModule.java @@ -13,7 +13,7 @@ import com.safemobile.interfaces.IPermissionModule; import java.security.InvalidParameterException; -public class PermissionService implements IPermissionModule { +public class PermissionModule implements IPermissionModule { private static final String[] AUDIO_PERMISSIONS = {Manifest.permission.RECORD_AUDIO}; private static final String[] LOCATION_PERMISSIONS = { Manifest.permission.ACCESS_COARSE_LOCATION, diff --git a/safeDispatch/src/main/res/layout/dialog.xml b/safeDispatch/src/main/res/layout/dialog.xml index 85d3e79..2f477c5 100644 --- a/safeDispatch/src/main/res/layout/dialog.xml +++ b/safeDispatch/src/main/res/layout/dialog.xml @@ -24,14 +24,14 @@ android:layout_height="wrap_content" android:paddingTop="8dp" android:textSize="18dp" - android:textColor="#FFFFFF" + android:textColor="@color/black" /> diff --git a/safeDispatch/src/main/res/values/strings.xml b/safeDispatch/src/main/res/values/strings.xml index f415089..0c72035 100644 --- a/safeDispatch/src/main/res/values/strings.xml +++ b/safeDispatch/src/main/res/values/strings.xml @@ -257,5 +257,7 @@ %1$d mph + Oops, something happened + Go to settings \ No newline at end of file