Implement push notifications
Этот коммит содержится в:
@@ -21,8 +21,9 @@ android {
|
|||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
implementation 'com.android.support:design:28.0.0-rc02'
|
implementation 'com.android.support:design:28.0.0-rc02'
|
||||||
googleImplementation 'com.google.firebase:firebase-core:16.0.1'
|
googleImplementation 'com.google.firebase:firebase-core:16.0.3'
|
||||||
googleImplementation 'com.crashlytics.sdk.android:crashlytics:2.9.4'
|
googleImplementation 'com.google.firebase:firebase-messaging:17.3.2'
|
||||||
|
googleImplementation 'com.crashlytics.sdk.android:crashlytics:2.9.5'
|
||||||
}
|
}
|
||||||
|
|
||||||
if (getGradle().getStartParameter().getTaskRequests().toString().contains('Google')) {
|
if (getGradle().getStartParameter().getTaskRequests().toString().contains('Google')) {
|
||||||
|
|||||||
@@ -1,16 +1,27 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<manifest
|
<manifest
|
||||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:tools="http://schemas.android.com/tools">
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
package="org.traccar.manager">
|
||||||
|
|
||||||
<application
|
<application
|
||||||
android:name="org.traccar.client.GoogleMainApplication"
|
android:name=".GoogleMainApplication"
|
||||||
tools:replace="android:name">
|
tools:replace="android:name">
|
||||||
|
|
||||||
<meta-data
|
<meta-data
|
||||||
android:name="google_analytics_adid_collection_enabled"
|
android:name="google_analytics_adid_collection_enabled"
|
||||||
android:value="false" />
|
android:value="false" />
|
||||||
|
|
||||||
|
<meta-data
|
||||||
|
android:name="com.google.firebase.messaging.default_notification_channel_id"
|
||||||
|
android:value="@string/notification_channel_id" />
|
||||||
|
|
||||||
|
<service android:name=".ManagerMessagingService">
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="com.google.firebase.MESSAGING_EVENT" />
|
||||||
|
</intent-filter>
|
||||||
|
</service>
|
||||||
|
|
||||||
</application>
|
</application>
|
||||||
|
|
||||||
</manifest>
|
</manifest>
|
||||||
|
|||||||
@@ -1,32 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2017 Anton Tananaev (anton.tananaev@gmail.com)
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
package org.traccar.client;
|
|
||||||
|
|
||||||
import android.app.Application;
|
|
||||||
|
|
||||||
import com.google.firebase.analytics.FirebaseAnalytics;
|
|
||||||
|
|
||||||
public class GoogleMainApplication extends Application {
|
|
||||||
|
|
||||||
private FirebaseAnalytics firebaseAnalytics;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onCreate() {
|
|
||||||
super.onCreate();
|
|
||||||
firebaseAnalytics = FirebaseAnalytics.getInstance(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,70 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2017 Anton Tananaev (anton.tananaev@gmail.com)
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.traccar.manager;
|
||||||
|
|
||||||
|
import android.app.Application;
|
||||||
|
import android.app.NotificationChannel;
|
||||||
|
import android.app.NotificationManager;
|
||||||
|
import android.content.BroadcastReceiver;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.content.IntentFilter;
|
||||||
|
import android.os.Build;
|
||||||
|
import android.support.v4.content.LocalBroadcastManager;
|
||||||
|
|
||||||
|
import com.google.android.gms.tasks.OnSuccessListener;
|
||||||
|
import com.google.firebase.analytics.FirebaseAnalytics;
|
||||||
|
import com.google.firebase.iid.FirebaseInstanceId;
|
||||||
|
import com.google.firebase.iid.InstanceIdResult;
|
||||||
|
|
||||||
|
public class GoogleMainApplication extends Application {
|
||||||
|
|
||||||
|
private FirebaseAnalytics firebaseAnalytics;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onCreate() {
|
||||||
|
super.onCreate();
|
||||||
|
firebaseAnalytics = FirebaseAnalytics.getInstance(this);
|
||||||
|
IntentFilter intentFilter = new IntentFilter(MainFragment.EVENT_LOGIN);
|
||||||
|
LocalBroadcastManager.getInstance(this).registerReceiver(broadcastReceiver, intentFilter);
|
||||||
|
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||||
|
NotificationChannel channel = new NotificationChannel(
|
||||||
|
getString(R.string.notification_channel_id), getString(R.string.notification_channel),
|
||||||
|
NotificationManager.IMPORTANCE_DEFAULT);
|
||||||
|
((NotificationManager) getSystemService(NOTIFICATION_SERVICE)).createNotificationChannel(channel);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
|
||||||
|
@Override
|
||||||
|
public void onReceive(Context context, Intent intent) {
|
||||||
|
FirebaseInstanceId.getInstance().getInstanceId().addOnSuccessListener(new OnSuccessListener<InstanceIdResult>() {
|
||||||
|
@Override
|
||||||
|
public void onSuccess(InstanceIdResult instanceIdResult) {
|
||||||
|
broadcastToken(instanceIdResult.getToken());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
public void broadcastToken(String token) {
|
||||||
|
Intent intent = new Intent(MainFragment.EVENT_TOKEN);
|
||||||
|
intent.putExtra(MainFragment.KEY_TOKEN, token);
|
||||||
|
LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,50 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2018 Anton Tananaev (anton.tananaev@gmail.com)
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.traccar.manager;
|
||||||
|
|
||||||
|
import android.app.NotificationManager;
|
||||||
|
import android.app.PendingIntent;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.support.v4.app.NotificationCompat;
|
||||||
|
|
||||||
|
import com.google.firebase.messaging.FirebaseMessagingService;
|
||||||
|
import com.google.firebase.messaging.RemoteMessage;
|
||||||
|
|
||||||
|
public class ManagerMessagingService extends FirebaseMessagingService {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onMessageReceived(RemoteMessage remoteMessage) {
|
||||||
|
super.onMessageReceived(remoteMessage);
|
||||||
|
|
||||||
|
PendingIntent pendingIntent = PendingIntent.getActivity(
|
||||||
|
this, 0, new Intent(this, MainActivity.class), PendingIntent.FLAG_ONE_SHOT);
|
||||||
|
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, getString(R.string.notification_channel_id))
|
||||||
|
.setSmallIcon(R.mipmap.ic_launcher)
|
||||||
|
.setContentTitle(getString(R.string.app_name))
|
||||||
|
.setContentText(remoteMessage.getNotification().getBody())
|
||||||
|
.setAutoCancel(true)
|
||||||
|
.setContentIntent(pendingIntent);;
|
||||||
|
((NotificationManager) getSystemService(NOTIFICATION_SERVICE)).notify(remoteMessage.hashCode(), builder.build());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onNewToken(String token) {
|
||||||
|
super.onNewToken(token);
|
||||||
|
|
||||||
|
((GoogleMainApplication) getApplication()).broadcastToken(token);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -17,14 +17,20 @@ package org.traccar.manager;
|
|||||||
|
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
import android.content.ActivityNotFoundException;
|
import android.content.ActivityNotFoundException;
|
||||||
|
import android.content.BroadcastReceiver;
|
||||||
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
|
import android.content.IntentFilter;
|
||||||
import android.content.pm.ApplicationInfo;
|
import android.content.pm.ApplicationInfo;
|
||||||
import android.content.res.AssetManager;
|
import android.content.res.AssetManager;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.preference.PreferenceManager;
|
import android.preference.PreferenceManager;
|
||||||
|
import android.support.annotation.Nullable;
|
||||||
|
import android.support.v4.content.LocalBroadcastManager;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
|
import android.webkit.JavascriptInterface;
|
||||||
import android.webkit.MimeTypeMap;
|
import android.webkit.MimeTypeMap;
|
||||||
import android.webkit.ValueCallback;
|
import android.webkit.ValueCallback;
|
||||||
import android.webkit.WebChromeClient;
|
import android.webkit.WebChromeClient;
|
||||||
@@ -42,16 +48,37 @@ import java.util.Map;
|
|||||||
|
|
||||||
public class MainFragment extends WebViewFragment {
|
public class MainFragment extends WebViewFragment {
|
||||||
|
|
||||||
|
public final static String EVENT_LOGIN = "eventLogin";
|
||||||
|
public final static String EVENT_TOKEN = "eventToken";
|
||||||
|
public final static String KEY_TOKEN = "keyToken";
|
||||||
|
|
||||||
private final static int REQUEST_FILE_CHOOSER = 1;
|
private final static int REQUEST_FILE_CHOOSER = 1;
|
||||||
|
|
||||||
private AssetManager assetManager;
|
private AssetManager assetManager;
|
||||||
|
private LocalBroadcastManager broadcastManager;
|
||||||
|
|
||||||
|
public class AppInterface {
|
||||||
|
|
||||||
|
@JavascriptInterface
|
||||||
|
public void postMessage(String message) {
|
||||||
|
if (message.contains("login")) {
|
||||||
|
broadcastManager.sendBroadcast(new Intent(EVENT_LOGIN));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onCreate(@Nullable Bundle savedInstanceState) {
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
assetManager = getActivity().getAssets();
|
||||||
|
broadcastManager = LocalBroadcastManager.getInstance(getActivity());
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onViewCreated(View view, Bundle savedInstanceState) {
|
public void onViewCreated(View view, Bundle savedInstanceState) {
|
||||||
super.onViewCreated(view, savedInstanceState);
|
super.onViewCreated(view, savedInstanceState);
|
||||||
|
|
||||||
assetManager = getActivity().getAssets();
|
|
||||||
|
|
||||||
if ((getActivity().getApplicationInfo().flags &= ApplicationInfo.FLAG_DEBUGGABLE) != 0) {
|
if ((getActivity().getApplicationInfo().flags &= ApplicationInfo.FLAG_DEBUGGABLE) != 0) {
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
|
||||||
WebView.setWebContentsDebuggingEnabled(true);
|
WebView.setWebContentsDebuggingEnabled(true);
|
||||||
@@ -60,6 +87,7 @@ public class MainFragment extends WebViewFragment {
|
|||||||
|
|
||||||
getWebView().setWebViewClient(webViewClient);
|
getWebView().setWebViewClient(webViewClient);
|
||||||
getWebView().setWebChromeClient(webChromeClient);
|
getWebView().setWebChromeClient(webChromeClient);
|
||||||
|
getWebView().addJavascriptInterface(new AppInterface(), "appInterface");
|
||||||
|
|
||||||
WebSettings webSettings = getWebView().getSettings();
|
WebSettings webSettings = getWebView().getSettings();
|
||||||
webSettings.setJavaScriptEnabled(true);
|
webSettings.setJavaScriptEnabled(true);
|
||||||
@@ -73,6 +101,28 @@ public class MainFragment extends WebViewFragment {
|
|||||||
getWebView().loadUrl(url);
|
getWebView().loadUrl(url);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
|
||||||
|
@Override
|
||||||
|
public void onReceive(Context context, Intent intent) {
|
||||||
|
String token = intent.getStringExtra(KEY_TOKEN);
|
||||||
|
String code = "updateNotificationToken && updateNotificationToken('" + token + "')";
|
||||||
|
getWebView().evaluateJavascript(code, null);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onStart() {
|
||||||
|
super.onStart();
|
||||||
|
IntentFilter intentFilter = new IntentFilter(EVENT_TOKEN);
|
||||||
|
broadcastManager.registerReceiver(broadcastReceiver, intentFilter);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onStop() {
|
||||||
|
super.onStop();
|
||||||
|
broadcastManager.unregisterReceiver(broadcastReceiver);
|
||||||
|
}
|
||||||
|
|
||||||
public String getMimeType(String url) {
|
public String getMimeType(String url) {
|
||||||
String extension = MimeTypeMap.getFileExtensionFromUrl(url);
|
String extension = MimeTypeMap.getFileExtensionFromUrl(url);
|
||||||
if (extension != null) {
|
if (extension != null) {
|
||||||
|
|||||||
@@ -5,4 +5,5 @@
|
|||||||
<string name="button_start">Start</string>
|
<string name="button_start">Start</string>
|
||||||
<string name="error_connection">Server connection failed</string>
|
<string name="error_connection">Server connection failed</string>
|
||||||
<string name="file_browser">File Browser</string>
|
<string name="file_browser">File Browser</string>
|
||||||
|
<string name="notification_channel">Default</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
@@ -0,0 +1,3 @@
|
|||||||
|
<resources>
|
||||||
|
<string name="notification_channel_id">default</string>
|
||||||
|
</resources>
|
||||||
Ссылка в новой задаче
Block a user