Skip to content

Commit

Permalink
Implement push notifications
Browse files Browse the repository at this point in the history
  • Loading branch information
tananaev committed Sep 23, 2018
1 parent d05ce23 commit 7186aca
Show file tree
Hide file tree
Showing 8 changed files with 192 additions and 38 deletions.
5 changes: 3 additions & 2 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -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')) {
Expand Down
15 changes: 13 additions & 2 deletions app/src/google/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -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>
32 changes: 0 additions & 32 deletions app/src/google/java/org/traccar/client/GoogleMainApplication.java

This file was deleted.

70 changes: 70 additions & 0 deletions app/src/google/java/org/traccar/manager/GoogleMainApplication.java
Original file line number Diff line number Diff line change
@@ -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);
}

}
Original file line number Diff line number Diff line change
@@ -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);
}

}
54 changes: 52 additions & 2 deletions app/src/main/java/org/traccar/manager/MainFragment.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,14 +17,20 @@

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;
Expand All @@ -42,16 +48,37 @@

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);
Expand All @@ -60,6 +87,7 @@ public void onViewCreated(View view, Bundle savedInstanceState) {

getWebView().setWebViewClient(webViewClient);
getWebView().setWebChromeClient(webChromeClient);
getWebView().addJavascriptInterface(new AppInterface(), "appInterface");

WebSettings webSettings = getWebView().getSettings();
webSettings.setJavaScriptEnabled(true);
Expand All @@ -73,6 +101,28 @@ public void onViewCreated(View view, Bundle savedInstanceState) {
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) {
Expand Down
1 change: 1 addition & 0 deletions app/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -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>
3 changes: 3 additions & 0 deletions app/src/main/res/values/values.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
<resources>
<string name="notification_channel_id">default</string>
</resources>

0 comments on commit 7186aca

Please sign in to comment.