diff options
author | Anton Tananaev <anton.tananaev@gmail.com> | 2018-09-23 15:08:11 +1200 |
---|---|---|
committer | Anton Tananaev <anton.tananaev@gmail.com> | 2018-09-23 15:08:11 +1200 |
commit | 7186acaed8370ca179b250a7b45e4940937ca57f (patch) | |
tree | 2ba12c24646795a9de45708ca29debe550f1f3c4 | |
parent | d05ce23bbae5adce5ed59468a50c8e9378517e75 (diff) | |
download | etbsa-traccar-manager-android-7186acaed8370ca179b250a7b45e4940937ca57f.tar.gz etbsa-traccar-manager-android-7186acaed8370ca179b250a7b45e4940937ca57f.tar.bz2 etbsa-traccar-manager-android-7186acaed8370ca179b250a7b45e4940937ca57f.zip |
Implement push notifications
-rw-r--r-- | app/build.gradle | 5 | ||||
-rw-r--r-- | app/src/google/AndroidManifest.xml | 15 | ||||
-rw-r--r-- | app/src/google/java/org/traccar/client/GoogleMainApplication.java | 32 | ||||
-rw-r--r-- | app/src/google/java/org/traccar/manager/GoogleMainApplication.java | 70 | ||||
-rw-r--r-- | app/src/google/java/org/traccar/manager/ManagerMessagingService.java | 50 | ||||
-rw-r--r-- | app/src/main/java/org/traccar/manager/MainFragment.java | 54 | ||||
-rw-r--r-- | app/src/main/res/values/strings.xml | 1 | ||||
-rw-r--r-- | app/src/main/res/values/values.xml | 3 |
8 files changed, 192 insertions, 38 deletions
diff --git a/app/build.gradle b/app/build.gradle index 0425cea..d6a1d17 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -21,8 +21,9 @@ android { dependencies { implementation 'com.android.support:design:28.0.0-rc02' - googleImplementation 'com.google.firebase:firebase-core:16.0.1' - googleImplementation 'com.crashlytics.sdk.android:crashlytics:2.9.4' + googleImplementation 'com.google.firebase:firebase-core:16.0.3' + 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')) { diff --git a/app/src/google/AndroidManifest.xml b/app/src/google/AndroidManifest.xml index 15bb065..cd5ddd8 100644 --- a/app/src/google/AndroidManifest.xml +++ b/app/src/google/AndroidManifest.xml @@ -1,16 +1,27 @@ <?xml version="1.0" encoding="utf-8"?> <manifest 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 - android:name="org.traccar.client.GoogleMainApplication" + android:name=".GoogleMainApplication" tools:replace="android:name"> <meta-data android:name="google_analytics_adid_collection_enabled" 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> </manifest> diff --git a/app/src/google/java/org/traccar/client/GoogleMainApplication.java b/app/src/google/java/org/traccar/client/GoogleMainApplication.java deleted file mode 100644 index 5b6a51b..0000000 --- a/app/src/google/java/org/traccar/client/GoogleMainApplication.java +++ /dev/null @@ -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); - } - -} diff --git a/app/src/google/java/org/traccar/manager/GoogleMainApplication.java b/app/src/google/java/org/traccar/manager/GoogleMainApplication.java new file mode 100644 index 0000000..47756aa --- /dev/null +++ b/app/src/google/java/org/traccar/manager/GoogleMainApplication.java @@ -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); + } + +} diff --git a/app/src/google/java/org/traccar/manager/ManagerMessagingService.java b/app/src/google/java/org/traccar/manager/ManagerMessagingService.java new file mode 100644 index 0000000..55e664b --- /dev/null +++ b/app/src/google/java/org/traccar/manager/ManagerMessagingService.java @@ -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); + } + +} diff --git a/app/src/main/java/org/traccar/manager/MainFragment.java b/app/src/main/java/org/traccar/manager/MainFragment.java index 6e099ad..4642415 100644 --- a/app/src/main/java/org/traccar/manager/MainFragment.java +++ b/app/src/main/java/org/traccar/manager/MainFragment.java @@ -17,14 +17,20 @@ package org.traccar.manager; import android.app.Activity; import android.content.ActivityNotFoundException; +import android.content.BroadcastReceiver; +import android.content.Context; import android.content.Intent; +import android.content.IntentFilter; import android.content.pm.ApplicationInfo; import android.content.res.AssetManager; import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.preference.PreferenceManager; +import android.support.annotation.Nullable; +import android.support.v4.content.LocalBroadcastManager; import android.view.View; +import android.webkit.JavascriptInterface; import android.webkit.MimeTypeMap; import android.webkit.ValueCallback; import android.webkit.WebChromeClient; @@ -42,16 +48,37 @@ import java.util.Map; 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 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 public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); - assetManager = getActivity().getAssets(); - if ((getActivity().getApplicationInfo().flags &= ApplicationInfo.FLAG_DEBUGGABLE) != 0) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { WebView.setWebContentsDebuggingEnabled(true); @@ -60,6 +87,7 @@ public class MainFragment extends WebViewFragment { getWebView().setWebViewClient(webViewClient); getWebView().setWebChromeClient(webChromeClient); + getWebView().addJavascriptInterface(new AppInterface(), "appInterface"); WebSettings webSettings = getWebView().getSettings(); webSettings.setJavaScriptEnabled(true); @@ -73,6 +101,28 @@ public class MainFragment extends WebViewFragment { 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) { String extension = MimeTypeMap.getFileExtensionFromUrl(url); if (extension != null) { diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 0f91e69..2ae7947 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -5,4 +5,5 @@ <string name="button_start">Start</string> <string name="error_connection">Server connection failed</string> <string name="file_browser">File Browser</string> + <string name="notification_channel">Default</string> </resources> diff --git a/app/src/main/res/values/values.xml b/app/src/main/res/values/values.xml new file mode 100644 index 0000000..d16eb65 --- /dev/null +++ b/app/src/main/res/values/values.xml @@ -0,0 +1,3 @@ +<resources> + <string name="notification_channel_id">default</string> +</resources> |