Этот коммит содержится в:
Anton Tananaev
2018-09-23 15:08:11 +12:00
родитель d05ce23bba
Коммит 7186acaed8
8 изменённых файлов: 192 добавлений и 38 удалений
+3 -2
Просмотреть файл
@@ -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')) {
+13 -2
Просмотреть файл
@@ -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>
-32
Просмотреть файл
@@ -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);
}
}
+70
Просмотреть файл
@@ -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);
}
}
+50
Просмотреть файл
@@ -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);
}
}
+52 -2
Просмотреть файл
@@ -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) {
+1
Просмотреть файл
@@ -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>
+3
Просмотреть файл
@@ -0,0 +1,3 @@
<resources>
<string name="notification_channel_id">default</string>
</resources>