Browse Source
Add host app implementation of NativeNotificationContentFetcher for development app: - Create PluginApplication extends Application to register fetcher on app startup - Create DemoNativeFetcher implementing NativeNotificationContentFetcher interface - Register PluginApplication in AndroidManifest.xml - DemoNativeFetcher returns mock notification content for testing This demonstrates the SPI pattern where host apps provide their own content fetching implementation to the plugin for background workers.master
3 changed files with 124 additions and 0 deletions
@ -0,0 +1,85 @@ |
|||||
|
/** |
||||
|
* DemoNativeFetcher.java |
||||
|
* |
||||
|
* Simple demo implementation of NativeNotificationContentFetcher for the plugin demo app. |
||||
|
* Returns mock notification content for demonstration purposes. |
||||
|
* |
||||
|
* @author Matthew Raymer |
||||
|
* @version 1.0.0 |
||||
|
*/ |
||||
|
|
||||
|
package com.timesafari.dailynotification; |
||||
|
|
||||
|
import android.util.Log; |
||||
|
import androidx.annotation.NonNull; |
||||
|
import com.timesafari.dailynotification.FetchContext; |
||||
|
import com.timesafari.dailynotification.NativeNotificationContentFetcher; |
||||
|
import com.timesafari.dailynotification.NotificationContent; |
||||
|
import java.util.ArrayList; |
||||
|
import java.util.Collections; |
||||
|
import java.util.List; |
||||
|
import java.util.concurrent.CompletableFuture; |
||||
|
|
||||
|
/** |
||||
|
* Demo implementation of native content fetcher |
||||
|
* |
||||
|
* Returns mock notification content for demonstration. In production host apps, |
||||
|
* this would fetch from TimeSafari API or other data sources. |
||||
|
*/ |
||||
|
public class DemoNativeFetcher implements NativeNotificationContentFetcher { |
||||
|
|
||||
|
private static final String TAG = "DemoNativeFetcher"; |
||||
|
|
||||
|
@Override |
||||
|
@NonNull |
||||
|
public CompletableFuture<List<NotificationContent>> fetchContent( |
||||
|
@NonNull FetchContext context) { |
||||
|
|
||||
|
Log.d(TAG, "DemoNativeFetcher: Fetch triggered - trigger=" + context.trigger + |
||||
|
", scheduledTime=" + context.scheduledTime + ", fetchTime=" + context.fetchTime); |
||||
|
|
||||
|
return CompletableFuture.supplyAsync(() -> { |
||||
|
try { |
||||
|
// Simulate network delay
|
||||
|
Thread.sleep(100); |
||||
|
|
||||
|
List<NotificationContent> contents = new ArrayList<>(); |
||||
|
|
||||
|
// Create a demo notification
|
||||
|
NotificationContent demoContent = new NotificationContent(); |
||||
|
demoContent.setId("demo_notification_" + System.currentTimeMillis()); |
||||
|
demoContent.setTitle("Demo Notification from Native Fetcher"); |
||||
|
demoContent.setBody("This is a demo notification from the native fetcher SPI. " + |
||||
|
"Trigger: " + context.trigger + |
||||
|
(context.scheduledTime != null ? |
||||
|
", Scheduled: " + new java.util.Date(context.scheduledTime) : "")); |
||||
|
|
||||
|
// Use scheduled time from context, or default to 1 hour from now
|
||||
|
long scheduledTimeMs = context.scheduledTime != null ? |
||||
|
context.scheduledTime : (System.currentTimeMillis() + 3600000); |
||||
|
demoContent.setScheduledTime(scheduledTimeMs); |
||||
|
|
||||
|
// fetchTime is set automatically by NotificationContent constructor (as fetchedAt)
|
||||
|
demoContent.setPriority("default"); |
||||
|
demoContent.setSound(true); |
||||
|
|
||||
|
contents.add(demoContent); |
||||
|
|
||||
|
Log.i(TAG, "DemoNativeFetcher: Returning " + contents.size() + |
||||
|
" notification(s)"); |
||||
|
|
||||
|
return contents; |
||||
|
|
||||
|
} catch (InterruptedException e) { |
||||
|
Log.e(TAG, "DemoNativeFetcher: Interrupted during fetch", e); |
||||
|
Thread.currentThread().interrupt(); |
||||
|
return Collections.emptyList(); |
||||
|
|
||||
|
} catch (Exception e) { |
||||
|
Log.e(TAG, "DemoNativeFetcher: Error during fetch", e); |
||||
|
return Collections.emptyList(); |
||||
|
} |
||||
|
}); |
||||
|
} |
||||
|
} |
||||
|
|
||||
@ -0,0 +1,38 @@ |
|||||
|
/** |
||||
|
* PluginApplication.java |
||||
|
* |
||||
|
* Application class for the Daily Notification Plugin demo app. |
||||
|
* Registers the native content fetcher SPI implementation. |
||||
|
* |
||||
|
* @author Matthew Raymer |
||||
|
* @version 1.0.0 |
||||
|
*/ |
||||
|
|
||||
|
package com.timesafari.dailynotification; |
||||
|
|
||||
|
import android.app.Application; |
||||
|
import android.util.Log; |
||||
|
import com.timesafari.dailynotification.DailyNotificationPlugin; |
||||
|
import com.timesafari.dailynotification.NativeNotificationContentFetcher; |
||||
|
|
||||
|
/** |
||||
|
* Application class that registers native fetcher for plugin demo app |
||||
|
*/ |
||||
|
public class PluginApplication extends Application { |
||||
|
|
||||
|
private static final String TAG = "PluginApplication"; |
||||
|
|
||||
|
@Override |
||||
|
public void onCreate() { |
||||
|
super.onCreate(); |
||||
|
|
||||
|
Log.i(TAG, "Initializing Daily Notification Plugin demo app"); |
||||
|
|
||||
|
// Register demo native fetcher
|
||||
|
NativeNotificationContentFetcher demoFetcher = new DemoNativeFetcher(); |
||||
|
DailyNotificationPlugin.setNativeFetcher(demoFetcher); |
||||
|
|
||||
|
Log.i(TAG, "Demo native fetcher registered: " + demoFetcher.getClass().getName()); |
||||
|
} |
||||
|
} |
||||
|
|
||||
Loading…
Reference in new issue