aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--app/src/main/AndroidManifest.xml1
-rw-r--r--app/src/main/java/org/traccar/manager/MainActivity.java15
-rw-r--r--app/src/main/java/org/traccar/manager/MainFragment.java49
-rw-r--r--app/src/main/res/values/strings.xml1
4 files changed, 65 insertions, 1 deletions
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 41cbaf6..7931b2b 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -5,6 +5,7 @@
package="org.traccar.manager">
<uses-permission android:name="android.permission.INTERNET" />
+ <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<application
android:allowBackup="true"
diff --git a/app/src/main/java/org/traccar/manager/MainActivity.java b/app/src/main/java/org/traccar/manager/MainActivity.java
index 863ac79..b23e89f 100644
--- a/app/src/main/java/org/traccar/manager/MainActivity.java
+++ b/app/src/main/java/org/traccar/manager/MainActivity.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2016 Anton Tananaev (anton@traccar.org)
+ * Copyright 2016 - 2021 Anton Tananaev (anton@traccar.org)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -15,8 +15,13 @@
*/
package org.traccar.manager;
+import android.app.Fragment;
+import android.os.Build;
import android.os.Bundle;
import android.preference.PreferenceManager;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity;
public class MainActivity extends AppCompatActivity {
@@ -40,4 +45,12 @@ public class MainActivity extends AppCompatActivity {
}
}
+ @RequiresApi(api = Build.VERSION_CODES.M)
+ @Override
+ public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
+ Fragment fragment = getFragmentManager().findFragmentById(android.R.id.content);
+ if (fragment != null) {
+ fragment.onRequestPermissionsResult(requestCode, permissions, grantResults);
+ }
+ }
}
diff --git a/app/src/main/java/org/traccar/manager/MainFragment.java b/app/src/main/java/org/traccar/manager/MainFragment.java
index 78bfee1..1e98b17 100644
--- a/app/src/main/java/org/traccar/manager/MainFragment.java
+++ b/app/src/main/java/org/traccar/manager/MainFragment.java
@@ -15,6 +15,7 @@
*/
package org.traccar.manager;
+import android.Manifest;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.ActivityNotFoundException;
@@ -23,11 +24,13 @@ import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.view.View;
+import android.webkit.GeolocationPermissions;
import android.webkit.JavascriptInterface;
import android.webkit.ValueCallback;
import android.webkit.WebChromeClient;
@@ -35,7 +38,11 @@ import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewFragment;
+import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.appcompat.app.AlertDialog;
+import androidx.core.app.ActivityCompat;
+import androidx.core.content.ContextCompat;
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
public class MainFragment extends WebViewFragment {
@@ -44,6 +51,7 @@ public class MainFragment extends WebViewFragment {
public final static String EVENT_TOKEN = "eventToken";
public final static String KEY_TOKEN = "keyToken";
+ private static final int REQUEST_PERMISSIONS_LOCATION = 1;
private final static int REQUEST_FILE_CHOOSER = 1;
private LocalBroadcastManager broadcastManager;
@@ -129,8 +137,49 @@ public class MainFragment extends WebViewFragment {
}
}
+ @Override
+ public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
+ if (requestCode == REQUEST_PERMISSIONS_LOCATION) {
+ boolean granted = grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED;
+ if (geolocationCallback != null) {
+ geolocationCallback.invoke(geolocationRequestOrigin, granted, false);
+ geolocationRequestOrigin = null;
+ geolocationCallback = null;
+ }
+ }
+ }
+
+ private String geolocationRequestOrigin;
+ private GeolocationPermissions.Callback geolocationCallback;
+
private final WebChromeClient webChromeClient = new WebChromeClient() {
+ @Override
+ public void onGeolocationPermissionsShowPrompt(String origin, GeolocationPermissions.Callback callback) {
+ geolocationRequestOrigin = null;
+ geolocationCallback = null;
+ if (ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
+ if (ActivityCompat.shouldShowRequestPermissionRationale(getActivity(), Manifest.permission.ACCESS_FINE_LOCATION)) {
+ new AlertDialog.Builder(getActivity())
+ .setMessage(R.string.permission_location_rationale)
+ .setNeutralButton(android.R.string.ok, (dialog, which) -> {
+ geolocationRequestOrigin = origin;
+ geolocationCallback = callback;
+ ActivityCompat.requestPermissions(
+ getActivity(), new String[] { Manifest.permission.ACCESS_FINE_LOCATION }, REQUEST_PERMISSIONS_LOCATION);
+ })
+ .show();
+ } else {
+ geolocationRequestOrigin = origin;
+ geolocationCallback = callback;
+ ActivityCompat.requestPermissions(
+ getActivity(), new String[] { Manifest.permission.ACCESS_FINE_LOCATION }, REQUEST_PERMISSIONS_LOCATION);
+ }
+ } else {
+ callback.invoke(origin, true, false);
+ }
+ }
+
// Android 4.1+
protected void openFileChooser(ValueCallback<Uri> uploadMessage, String acceptType, String capture) {
openFileChooser(uploadMessage);
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 2ae7947..feea781 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -6,4 +6,5 @@
<string name="error_connection">Server connection failed</string>
<string name="file_browser">File Browser</string>
<string name="notification_channel">Default</string>
+ <string name="permission_location_rationale">App requires location permission to show current location on the map</string>
</resources>