Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
47 changes: 47 additions & 0 deletions src/Firebase.Notifications/Android/Impl.cpp.uxl
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
<Extensions Backend="CPlusPlus" Condition="Android">
<Require AndroidManifest.Permission="com.google.android.c2dm.permission.RECEIVE" />

<Require AndroidManifest.ActivityElement><![CDATA[
<intent-filter>
<action android:name="fuseFirebaseBackgroundNotify" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
]]></Require>

<Require AndroidManifest.ApplicationElement><![CDATA[
<meta-data android:name="com.google.firebase.messaging.default_notification_icon"
android:resource="@mipmap/notif" />

<service android:name="com.fuse.firebase.Notifications.PushNotificationReceiver">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT"/>
</intent-filter>
</service>

<meta-data
android:name="com.google.firebase.messaging.default_notification_channel_id"
android:value="my_package_channel_1"/>

<service android:name="com.fuse.firebase.Notifications.PushNotificationIDService">
<intent-filter>
<action android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
</intent-filter>
</service>
]]></Require>

<!-- http://iconhandbook.co.uk/reference/chart/android/ -->
<!-- pixplicity.com/dp-px-converter/ -->
<!-- https://material.google.com/style/icons.html -->
<ImageFile Name="@(Project.Android.NotificationIcon.LDPI:Path || Project.Android.Icons.LDPI:Path || '@//Android/Assets/DefaultIcon.png')"
TargetWidth="36" TargetName="app/src/main/res/mipmap-ldpi/notif.png" />
<ImageFile Name="@(Project.Android.NotificationIcon.MDPI:Path || Project.Android.Icons.MDPI:Path || '@//Android/Assets/DefaultIcon.png')"
TargetWidth="48" TargetName="app/src/main/res/mipmap-mdpi/notif.png" />
<ImageFile Name="@(Project.Android.NotificationIcon.HDPI:Path || Project.Android.Icons.HDPI:Path || '@//Android/Assets/DefaultIcon.png')"
TargetWidth="72" TargetName="app/src/main/res/mipmap-hdpi/notif.png" />
<ImageFile Name="@(Project.Android.NotificationIcon.XHDPI:Path || Project.Android.Icons.XHDPI:Path || '@//Android/Assets/DefaultIcon.png')"
TargetWidth="96" TargetName="app/src/main/res/mipmap-xhdpi/notif.png" />
<ImageFile Name="@(Project.Android.NotificationIcon.XXHDPI:Path || Project.Android.Icons.XXHDPI:Path || '@//Android/Assets/DefaultIcon.png')"
TargetWidth="144" TargetName="app/src/main/res/mipmap-xxhdpi/notif.png" />
<ImageFile Name="@(Project.Android.NotificationIcon.XXXHDPI:Path || Project.Android.Icons.XXXHDPI:Path || '@//Android/Assets/DefaultIcon.png')"
TargetWidth="192" TargetName="app/src/main/res/mipmap-xxxhdpi/notif.png" />
</Extensions>
144 changes: 144 additions & 0 deletions src/Firebase.Notifications/Android/Impl.uno
Original file line number Diff line number Diff line change
@@ -0,0 +1,144 @@
using Uno;
using Uno.Graphics;
using Uno.Collections;
using Fuse;
using Fuse.Controls;
using Fuse.Triggers;
using Fuse.Resources;

using Fuse.Platform;
using Uno.Compiler.ExportTargetInterop;
using Uno.Compiler.ExportTargetInterop.Android;

namespace Firebase.Notifications
{
[ForeignInclude(Language.Java,
"java.io.IOException",
"android.app.Activity",
"android.content.Intent",
"android.os.AsyncTask",
"android.content.res.Resources",
"android.content.res.AssetManager",
"android.content.res.AssetFileDescriptor",
"android.os.Bundle",
"com.fuse.firebase.Notifications.PushNotificationReceiver",
"com.google.firebase.messaging.RemoteMessage")]
[Require("Gradle.Dependency.Compile", "com.google.firebase:firebase-messaging:12.0.1")]
extern(Android)
internal class AndroidImpl
{
public static event EventHandler<string> RegistrationSucceeded;
public static event EventHandler<string> RegistrationFailed;
public static event EventHandler<KeyValuePair<string,bool>> ReceivedNotification;

static bool _init = false;
static List<string> _cachedMessages = new List<string>();

internal static void Init()
{
if (!_init)
{
JInit();
_init = true;
Lifecycle.EnteringInteractive += OnEnteringInteractive;
Lifecycle.ExitedInteractive += OnExitedInteractive;
}
}

[Foreign(Language.Java)]
static void JInit()
@{
// Set up vars and hook into fuse intent listeners
com.fuse.Activity.subscribeToIntents(
new com.fuse.Activity.IntentListener() {
public void onIntent (Intent newIntent) {
String jsonStr = com.fuse.firebase.Notifications.PushNotificationReceiver.ToJsonString(newIntent);
if( jsonStr != "{}")
{
@{OnRecieve(string,bool):Call(jsonStr, false)};
}
}
},
"android.intent.action.MAIN");
String id = com.google.firebase.iid.FirebaseInstanceId.getInstance().getToken();
@{getRegistrationIdSuccess(string):Call(id)};
@}


[Foreign(Language.Java), ForeignFixedName]
static void RegistrationIDUpdated(string regid)
@{
@{getRegistrationIdSuccess(string):Call(regid)};
@}

static void getRegistrationIdSuccess(string regid)
{
var x = RegistrationSucceeded;
if (x!=null)
x(null, regid);
}

static void getRegistrationIdError(string message)
{
var x = RegistrationFailed;
if (x!=null)
x(null, message);
}

//----------------------------------------------------------------------

static void OnEnteringInteractive(ApplicationState newState)
{
NoteInteractivity(true);
var x = ReceivedNotification;
if (x!=null)
{
foreach (var message in _cachedMessages)
x(null, new KeyValuePair<string,bool>(message, true));
}
_cachedMessages.Clear();
}


static void OnExitedInteractive(ApplicationState newState)
{
NoteInteractivity(false);
}

//----------------------------------------------------------------------

[Foreign(Language.Java), ForeignFixedName]
static void OnRecieve2(string message, bool fromNotificationBar)
@{
@{OnRecieve(string,bool):Call(message, fromNotificationBar)};
@}

static void OnRecieve(string message, bool fromNotificationBar)
{
if (Lifecycle.State == ApplicationState.Interactive)
{
var x = ReceivedNotification;
if (x!=null)
x(null, new KeyValuePair<string,bool>(message, fromNotificationBar));
}
else
{
_cachedMessages.Add(message);
}
}

//----------------------------------------------------------------------

[Foreign(Language.Java)]
static void NoteInteractivity(bool isItInteractive)
@{
PushNotificationReceiver.InForeground = isItInteractive;
java.util.ArrayList<RemoteMessage> maps = PushNotificationReceiver._cachedBundles;
if (isItInteractive && maps!=null && maps.size()>0) {
for (RemoteMessage remoteMessage : maps)
@{OnRecieve(string,bool):Call(PushNotificationReceiver.ToJsonString(remoteMessage), true)};
maps.clear();
}
@}
}
}
14 changes: 14 additions & 0 deletions src/Firebase.Notifications/Android/PushNotificationIDService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.fuse.firebase.Notifications;

import com.google.firebase.iid.FirebaseInstanceId;
import com.google.firebase.iid.FirebaseInstanceIdService;

public class PushNotificationIDService extends FirebaseInstanceIdService
{
@Override
public void onTokenRefresh()
{
String refreshedToken = FirebaseInstanceId.getInstance().getToken();
com.foreign.Firebase.Notifications.AndroidImpl.RegistrationIDUpdated(refreshedToken);
}
}
Loading