WD: Live activity implemented on config based
#348
live_activities into master
@ -0,0 +1,4 @@
|
||||
storePassword=HmGsa123
|
||||
keyPassword=HmGsa123
|
||||
keyAlias=hmg
|
||||
storeFile=key
|
||||
@ -0,0 +1,294 @@
|
||||
package io.flutter.plugins;
|
||||
|
||||
import androidx.annotation.Keep;
|
||||
import androidx.annotation.NonNull;
|
||||
import io.flutter.Log;
|
||||
|
||||
import io.flutter.embedding.engine.FlutterEngine;
|
||||
|
||||
/**
|
||||
* Generated file. Do not edit.
|
||||
* This file is generated by the Flutter tool based on the
|
||||
* plugins that support the Android platform.
|
||||
*/
|
||||
@Keep
|
||||
public final class GeneratedPluginRegistrant {
|
||||
private static final String TAG = "GeneratedPluginRegistrant";
|
||||
public static void registerWith(@NonNull FlutterEngine flutterEngine) {
|
||||
try {
|
||||
flutterEngine.getPlugins().add(new com.vvvirani.amazon_payfort.AmazonPayfortPlugin());
|
||||
} catch (Exception e) {
|
||||
Log.e(TAG, "Error registering plugin amazon_payfort, com.vvvirani.amazon_payfort.AmazonPayfortPlugin", e);
|
||||
}
|
||||
try {
|
||||
flutterEngine.getPlugins().add(new com.ryanheise.audio_session.AudioSessionPlugin());
|
||||
} catch (Exception e) {
|
||||
Log.e(TAG, "Error registering plugin audio_session, com.ryanheise.audio_session.AudioSessionPlugin", e);
|
||||
}
|
||||
try {
|
||||
flutterEngine.getPlugins().add(new de.mintware.barcode_scan.BarcodeScanPlugin());
|
||||
} catch (Exception e) {
|
||||
Log.e(TAG, "Error registering plugin barcode_scan2, de.mintware.barcode_scan.BarcodeScanPlugin", e);
|
||||
}
|
||||
try {
|
||||
flutterEngine.getPlugins().add(new com.microsoft.clarity.ClarityFlutterPlugin());
|
||||
} catch (Exception e) {
|
||||
Log.e(TAG, "Error registering plugin clarity_flutter, com.microsoft.clarity.ClarityFlutterPlugin", e);
|
||||
}
|
||||
try {
|
||||
flutterEngine.getPlugins().add(new dev.fluttercommunity.plus.connectivity.ConnectivityPlugin());
|
||||
} catch (Exception e) {
|
||||
Log.e(TAG, "Error registering plugin connectivity_plus, dev.fluttercommunity.plus.connectivity.ConnectivityPlugin", e);
|
||||
}
|
||||
try {
|
||||
flutterEngine.getPlugins().add(new com.builttoroam.devicecalendar.DeviceCalendarPlugin());
|
||||
} catch (Exception e) {
|
||||
Log.e(TAG, "Error registering plugin device_calendar, com.builttoroam.devicecalendar.DeviceCalendarPlugin", e);
|
||||
}
|
||||
try {
|
||||
flutterEngine.getPlugins().add(new to.bullet.device_calendar_plus_android.DeviceCalendarPlusAndroidPlugin());
|
||||
} catch (Exception e) {
|
||||
Log.e(TAG, "Error registering plugin device_calendar_plus_android, to.bullet.device_calendar_plus_android.DeviceCalendarPlusAndroidPlugin", e);
|
||||
}
|
||||
try {
|
||||
flutterEngine.getPlugins().add(new dev.fluttercommunity.plus.device_info.DeviceInfoPlusPlugin());
|
||||
} catch (Exception e) {
|
||||
Log.e(TAG, "Error registering plugin device_info_plus, dev.fluttercommunity.plus.device_info.DeviceInfoPlusPlugin", e);
|
||||
}
|
||||
try {
|
||||
flutterEngine.getPlugins().add(new com.mr.flutter.plugin.filepicker.FilePickerPlugin());
|
||||
} catch (Exception e) {
|
||||
Log.e(TAG, "Error registering plugin file_picker, com.mr.flutter.plugin.filepicker.FilePickerPlugin", e);
|
||||
}
|
||||
try {
|
||||
flutterEngine.getPlugins().add(new io.flutter.plugins.firebase.analytics.FlutterFirebaseAnalyticsPlugin());
|
||||
} catch (Exception e) {
|
||||
Log.e(TAG, "Error registering plugin firebase_analytics, io.flutter.plugins.firebase.analytics.FlutterFirebaseAnalyticsPlugin", e);
|
||||
}
|
||||
try {
|
||||
flutterEngine.getPlugins().add(new io.flutter.plugins.firebase.core.FlutterFirebaseCorePlugin());
|
||||
} catch (Exception e) {
|
||||
Log.e(TAG, "Error registering plugin firebase_core, io.flutter.plugins.firebase.core.FlutterFirebaseCorePlugin", e);
|
||||
}
|
||||
try {
|
||||
flutterEngine.getPlugins().add(new io.flutter.plugins.firebase.crashlytics.FlutterFirebaseCrashlyticsPlugin());
|
||||
} catch (Exception e) {
|
||||
Log.e(TAG, "Error registering plugin firebase_crashlytics, io.flutter.plugins.firebase.crashlytics.FlutterFirebaseCrashlyticsPlugin", e);
|
||||
}
|
||||
try {
|
||||
flutterEngine.getPlugins().add(new io.flutter.plugins.firebase.messaging.FlutterFirebaseMessagingPlugin());
|
||||
} catch (Exception e) {
|
||||
Log.e(TAG, "Error registering plugin firebase_messaging, io.flutter.plugins.firebase.messaging.FlutterFirebaseMessagingPlugin", e);
|
||||
}
|
||||
try {
|
||||
flutterEngine.getPlugins().add(new com.amazon.flutter_amazonpaymentservices.FlutterAmazonpaymentservicesPlugin());
|
||||
} catch (Exception e) {
|
||||
Log.e(TAG, "Error registering plugin flutter_amazonpaymentservices, com.amazon.flutter_amazonpaymentservices.FlutterAmazonpaymentservicesPlugin", e);
|
||||
}
|
||||
try {
|
||||
flutterEngine.getPlugins().add(new com.hiennv.flutter_callkit_incoming.FlutterCallkitIncomingPlugin());
|
||||
} catch (Exception e) {
|
||||
Log.e(TAG, "Error registering plugin flutter_callkit_incoming, com.hiennv.flutter_callkit_incoming.FlutterCallkitIncomingPlugin", e);
|
||||
}
|
||||
try {
|
||||
flutterEngine.getPlugins().add(new com.fluttercandies.flutter_image_compress.ImageCompressPlugin());
|
||||
} catch (Exception e) {
|
||||
Log.e(TAG, "Error registering plugin flutter_image_compress_common, com.fluttercandies.flutter_image_compress.ImageCompressPlugin", e);
|
||||
}
|
||||
try {
|
||||
flutterEngine.getPlugins().add(new com.pichillilorenzo.flutter_inappwebview_android.InAppWebViewFlutterPlugin());
|
||||
} catch (Exception e) {
|
||||
Log.e(TAG, "Error registering plugin flutter_inappwebview_android, com.pichillilorenzo.flutter_inappwebview_android.InAppWebViewFlutterPlugin", e);
|
||||
}
|
||||
try {
|
||||
flutterEngine.getPlugins().add(new com.dexterous.flutterlocalnotifications.FlutterLocalNotificationsPlugin());
|
||||
} catch (Exception e) {
|
||||
Log.e(TAG, "Error registering plugin flutter_local_notifications, com.dexterous.flutterlocalnotifications.FlutterLocalNotificationsPlugin", e);
|
||||
}
|
||||
try {
|
||||
flutterEngine.getPlugins().add(new im.nfc.flutter_nfc_kit.FlutterNfcKitPlugin());
|
||||
} catch (Exception e) {
|
||||
Log.e(TAG, "Error registering plugin flutter_nfc_kit, im.nfc.flutter_nfc_kit.FlutterNfcKitPlugin", e);
|
||||
}
|
||||
try {
|
||||
flutterEngine.getPlugins().add(new com.paymentsdk.flutter_paymentsdk_bridge.FlutterPaytabsBridgePlugin());
|
||||
} catch (Exception e) {
|
||||
Log.e(TAG, "Error registering plugin flutter_paytabs_bridge, com.paymentsdk.flutter_paymentsdk_bridge.FlutterPaytabsBridgePlugin", e);
|
||||
}
|
||||
try {
|
||||
flutterEngine.getPlugins().add(new io.flutter.plugins.flutter_plugin_android_lifecycle.FlutterAndroidLifecyclePlugin());
|
||||
} catch (Exception e) {
|
||||
Log.e(TAG, "Error registering plugin flutter_plugin_android_lifecycle, io.flutter.plugins.flutter_plugin_android_lifecycle.FlutterAndroidLifecyclePlugin", e);
|
||||
}
|
||||
try {
|
||||
flutterEngine.getPlugins().add(new com.flutter_screenshot_blocker.flutter_screenshot_blocker.FlutterScreenshotBlockerPlugin());
|
||||
} catch (Exception e) {
|
||||
Log.e(TAG, "Error registering plugin flutter_screenshot_blocker, com.flutter_screenshot_blocker.flutter_screenshot_blocker.FlutterScreenshotBlockerPlugin", e);
|
||||
}
|
||||
try {
|
||||
flutterEngine.getPlugins().add(new com.flutterzoom.videosdk.FlutterZoomVideoSdkPlugin());
|
||||
} catch (Exception e) {
|
||||
Log.e(TAG, "Error registering plugin flutter_zoom_videosdk, com.flutterzoom.videosdk.FlutterZoomVideoSdkPlugin", e);
|
||||
}
|
||||
try {
|
||||
flutterEngine.getPlugins().add(new io.github.ponnamkarthik.toast.fluttertoast.FlutterToastPlugin());
|
||||
} catch (Exception e) {
|
||||
Log.e(TAG, "Error registering plugin fluttertoast, io.github.ponnamkarthik.toast.fluttertoast.FlutterToastPlugin", e);
|
||||
}
|
||||
try {
|
||||
flutterEngine.getPlugins().add(new com.baseflow.geolocator.GeolocatorPlugin());
|
||||
} catch (Exception e) {
|
||||
Log.e(TAG, "Error registering plugin geolocator_android, com.baseflow.geolocator.GeolocatorPlugin", e);
|
||||
}
|
||||
try {
|
||||
flutterEngine.getPlugins().add(new com.github.simonpham.gms_check.GmsCheckPlugin());
|
||||
} catch (Exception e) {
|
||||
Log.e(TAG, "Error registering plugin gms_check, com.github.simonpham.gms_check.GmsCheckPlugin", e);
|
||||
}
|
||||
try {
|
||||
flutterEngine.getPlugins().add(new com.baseflow.googleapiavailability.GoogleApiAvailabilityPlugin());
|
||||
} catch (Exception e) {
|
||||
Log.e(TAG, "Error registering plugin google_api_availability_android, com.baseflow.googleapiavailability.GoogleApiAvailabilityPlugin", e);
|
||||
}
|
||||
try {
|
||||
flutterEngine.getPlugins().add(new io.flutter.plugins.googlemaps.GoogleMapsPlugin());
|
||||
} catch (Exception e) {
|
||||
Log.e(TAG, "Error registering plugin google_maps_flutter_android, io.flutter.plugins.googlemaps.GoogleMapsPlugin", e);
|
||||
}
|
||||
try {
|
||||
flutterEngine.getPlugins().add(new cachet.plugins.health.HealthPlugin());
|
||||
} catch (Exception e) {
|
||||
Log.e(TAG, "Error registering plugin health, cachet.plugins.health.HealthPlugin", e);
|
||||
}
|
||||
try {
|
||||
flutterEngine.getPlugins().add(new com.huawei.hms.flutter.health.HuaweiHealthPlugin());
|
||||
} catch (Exception e) {
|
||||
Log.e(TAG, "Error registering plugin huawei_health, com.huawei.hms.flutter.health.HuaweiHealthPlugin", e);
|
||||
}
|
||||
try {
|
||||
flutterEngine.getPlugins().add(new com.huawei.hms.flutter.location.LocationPlugin());
|
||||
} catch (Exception e) {
|
||||
Log.e(TAG, "Error registering plugin huawei_location, com.huawei.hms.flutter.location.LocationPlugin", e);
|
||||
}
|
||||
try {
|
||||
flutterEngine.getPlugins().add(new com.huawei.hms.flutter.map.HmsMap());
|
||||
} catch (Exception e) {
|
||||
Log.e(TAG, "Error registering plugin huawei_map, com.huawei.hms.flutter.map.HmsMap", e);
|
||||
}
|
||||
try {
|
||||
flutterEngine.getPlugins().add(new io.flutter.plugins.imagepicker.ImagePickerPlugin());
|
||||
} catch (Exception e) {
|
||||
Log.e(TAG, "Error registering plugin image_picker_android, io.flutter.plugins.imagepicker.ImagePickerPlugin", e);
|
||||
}
|
||||
try {
|
||||
flutterEngine.getPlugins().add(new dev.britannio.in_app_review.InAppReviewPlugin());
|
||||
} catch (Exception e) {
|
||||
Log.e(TAG, "Error registering plugin in_app_review, dev.britannio.in_app_review.InAppReviewPlugin", e);
|
||||
}
|
||||
try {
|
||||
flutterEngine.getPlugins().add(new de.ffuf.in_app_update.InAppUpdatePlugin());
|
||||
} catch (Exception e) {
|
||||
Log.e(TAG, "Error registering plugin in_app_update, de.ffuf.in_app_update.InAppUpdatePlugin", e);
|
||||
}
|
||||
try {
|
||||
flutterEngine.getPlugins().add(new com.ryanheise.just_audio.JustAudioPlugin());
|
||||
} catch (Exception e) {
|
||||
Log.e(TAG, "Error registering plugin just_audio, com.ryanheise.just_audio.JustAudioPlugin", e);
|
||||
}
|
||||
try {
|
||||
flutterEngine.getPlugins().add(new com.istornz.live_activities.LiveActivitiesPlugin());
|
||||
} catch (Exception e) {
|
||||
Log.e(TAG, "Error registering plugin live_activities, com.istornz.live_activities.LiveActivitiesPlugin", e);
|
||||
}
|
||||
try {
|
||||
flutterEngine.getPlugins().add(new io.flutter.plugins.localauth.LocalAuthPlugin());
|
||||
} catch (Exception e) {
|
||||
Log.e(TAG, "Error registering plugin local_auth_android, io.flutter.plugins.localauth.LocalAuthPlugin", e);
|
||||
}
|
||||
try {
|
||||
flutterEngine.getPlugins().add(new com.lyokone.location.LocationPlugin());
|
||||
} catch (Exception e) {
|
||||
Log.e(TAG, "Error registering plugin location, com.lyokone.location.LocationPlugin", e);
|
||||
}
|
||||
try {
|
||||
flutterEngine.getPlugins().add(new com.fantastic.manage_calendar_events.ManageCalendarEventsPlugin());
|
||||
} catch (Exception e) {
|
||||
Log.e(TAG, "Error registering plugin manage_calendar_events, com.fantastic.manage_calendar_events.ManageCalendarEventsPlugin", e);
|
||||
}
|
||||
try {
|
||||
flutterEngine.getPlugins().add(new dev.fluttered.map_launcher.MapLauncherPlugin());
|
||||
} catch (Exception e) {
|
||||
Log.e(TAG, "Error registering plugin map_launcher, dev.fluttered.map_launcher.MapLauncherPlugin", e);
|
||||
}
|
||||
try {
|
||||
flutterEngine.getPlugins().add(new dev.fluttercommunity.plus.network_info.NetworkInfoPlusPlugin());
|
||||
} catch (Exception e) {
|
||||
Log.e(TAG, "Error registering plugin network_info_plus, dev.fluttercommunity.plus.network_info.NetworkInfoPlusPlugin", e);
|
||||
}
|
||||
try {
|
||||
flutterEngine.getPlugins().add(new com.crazecoder.openfile.OpenFilePlugin());
|
||||
} catch (Exception e) {
|
||||
Log.e(TAG, "Error registering plugin open_filex, com.crazecoder.openfile.OpenFilePlugin", e);
|
||||
}
|
||||
try {
|
||||
flutterEngine.getPlugins().add(new dev.fluttercommunity.plus.packageinfo.PackageInfoPlugin());
|
||||
} catch (Exception e) {
|
||||
Log.e(TAG, "Error registering plugin package_info_plus, dev.fluttercommunity.plus.packageinfo.PackageInfoPlugin", e);
|
||||
}
|
||||
try {
|
||||
flutterEngine.getPlugins().add(new io.flutter.plugins.pathprovider.PathProviderPlugin());
|
||||
} catch (Exception e) {
|
||||
Log.e(TAG, "Error registering plugin path_provider_android, io.flutter.plugins.pathprovider.PathProviderPlugin", e);
|
||||
}
|
||||
try {
|
||||
flutterEngine.getPlugins().add(new com.baseflow.permissionhandler.PermissionHandlerPlugin());
|
||||
} catch (Exception e) {
|
||||
Log.e(TAG, "Error registering plugin permission_handler_android, com.baseflow.permissionhandler.PermissionHandlerPlugin", e);
|
||||
}
|
||||
try {
|
||||
flutterEngine.getPlugins().add(new com.aaassseee.screen_brightness_android.ScreenBrightnessAndroidPlugin());
|
||||
} catch (Exception e) {
|
||||
Log.e(TAG, "Error registering plugin screen_brightness_android, com.aaassseee.screen_brightness_android.ScreenBrightnessAndroidPlugin", e);
|
||||
}
|
||||
try {
|
||||
flutterEngine.getPlugins().add(new dev.fluttercommunity.plus.share.SharePlusPlugin());
|
||||
} catch (Exception e) {
|
||||
Log.e(TAG, "Error registering plugin share_plus, dev.fluttercommunity.plus.share.SharePlusPlugin", e);
|
||||
}
|
||||
try {
|
||||
flutterEngine.getPlugins().add(new io.flutter.plugins.sharedpreferences.SharedPreferencesPlugin());
|
||||
} catch (Exception e) {
|
||||
Log.e(TAG, "Error registering plugin shared_preferences_android, io.flutter.plugins.sharedpreferences.SharedPreferencesPlugin", e);
|
||||
}
|
||||
try {
|
||||
flutterEngine.getPlugins().add(new com.oohyugi.sms_otp_auto_verify.SmsOtpAutoVerifyPlugin());
|
||||
} catch (Exception e) {
|
||||
Log.e(TAG, "Error registering plugin sms_otp_auto_verify, com.oohyugi.sms_otp_auto_verify.SmsOtpAutoVerifyPlugin", e);
|
||||
}
|
||||
try {
|
||||
flutterEngine.getPlugins().add(new com.tekartik.sqflite.SqflitePlugin());
|
||||
} catch (Exception e) {
|
||||
Log.e(TAG, "Error registering plugin sqflite_android, com.tekartik.sqflite.SqflitePlugin", e);
|
||||
}
|
||||
try {
|
||||
flutterEngine.getPlugins().add(new io.flutter.plugins.urllauncher.UrlLauncherPlugin());
|
||||
} catch (Exception e) {
|
||||
Log.e(TAG, "Error registering plugin url_launcher_android, io.flutter.plugins.urllauncher.UrlLauncherPlugin", e);
|
||||
}
|
||||
try {
|
||||
flutterEngine.getPlugins().add(new io.flutter.plugins.videoplayer.VideoPlayerPlugin());
|
||||
} catch (Exception e) {
|
||||
Log.e(TAG, "Error registering plugin video_player_android, io.flutter.plugins.videoplayer.VideoPlayerPlugin", e);
|
||||
}
|
||||
try {
|
||||
flutterEngine.getPlugins().add(new dev.fluttercommunity.plus.wakelock.WakelockPlusPlugin());
|
||||
} catch (Exception e) {
|
||||
Log.e(TAG, "Error registering plugin wakelock_plus, dev.fluttercommunity.plus.wakelock.WakelockPlusPlugin", e);
|
||||
}
|
||||
try {
|
||||
flutterEngine.getPlugins().add(new io.flutter.plugins.webviewflutter.WebViewFlutterPlugin());
|
||||
} catch (Exception e) {
|
||||
Log.e(TAG, "Error registering plugin webview_flutter_android, io.flutter.plugins.webviewflutter.WebViewFlutterPlugin", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,135 @@
|
||||
package com.cloudsolutions.HMGPatientApp
|
||||
|
||||
import android.app.Activity
|
||||
import android.app.Notification
|
||||
import android.app.NotificationChannel
|
||||
import android.app.NotificationManager
|
||||
import android.app.PendingIntent
|
||||
import android.content.Context
|
||||
import android.content. Intent
|
||||
import android.content.pm.PackageManager
|
||||
import android.content.res.ColorStateList
|
||||
import android.graphics.Color
|
||||
import android.os.Build
|
||||
import android.util.Log
|
||||
import android.widget.RemoteViews
|
||||
import androidx.annotation.RequiresApi
|
||||
import androidx.core.app.ActivityCompat
|
||||
import androidx.core.app.NotificationCompat
|
||||
import androidx.core.content.ContextCompat
|
||||
import androidx.core.graphics.drawable.IconCompat
|
||||
import com.example.live_activities.LiveActivityManager
|
||||
import com.cloudsolutions.HMGPatientApp.MainActivity
|
||||
import com.cloudsolutions.HMGPatientApp.R
|
||||
|
||||
class CustomLiveActivityManager(context: Context) :
|
||||
LiveActivityManager(context) {
|
||||
private val context: Context = context.applicationContext
|
||||
|
||||
private val pendingIntent = PendingIntent.getActivity(
|
||||
context, 200, Intent(context, MainActivity::class.java).apply {
|
||||
flags = Intent.FLAG_ACTIVITY_REORDER_TO_FRONT
|
||||
}, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
|
||||
)
|
||||
|
||||
private val remoteViews = RemoteViews(
|
||||
context. packageName, R.layout.live_activity
|
||||
)
|
||||
|
||||
private val collapesView = RemoteViews(
|
||||
context.packageName, R.layout.live_activity_collapsed
|
||||
)
|
||||
|
||||
private suspend fun updateRemoteViews(data: Map<String, Any>) {
|
||||
Log.d("updateRemoteViews", "current ticket is ${data["queueNo"] as? String ?: ""}")
|
||||
Log.d("updateRemoteViews", "remoteViews is $remoteViews")
|
||||
val progress = when (data["callType"] as? Int) {
|
||||
0 -> 33
|
||||
1 -> 66
|
||||
2 ->99
|
||||
else -> 99}
|
||||
|
||||
val (nextStepButtonBackground, textColor, containerBackground) = when (data["callType"] as? Int) {
|
||||
0 -> Triple(R.drawable.grey_rounded_corner_widget, R.color.text_color, R.drawable.whitebg_yellow_border_rounded_corner_widget)
|
||||
1 -> Triple(R.drawable.dark_red_rounded_corner_widget, R.color.colorWhite, R.drawable.whitebg_red_border_rounded_corner_widget)
|
||||
2 -> Triple(R.drawable.green_rounded_corner_widget, R. color.colorWhite, R. drawable.whitebg_green_border_rounded_corner_widget)
|
||||
else -> Triple(R. drawable.grey_rounded_corner_widget, R.color.text_color, R.drawable.whitebg_yellow_border_rounded_corner_widget)
|
||||
}
|
||||
|
||||
|
||||
|
||||
remoteViews.setInt(R.id.status_container, "setBackgroundResource", nextStepButtonBackground)
|
||||
remoteViews.setInt(R.id.role_badge, "setBackgroundResource", nextStepButtonBackground)
|
||||
// remoteViews.setInt(R.id.container, "setBackgroundResource", containerBackground)
|
||||
remoteViews.setTextColor(R.id.status_text, ContextCompat.getColor(context, textColor))
|
||||
remoteViews.setTextColor(R.id.currentServingStatus, ContextCompat.getColor(context, textColor))
|
||||
remoteViews.setProgressBar(R.id.progress_bar,1, progress, true)
|
||||
|
||||
remoteViews.setProgressTintList(
|
||||
R.id.progress_bar,
|
||||
"setProgressTintList",
|
||||
ColorStateList.valueOf(nextStepButtonBackground) // your desired color
|
||||
);
|
||||
|
||||
remoteViews.setTextViewText(R.id.queue_number, data["queueNo"] as? String ?: "")
|
||||
remoteViews.setTextViewText(R.id.currentServingStatus, data["currentlyServingStatus"] as? String ?: "")
|
||||
remoteViews.setTextViewText(R. id.serving_number, data["currentlyServingToken"] as? String ?: "")
|
||||
remoteViews.setTextViewText(R.id.status_text, data["nextTicketStatus"] as? String ?: "")
|
||||
remoteViews.setTextViewText(R.id.queue_label, data["yourTicketHeader"] as? String ?: "")
|
||||
remoteViews.setTextViewText(R.id.serving_label, data["currentlyServingTitle"] as? String ?: "")
|
||||
|
||||
// Hide serving_layout if currentlyServingToken is empty
|
||||
val currentlyServingToken = data["currentlyServingToken"] as? String ?: ""
|
||||
if (currentlyServingToken.isEmpty()) {
|
||||
remoteViews.setViewVisibility(R.id.serving_layout, android.view.View.GONE)
|
||||
} else {
|
||||
remoteViews.setViewVisibility(R.id.serving_layout, android.view.View.VISIBLE)
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
private suspend fun updateCollapsedView(data: Map<String, Any>) {
|
||||
Log.d("updateCollapsedView", "current ticket is ${data["queueNo"] as? String ?: ""}")
|
||||
Log.d("updateCollapsedView", "remoteViews is $collapesView")
|
||||
|
||||
collapesView.setTextViewText(R.id.queue_number, data["queueNo"] as? String ?: "")
|
||||
remoteViews.setTextViewText(R.id.queue_label, data["yourTicketHeader"] as? String ?: "")
|
||||
}
|
||||
|
||||
override suspend fun buildNotification(
|
||||
notification: Notification.Builder,
|
||||
event: String,
|
||||
data: Map<String, Any>
|
||||
): Notification {
|
||||
// val notificationManager =
|
||||
// context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
|
||||
// if (notificationManager != null) {
|
||||
// notificationManager.cancelAll();
|
||||
// }
|
||||
|
||||
collapesView.apply {
|
||||
updateCollapsedView(data)
|
||||
}
|
||||
remoteViews.apply {
|
||||
updateRemoteViews(data)
|
||||
}
|
||||
Log.d("buildNotification", "Building notification for event: $event with data: $data")
|
||||
Log.d("buildNotification", "Building notification for collapesView: $collapesView with remoteViews: $remoteViews")
|
||||
|
||||
return notification
|
||||
.setSmallIcon(R.drawable.hmg)
|
||||
.setContentTitle(data["title"] as? String ?: "Patient Queue")
|
||||
.setContentIntent(pendingIntent)
|
||||
.setContentText(data["content"] as? String ?: "Patient Queues")
|
||||
.setStyle(Notification.DecoratedCustomViewStyle())
|
||||
.setCustomContentView(collapesView)
|
||||
.setCustomBigContentView(remoteViews)
|
||||
.setPriority(Notification.PRIORITY_HIGH)
|
||||
.setCategory(Notification.CATEGORY_EVENT)
|
||||
.setVisibility(Notification.VISIBILITY_PUBLIC)
|
||||
.setOngoing(true)
|
||||
|
||||
.build()
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,11 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<shape xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:shape="rectangle">
|
||||
|
||||
<!-- Set the background color -->
|
||||
<solid android:color="@color/red_color_text" />
|
||||
|
||||
<!-- Set the corner radius -->
|
||||
<corners android:radius="@dimen/_4sdp" />
|
||||
|
||||
</shape>
|
||||
@ -0,0 +1,11 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<shape xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:shape="rectangle">
|
||||
|
||||
<!-- Set the background color -->
|
||||
<solid android:color="@color/success_color" />
|
||||
|
||||
<!-- Set the corner radius -->
|
||||
<corners android:radius="@dimen/_4sdp" />
|
||||
|
||||
</shape>
|
||||
@ -0,0 +1,11 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<shape xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:shape="rectangle">
|
||||
|
||||
<!-- Set the background color -->
|
||||
<solid android:color="@color/inactive_color" />
|
||||
|
||||
<!-- Set the corner radius -->
|
||||
<corners android:radius="@dimen/_4sdp" />
|
||||
|
||||
</shape>
|
||||
@ -0,0 +1,9 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="34dp" android:viewportHeight="14" android:viewportWidth="14" android:width="34dp">
|
||||
|
||||
<path android:fillColor="#0B85F7" android:pathData="M3,0L11,0A3,3 0,0 1,14 3L14,11A3,3 0,0 1,11 14L3,14A3,3 0,0 1,0 11L0,3A3,3 0,0 1,3 0z"/>
|
||||
|
||||
<path android:fillColor="#ffffff" android:pathData="M2.548,11.447C2.548,11.447 2.985,11.444 3.292,11.444L5.624,11.455C5.903,11.455 6.134,11.163 6.147,10.742L6.15,8.822C6.15,8.413 6.336,8.093 6.624,8.074L7.339,8.069C7.627,8.086 7.825,8.41 7.825,8.817L7.823,10.747C7.836,11.168 8.03,11.443 8.31,11.443L11.449,11.452L11.455,9.079C11.455,8.671 11.255,8.354 10.965,8.335L9.704,8.329C9.425,8.329 9.206,8.039 9.194,7.617L9.189,6.976C9.203,6.554 9.423,6.265 9.703,6.265L10.971,6.269C11.259,6.25 11.446,5.915 11.446,5.508L11.45,2.546C11.346,2.713 11.204,2.854 11.036,2.958C10.867,3.062 10.676,3.126 10.478,3.144L8.346,3.142C8.068,3.142 7.836,3.441 7.823,3.862L7.823,5.764C7.81,6.184 7.592,6.481 7.313,6.481L6.668,6.476C6.388,6.476 6.164,6.189 6.152,5.77L6.153,3.847C6.141,3.426 5.919,3.143 5.64,3.143L2.546,3.145L2.546,5.51C2.546,5.919 2.739,6.246 3.028,6.265L4.296,6.259C4.583,6.278 4.786,6.615 4.786,7.021L4.782,7.569C4.782,7.977 4.586,8.304 4.298,8.322L3.028,8.319C2.739,8.339 2.545,8.661 2.545,9.069L2.548,11.447Z"/>
|
||||
|
||||
<path android:fillColor="#ffffff" android:pathData="M2.548,11.447C2.548,11.447 2.985,11.444 3.292,11.444L5.624,11.455C5.903,11.455 6.134,11.163 6.147,10.742L6.15,8.822C6.15,8.413 6.336,8.093 6.624,8.074L7.339,8.069C7.627,8.086 7.825,8.41 7.825,8.817L7.823,10.747C7.836,11.168 8.03,11.443 8.31,11.443L11.449,11.452L11.455,9.079C11.455,8.671 11.255,8.354 10.965,8.335L9.704,8.329C9.425,8.329 9.206,8.039 9.194,7.617L9.189,6.976C9.203,6.554 9.423,6.265 9.703,6.265L10.971,6.269C11.259,6.25 11.446,5.915 11.446,5.508L11.45,2.546C11.346,2.713 11.204,2.854 11.036,2.958C10.867,3.062 10.676,3.126 10.478,3.144L8.346,3.142C8.068,3.142 7.836,3.441 7.823,3.862L7.823,5.764C7.81,6.184 7.592,6.481 7.313,6.481L6.668,6.476C6.388,6.476 6.164,6.189 6.152,5.77L6.153,3.847C6.141,3.426 5.919,3.143 5.64,3.143L2.546,3.145L2.546,5.51C2.546,5.919 2.739,6.246 3.028,6.265L4.296,6.259C4.583,6.278 4.786,6.615 4.786,7.021L4.782,7.569C4.782,7.977 4.586,8.304 4.298,8.322L3.028,8.319C2.739,8.339 2.545,8.661 2.545,9.069L2.548,11.447Z"/>
|
||||
|
||||
</vector>
|
||||
@ -0,0 +1,9 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" android:viewportHeight="14" android:viewportWidth="14" android:width="24dp">
|
||||
|
||||
<path android:fillColor="#ED1C2B" android:pathData="M3,0L11,0A3,3 0,0 1,14 3L14,11A3,3 0,0 1,11 14L3,14A3,3 0,0 1,0 11L0,3A3,3 0,0 1,3 0z"/>
|
||||
|
||||
<path android:fillColor="#ffffff" android:pathData="M2.548,11.447C2.548,11.447 2.985,11.444 3.292,11.444L5.624,11.455C5.903,11.455 6.134,11.163 6.147,10.742L6.15,8.822C6.15,8.413 6.336,8.093 6.624,8.074L7.339,8.069C7.627,8.086 7.825,8.41 7.825,8.817L7.823,10.747C7.836,11.168 8.03,11.443 8.31,11.443L11.449,11.452L11.455,9.079C11.455,8.671 11.255,8.354 10.965,8.335L9.704,8.329C9.425,8.329 9.206,8.039 9.194,7.617L9.189,6.976C9.203,6.554 9.423,6.265 9.703,6.265L10.971,6.269C11.259,6.25 11.446,5.915 11.446,5.508L11.45,2.546C11.346,2.713 11.204,2.854 11.036,2.958C10.867,3.062 10.676,3.126 10.478,3.144L8.346,3.142C8.068,3.142 7.836,3.441 7.823,3.862L7.823,5.764C7.81,6.184 7.592,6.481 7.313,6.481L6.668,6.476C6.388,6.476 6.164,6.189 6.152,5.77L6.153,3.847C6.141,3.426 5.919,3.143 5.64,3.143L2.546,3.145L2.546,5.51C2.546,5.919 2.739,6.246 3.028,6.265L4.296,6.259C4.583,6.278 4.786,6.615 4.786,7.021L4.782,7.569C4.782,7.977 4.586,8.304 4.298,8.322L3.028,8.319C2.739,8.339 2.545,8.661 2.545,9.069L2.548,11.447Z"/>
|
||||
|
||||
<path android:fillColor="#ffffff" android:pathData="M2.548,11.447C2.548,11.447 2.985,11.444 3.292,11.444L5.624,11.455C5.903,11.455 6.134,11.163 6.147,10.742L6.15,8.822C6.15,8.413 6.336,8.093 6.624,8.074L7.339,8.069C7.627,8.086 7.825,8.41 7.825,8.817L7.823,10.747C7.836,11.168 8.03,11.443 8.31,11.443L11.449,11.452L11.455,9.079C11.455,8.671 11.255,8.354 10.965,8.335L9.704,8.329C9.425,8.329 9.206,8.039 9.194,7.617L9.189,6.976C9.203,6.554 9.423,6.265 9.703,6.265L10.971,6.269C11.259,6.25 11.446,5.915 11.446,5.508L11.45,2.546C11.346,2.713 11.204,2.854 11.036,2.958C10.867,3.062 10.676,3.126 10.478,3.144L8.346,3.142C8.068,3.142 7.836,3.441 7.823,3.862L7.823,5.764C7.81,6.184 7.592,6.481 7.313,6.481L6.668,6.476C6.388,6.476 6.164,6.189 6.152,5.77L6.153,3.847C6.141,3.426 5.919,3.143 5.64,3.143L2.546,3.145L2.546,5.51C2.546,5.919 2.739,6.246 3.028,6.265L4.296,6.259C4.583,6.278 4.786,6.615 4.786,7.021L4.782,7.569C4.782,7.977 4.586,8.304 4.298,8.322L3.028,8.319C2.739,8.339 2.545,8.661 2.545,9.069L2.548,11.447Z"/>
|
||||
|
||||
</vector>
|
||||
|
After Width: | Height: | Size: 855 B |
@ -0,0 +1,15 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="40dp"
|
||||
android:height="40dp"
|
||||
android:viewportWidth="40"
|
||||
android:viewportHeight="40">
|
||||
<path
|
||||
android:pathData="M8.333,31.667V36.667L31.667,36.667V31.667C31.667,25.223 26.444,20 20,20C13.557,20 8.333,25.223 8.333,31.667Z"
|
||||
android:strokeAlpha="0.4"
|
||||
android:fillColor="#9C9C9C"
|
||||
android:fillAlpha="0.4"/>
|
||||
<path
|
||||
android:pathData="M6.667,2.084C5.976,2.084 5.417,2.644 5.417,3.334C5.417,4.024 5.976,4.584 6.667,4.584H7.083L7.083,8.334C7.083,13.481 10.094,17.925 14.449,20.001C10.094,22.077 7.083,26.521 7.083,31.667L7.083,35.417H6.667C5.976,35.417 5.417,35.977 5.417,36.667C5.417,37.358 5.976,37.917 6.667,37.917L33.333,37.917C34.023,37.917 34.583,37.358 34.583,36.667C34.583,35.977 34.023,35.417 33.333,35.417H32.917V31.667C32.917,26.521 29.906,22.077 25.55,20.001C29.906,17.925 32.917,13.481 32.917,8.334V4.584H33.333C34.023,4.584 34.583,4.024 34.583,3.334C34.583,2.644 34.023,2.084 33.333,2.084L6.667,2.084ZM30.417,4.584L9.583,4.584L9.583,8.334C9.583,14.087 14.247,18.751 20,18.751C25.753,18.751 30.417,14.087 30.417,8.334V4.584ZM30.417,35.417V31.667C30.417,25.914 25.753,21.251 20,21.251C14.247,21.251 9.583,25.914 9.583,31.667V35.417L30.417,35.417Z"
|
||||
android:fillColor="#2E3039"
|
||||
android:fillType="evenOdd"/>
|
||||
</vector>
|
||||
@ -0,0 +1,13 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="14dp"
|
||||
android:height="14dp"
|
||||
android:viewportWidth="14"
|
||||
android:viewportHeight="14">
|
||||
<path
|
||||
android:pathData="M5.25,8.895C5.388,8.895 5.518,8.96 5.6,9.07L7,10.937L8.4,9.07C8.483,8.96 8.612,8.895 8.75,8.895C9.278,8.895 9.724,8.895 10.067,8.926C10.421,8.958 10.73,9.026 11.011,9.188C11.343,9.38 11.619,9.656 11.811,9.989C11.973,10.27 12.041,10.579 12.073,10.932C12.104,11.276 12.104,11.701 12.104,12.229V12.833C12.104,13.074 11.908,13.27 11.667,13.27H2.333C2.092,13.27 1.896,13.074 1.896,12.833V12.229C1.896,11.701 1.896,11.276 1.927,10.932C1.959,10.579 2.027,10.27 2.189,9.989C2.381,9.656 2.657,9.38 2.99,9.188C3.27,9.026 3.58,8.958 3.933,8.926C4.276,8.895 4.723,8.895 5.25,8.895Z"
|
||||
android:fillColor="#18C273"/>
|
||||
<path
|
||||
android:pathData="M9.734,4.719L10.316,2.358C10.517,1.539 9.908,0.729 9.055,0.729H4.945C4.092,0.729 3.483,1.539 3.685,2.358L4.266,4.719V5.833C4.266,7.356 5.483,8.604 7,8.604C8.517,8.604 9.734,7.356 9.734,5.833V4.719ZM5.141,5.103H8.859V5.833C8.859,6.886 8.02,7.729 7,7.729C5.98,7.729 5.141,6.886 5.141,5.833V5.103ZM7,1.604C7.242,1.604 7.438,1.799 7.438,2.041V2.478H7.875C8.117,2.478 8.313,2.674 8.313,2.916C8.313,3.158 8.117,3.353 7.875,3.353H7.438V3.791C7.438,4.033 7.242,4.229 7,4.229C6.758,4.229 6.563,4.033 6.563,3.791V3.353H6.125C5.884,3.353 5.688,3.158 5.688,2.916C5.688,2.674 5.884,2.478 6.125,2.478H6.563V2.041C6.563,1.799 6.758,1.604 7,1.604Z"
|
||||
android:fillColor="#18C273"
|
||||
android:fillType="evenOdd"/>
|
||||
</vector>
|
||||
@ -0,0 +1,21 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<!-- Background -->
|
||||
<item
|
||||
android:id="@android:id/background">
|
||||
<shape android:shape="rectangle">
|
||||
<solid android:color="#E8E8E8" />
|
||||
<corners android:radius="3dp" />
|
||||
</shape>
|
||||
</item>
|
||||
<!-- Progress -->
|
||||
<item
|
||||
android:id="@android:id/progress">
|
||||
<clip>
|
||||
<shape android:shape="rectangle">
|
||||
<solid android:color="#18C273" />
|
||||
<corners android:radius="3dp" />
|
||||
</shape>
|
||||
</clip>
|
||||
</item>
|
||||
</layer-list>
|
||||
@ -0,0 +1,11 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<shape xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:shape="oval">
|
||||
<solid android:color="#00BFA5" />
|
||||
<size
|
||||
android:width="16dp"
|
||||
android:height="16dp" />
|
||||
<stroke
|
||||
android:color="#FFFFFF"
|
||||
android:width="2dp" />
|
||||
</shape>
|
||||
@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<shape xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:shape="rectangle">
|
||||
<solid android:color="#FFFFFF" />
|
||||
<corners android:radius="24dp" />
|
||||
</shape>
|
||||
@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<shape xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:shape="rectangle">
|
||||
<solid android:color="#FFFFFF" />
|
||||
<corners android:radius="8dp" />
|
||||
</shape>
|
||||
@ -0,0 +1,11 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<shape xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:shape="rectangle">
|
||||
|
||||
<!-- Set the background color -->
|
||||
<solid android:color="#1AED1C2B" />
|
||||
|
||||
<!-- Set the corner radius -->
|
||||
<corners android:radius="@dimen/_4sdp" />
|
||||
|
||||
</shape>
|
||||
@ -0,0 +1,11 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="20dp"
|
||||
android:height="20dp"
|
||||
android:viewportWidth="13"
|
||||
android:viewportHeight="13">
|
||||
<path
|
||||
android:pathData="M6.5,6.5m-5.5,0a5.5,5.5 0,1 1,11 0a5.5,5.5 0,1 1,-11 0"
|
||||
android:strokeWidth="2"
|
||||
android:fillColor="#18C273"
|
||||
android:strokeColor="#ffffff"/>
|
||||
</vector>
|
||||
@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<shape xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:shape="rectangle">
|
||||
<solid android:color="#1A18C273" />
|
||||
<corners android:radius="8dp" />
|
||||
</shape>
|
||||
@ -0,0 +1,13 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<shape xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:shape="rectangle">
|
||||
|
||||
<!-- Set the background color -->
|
||||
<solid android:color="#FFFF" />
|
||||
|
||||
<!-- Set the corner radius -->
|
||||
<corners android:radius="@dimen/_8sdp" />
|
||||
|
||||
<stroke android:width="@dimen/_2sdp" android:color="@color/success_color"/>
|
||||
|
||||
</shape>
|
||||
@ -0,0 +1,13 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<shape xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:shape="rectangle">
|
||||
|
||||
<!-- Set the background color -->
|
||||
<solid android:color="#FFFF" />
|
||||
|
||||
<!-- Set the corner radius -->
|
||||
<corners android:radius="@dimen/_8sdp" />
|
||||
|
||||
<stroke android:width="@dimen/_2sdp" android:color="@color/red_color_text"/>
|
||||
|
||||
</shape>
|
||||
@ -0,0 +1,13 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<shape xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:shape="rectangle">
|
||||
|
||||
<!-- Set the background color -->
|
||||
<solid android:color="#FFFF" />
|
||||
|
||||
<!-- Set the corner radius -->
|
||||
<corners android:radius="@dimen/_8sdp" />
|
||||
|
||||
<stroke android:width="@dimen/_2sdp" android:color="@color/yellow"/>
|
||||
|
||||
</shape>
|
||||
@ -0,0 +1,177 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:background="@drawable/queue_card_background"
|
||||
android:orientation="vertical"
|
||||
android:padding="24dp">
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_vertical"
|
||||
>
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="0dp"
|
||||
android:layout_weight=".7"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical">
|
||||
|
||||
|
||||
<TextView
|
||||
android:id="@+id/queue_label"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="You queue number"
|
||||
android:textColor="@color/queue_text_secondary"
|
||||
android:textSize="14sp"
|
||||
android:textStyle="normal" />
|
||||
|
||||
<!-- Queue Number: OB-212 -->
|
||||
<RelativeLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/queue_number"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_alignParentStart="true"
|
||||
android:text="OB-212"
|
||||
android:textColor="@color/queue_text_primary"
|
||||
android:textSize="32sp"
|
||||
android:textStyle="bold" />
|
||||
|
||||
|
||||
</RelativeLayout>
|
||||
</LinearLayout>
|
||||
<!-- Hourglass Icon -->
|
||||
<ImageView
|
||||
android:id="@+id/hourglass_icon"
|
||||
android:layout_width="48dp"
|
||||
android:layout_height="48dp"
|
||||
android:layout_alignParentEnd="true"
|
||||
android:scaleType="centerInside"
|
||||
android:src="@drawable/icon" />
|
||||
</LinearLayout>
|
||||
<!-- Status Message in green box -->
|
||||
<LinearLayout
|
||||
android:id="@+id/status_container"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="8dp"
|
||||
android:background="@drawable/status_box_background"
|
||||
android:gravity="center_vertical"
|
||||
android:orientation="horizontal"
|
||||
android:paddingStart="12dp"
|
||||
android:paddingTop="8dp"
|
||||
android:paddingEnd="12dp"
|
||||
android:paddingBottom="8dp">
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/status_icon"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:scaleType="centerInside"
|
||||
android:src="@drawable/profession" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/status_text"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="8dp"
|
||||
android:text="Please got to room no. 5 for vital signs"
|
||||
android:textColor="@color/queue_status_green"
|
||||
android:textSize="10sp" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<ProgressBar
|
||||
android:id="@+id/progress_bar"
|
||||
style="@android:style/Widget.ProgressBar.Horizontal"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="6dp"
|
||||
android:layout_marginTop="16dp"
|
||||
android:max="100"
|
||||
android:progress="33"
|
||||
android:progressDrawable="@drawable/progress_bar_drawable" />
|
||||
|
||||
<!-- Bottom Section: Current Serving and Role -->
|
||||
<LinearLayout
|
||||
android:id="@+id/serving_layout"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_marginTop="12dp"
|
||||
android:gravity="bottom|center_vertical"
|
||||
android:orientation="horizontal">
|
||||
|
||||
<!-- Current Serving -->
|
||||
<LinearLayout
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="1"
|
||||
android:gravity="start|center_vertical"
|
||||
android:orientation="horizontal">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/serving_label"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="Current Serving"
|
||||
android:textColor="@color/queue_text_secondary"
|
||||
android:textSize="14sp" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/serving_number"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="8dp"
|
||||
android:text="3731"
|
||||
android:textColor="@color/queue_text_primary"
|
||||
android:textSize="18sp"
|
||||
android:textStyle="bold" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<!-- Visiting Nurse Badge -->
|
||||
<LinearLayout
|
||||
android:id="@+id/role_badge"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:background="@drawable/status_box_background"
|
||||
android:gravity="center_vertical"
|
||||
android:orientation="horizontal"
|
||||
android:paddingStart="12dp"
|
||||
android:paddingTop="6dp"
|
||||
android:paddingEnd="12dp"
|
||||
android:paddingBottom="6dp">
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/role_icon"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:scaleType="centerInside"
|
||||
android:src="@drawable/profession" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/currentServingStatus"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="6dp"
|
||||
android:text="Visiting Nurse"
|
||||
android:textColor="@color/queue_status_green"
|
||||
android:textSize="10sp"
|
||||
android:textStyle="bold" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</FrameLayout>
|
||||
@ -0,0 +1,63 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
|
||||
android:background="@drawable/queue_card_background_low_radius">
|
||||
|
||||
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_vertical"
|
||||
android:padding="8dp"
|
||||
android:gravity="center"
|
||||
>
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="0dp"
|
||||
android:layout_weight=".7"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical">
|
||||
|
||||
|
||||
<TextView
|
||||
android:id="@+id/queue_label"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="You queue number"
|
||||
android:textColor="@color/queue_text_secondary"
|
||||
android:textSize="10sp"
|
||||
android:textStyle="normal" />
|
||||
|
||||
<!-- Queue Number: OB-212 -->
|
||||
<RelativeLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/queue_number"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_alignParentStart="true"
|
||||
android:text="OB-212"
|
||||
android:textColor="@color/queue_text_primary"
|
||||
android:textSize="22sp"
|
||||
android:textStyle="bold" />
|
||||
|
||||
|
||||
</RelativeLayout>
|
||||
</LinearLayout>
|
||||
<!-- Hourglass Icon -->
|
||||
<ImageView
|
||||
android:id="@+id/hourglass_icon"
|
||||
android:layout_width="24dp"
|
||||
android:layout_height="24dp"
|
||||
android:layout_alignParentEnd="true"
|
||||
android:scaleType="centerInside"
|
||||
android:src="@drawable/icon" />
|
||||
</LinearLayout>
|
||||
|
||||
|
||||
</FrameLayout>
|
||||
@ -0,0 +1,13 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<color name="red_color_text">#ED1C2B</color>
|
||||
<color name="yellow">#FFAF15</color>
|
||||
<color name="success_color">#18C273</color>
|
||||
<color name="inactive_color">#332E3039</color>
|
||||
<color name="text_color">#A2A2A2</color>
|
||||
<color name="colorWhite">#FFFF</color>
|
||||
<color name="queue_text_secondary">#8F9AA3</color>
|
||||
<color name="queue_text_primary">#2E3039</color>
|
||||
<color name="queue_status_green">#18C273</color>
|
||||
|
||||
</resources>
|
||||
@ -0,0 +1,160 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
##############################################################################
|
||||
##
|
||||
## Gradle start up script for UN*X
|
||||
##
|
||||
##############################################################################
|
||||
|
||||
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
||||
DEFAULT_JVM_OPTS=""
|
||||
|
||||
APP_NAME="Gradle"
|
||||
APP_BASE_NAME=`basename "$0"`
|
||||
|
||||
# Use the maximum available, or set MAX_FD != -1 to use that value.
|
||||
MAX_FD="maximum"
|
||||
|
||||
warn ( ) {
|
||||
echo "$*"
|
||||
}
|
||||
|
||||
die ( ) {
|
||||
echo
|
||||
echo "$*"
|
||||
echo
|
||||
exit 1
|
||||
}
|
||||
|
||||
# OS specific support (must be 'true' or 'false').
|
||||
cygwin=false
|
||||
msys=false
|
||||
darwin=false
|
||||
case "`uname`" in
|
||||
CYGWIN* )
|
||||
cygwin=true
|
||||
;;
|
||||
Darwin* )
|
||||
darwin=true
|
||||
;;
|
||||
MINGW* )
|
||||
msys=true
|
||||
;;
|
||||
esac
|
||||
|
||||
# Attempt to set APP_HOME
|
||||
# Resolve links: $0 may be a link
|
||||
PRG="$0"
|
||||
# Need this for relative symlinks.
|
||||
while [ -h "$PRG" ] ; do
|
||||
ls=`ls -ld "$PRG"`
|
||||
link=`expr "$ls" : '.*-> \(.*\)$'`
|
||||
if expr "$link" : '/.*' > /dev/null; then
|
||||
PRG="$link"
|
||||
else
|
||||
PRG=`dirname "$PRG"`"/$link"
|
||||
fi
|
||||
done
|
||||
SAVED="`pwd`"
|
||||
cd "`dirname \"$PRG\"`/" >/dev/null
|
||||
APP_HOME="`pwd -P`"
|
||||
cd "$SAVED" >/dev/null
|
||||
|
||||
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
|
||||
|
||||
# Determine the Java command to use to start the JVM.
|
||||
if [ -n "$JAVA_HOME" ] ; then
|
||||
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
|
||||
# IBM's JDK on AIX uses strange locations for the executables
|
||||
JAVACMD="$JAVA_HOME/jre/sh/java"
|
||||
else
|
||||
JAVACMD="$JAVA_HOME/bin/java"
|
||||
fi
|
||||
if [ ! -x "$JAVACMD" ] ; then
|
||||
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
|
||||
|
||||
Please set the JAVA_HOME variable in your environment to match the
|
||||
location of your Java installation."
|
||||
fi
|
||||
else
|
||||
JAVACMD="java"
|
||||
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
|
||||
|
||||
Please set the JAVA_HOME variable in your environment to match the
|
||||
location of your Java installation."
|
||||
fi
|
||||
|
||||
# Increase the maximum file descriptors if we can.
|
||||
if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
|
||||
MAX_FD_LIMIT=`ulimit -H -n`
|
||||
if [ $? -eq 0 ] ; then
|
||||
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
|
||||
MAX_FD="$MAX_FD_LIMIT"
|
||||
fi
|
||||
ulimit -n $MAX_FD
|
||||
if [ $? -ne 0 ] ; then
|
||||
warn "Could not set maximum file descriptor limit: $MAX_FD"
|
||||
fi
|
||||
else
|
||||
warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
|
||||
fi
|
||||
fi
|
||||
|
||||
# For Darwin, add options to specify how the application appears in the dock
|
||||
if $darwin; then
|
||||
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
|
||||
fi
|
||||
|
||||
# For Cygwin, switch paths to Windows format before running java
|
||||
if $cygwin ; then
|
||||
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
|
||||
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
|
||||
JAVACMD=`cygpath --unix "$JAVACMD"`
|
||||
|
||||
# We build the pattern for arguments to be converted via cygpath
|
||||
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
|
||||
SEP=""
|
||||
for dir in $ROOTDIRSRAW ; do
|
||||
ROOTDIRS="$ROOTDIRS$SEP$dir"
|
||||
SEP="|"
|
||||
done
|
||||
OURCYGPATTERN="(^($ROOTDIRS))"
|
||||
# Add a user-defined pattern to the cygpath arguments
|
||||
if [ "$GRADLE_CYGPATTERN" != "" ] ; then
|
||||
OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
|
||||
fi
|
||||
# Now convert the arguments - kludge to limit ourselves to /bin/sh
|
||||
i=0
|
||||
for arg in "$@" ; do
|
||||
CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
|
||||
CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
|
||||
|
||||
if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
|
||||
eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
|
||||
else
|
||||
eval `echo args$i`="\"$arg\""
|
||||
fi
|
||||
i=$((i+1))
|
||||
done
|
||||
case $i in
|
||||
(0) set -- ;;
|
||||
(1) set -- "$args0" ;;
|
||||
(2) set -- "$args0" "$args1" ;;
|
||||
(3) set -- "$args0" "$args1" "$args2" ;;
|
||||
(4) set -- "$args0" "$args1" "$args2" "$args3" ;;
|
||||
(5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
|
||||
(6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
|
||||
(7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
|
||||
(8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
|
||||
(9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
|
||||
esac
|
||||
fi
|
||||
|
||||
# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
|
||||
function splitJvmOpts() {
|
||||
JVM_OPTS=("$@")
|
||||
}
|
||||
eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
|
||||
JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
|
||||
|
||||
exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
|
||||
@ -0,0 +1,90 @@
|
||||
@if "%DEBUG%" == "" @echo off
|
||||
@rem ##########################################################################
|
||||
@rem
|
||||
@rem Gradle startup script for Windows
|
||||
@rem
|
||||
@rem ##########################################################################
|
||||
|
||||
@rem Set local scope for the variables with windows NT shell
|
||||
if "%OS%"=="Windows_NT" setlocal
|
||||
|
||||
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
||||
set DEFAULT_JVM_OPTS=
|
||||
|
||||
set DIRNAME=%~dp0
|
||||
if "%DIRNAME%" == "" set DIRNAME=.
|
||||
set APP_BASE_NAME=%~n0
|
||||
set APP_HOME=%DIRNAME%
|
||||
|
||||
@rem Find java.exe
|
||||
if defined JAVA_HOME goto findJavaFromJavaHome
|
||||
|
||||
set JAVA_EXE=java.exe
|
||||
%JAVA_EXE% -version >NUL 2>&1
|
||||
if "%ERRORLEVEL%" == "0" goto init
|
||||
|
||||
echo.
|
||||
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
|
||||
echo.
|
||||
echo Please set the JAVA_HOME variable in your environment to match the
|
||||
echo location of your Java installation.
|
||||
|
||||
goto fail
|
||||
|
||||
:findJavaFromJavaHome
|
||||
set JAVA_HOME=%JAVA_HOME:"=%
|
||||
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
|
||||
|
||||
if exist "%JAVA_EXE%" goto init
|
||||
|
||||
echo.
|
||||
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
|
||||
echo.
|
||||
echo Please set the JAVA_HOME variable in your environment to match the
|
||||
echo location of your Java installation.
|
||||
|
||||
goto fail
|
||||
|
||||
:init
|
||||
@rem Get command-line arguments, handling Windowz variants
|
||||
|
||||
if not "%OS%" == "Windows_NT" goto win9xME_args
|
||||
if "%@eval[2+2]" == "4" goto 4NT_args
|
||||
|
||||
:win9xME_args
|
||||
@rem Slurp the command line arguments.
|
||||
set CMD_LINE_ARGS=
|
||||
set _SKIP=2
|
||||
|
||||
:win9xME_args_slurp
|
||||
if "x%~1" == "x" goto execute
|
||||
|
||||
set CMD_LINE_ARGS=%*
|
||||
goto execute
|
||||
|
||||
:4NT_args
|
||||
@rem Get arguments from the 4NT Shell from JP Software
|
||||
set CMD_LINE_ARGS=%$
|
||||
|
||||
:execute
|
||||
@rem Setup the command line
|
||||
|
||||
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
|
||||
|
||||
@rem Execute Gradle
|
||||
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
|
||||
|
||||
:end
|
||||
@rem End local scope for the variables with windows NT shell
|
||||
if "%ERRORLEVEL%"=="0" goto mainEnd
|
||||
|
||||
:fail
|
||||
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
|
||||
rem the _cmd.exe /c_ return code!
|
||||
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
|
||||
exit /b 1
|
||||
|
||||
:mainEnd
|
||||
if "%OS%"=="Windows_NT" endlocal
|
||||
|
||||
:omega
|
||||
@ -0,0 +1,4 @@
|
||||
storePassword=HmGsa123
|
||||
keyPassword=HmGsa123
|
||||
keyAlias=hmg
|
||||
storeFile=key
|
||||
@ -0,0 +1,5 @@
|
||||
flutter.buildMode=debug
|
||||
flutter.sdk=/Users/cloud/sdk/flutter
|
||||
flutter.versionCode=38
|
||||
flutter.versionName=0.0.39
|
||||
sdk.dir=/Users/cloud/Library/Android/sdk
|
||||
@ -0,0 +1 @@
|
||||
this is a match
|
||||
@ -0,0 +1,677 @@
|
||||
PODS:
|
||||
- amazon_payfort (1.1.4):
|
||||
- Flutter
|
||||
- PayFortSDK
|
||||
- audio_session (0.0.1):
|
||||
- Flutter
|
||||
- barcode_scan2 (0.0.1):
|
||||
- Flutter
|
||||
- SwiftProtobuf (~> 1.33)
|
||||
- clarity_flutter (1.0.0):
|
||||
- Flutter
|
||||
- connectivity_plus (0.0.1):
|
||||
- Flutter
|
||||
- CryptoSwift (1.8.4)
|
||||
- device_calendar (0.0.1):
|
||||
- Flutter
|
||||
- device_calendar_plus_ios (0.0.1):
|
||||
- Flutter
|
||||
- device_info_plus (0.0.1):
|
||||
- Flutter
|
||||
- DKImagePickerController/Core (4.3.9):
|
||||
- DKImagePickerController/ImageDataManager
|
||||
- DKImagePickerController/Resource
|
||||
- DKImagePickerController/ImageDataManager (4.3.9)
|
||||
- DKImagePickerController/PhotoGallery (4.3.9):
|
||||
- DKImagePickerController/Core
|
||||
- DKPhotoGallery
|
||||
- DKImagePickerController/Resource (4.3.9)
|
||||
- DKPhotoGallery (0.0.19):
|
||||
- DKPhotoGallery/Core (= 0.0.19)
|
||||
- DKPhotoGallery/Model (= 0.0.19)
|
||||
- DKPhotoGallery/Preview (= 0.0.19)
|
||||
- DKPhotoGallery/Resource (= 0.0.19)
|
||||
- SDWebImage
|
||||
- SwiftyGif
|
||||
- DKPhotoGallery/Core (0.0.19):
|
||||
- DKPhotoGallery/Model
|
||||
- DKPhotoGallery/Preview
|
||||
- SDWebImage
|
||||
- SwiftyGif
|
||||
- DKPhotoGallery/Model (0.0.19):
|
||||
- SDWebImage
|
||||
- SwiftyGif
|
||||
- DKPhotoGallery/Preview (0.0.19):
|
||||
- DKPhotoGallery/Model
|
||||
- DKPhotoGallery/Resource
|
||||
- SDWebImage
|
||||
- SwiftyGif
|
||||
- DKPhotoGallery/Resource (0.0.19):
|
||||
- SDWebImage
|
||||
- SwiftyGif
|
||||
- file_picker (0.0.1):
|
||||
- DKImagePickerController/PhotoGallery
|
||||
- Flutter
|
||||
- Firebase/Analytics (11.15.0):
|
||||
- Firebase/Core
|
||||
- Firebase/Core (11.15.0):
|
||||
- Firebase/CoreOnly
|
||||
- FirebaseAnalytics (~> 11.15.0)
|
||||
- Firebase/CoreOnly (11.15.0):
|
||||
- FirebaseCore (~> 11.15.0)
|
||||
- Firebase/Crashlytics (11.15.0):
|
||||
- Firebase/CoreOnly
|
||||
- FirebaseCrashlytics (~> 11.15.0)
|
||||
- Firebase/Messaging (11.15.0):
|
||||
- Firebase/CoreOnly
|
||||
- FirebaseMessaging (~> 11.15.0)
|
||||
- firebase_analytics (11.6.0):
|
||||
- Firebase/Analytics (= 11.15.0)
|
||||
- firebase_core
|
||||
- Flutter
|
||||
- firebase_core (3.15.2):
|
||||
- Firebase/CoreOnly (= 11.15.0)
|
||||
- Flutter
|
||||
- firebase_crashlytics (4.3.10):
|
||||
- Firebase/Crashlytics (= 11.15.0)
|
||||
- firebase_core
|
||||
- Flutter
|
||||
- firebase_messaging (15.2.10):
|
||||
- Firebase/Messaging (= 11.15.0)
|
||||
- firebase_core
|
||||
- Flutter
|
||||
- FirebaseAnalytics (11.15.0):
|
||||
- FirebaseAnalytics/Default (= 11.15.0)
|
||||
- FirebaseCore (~> 11.15.0)
|
||||
- FirebaseInstallations (~> 11.0)
|
||||
- GoogleUtilities/AppDelegateSwizzler (~> 8.1)
|
||||
- GoogleUtilities/MethodSwizzler (~> 8.1)
|
||||
- GoogleUtilities/Network (~> 8.1)
|
||||
- "GoogleUtilities/NSData+zlib (~> 8.1)"
|
||||
- nanopb (~> 3.30910.0)
|
||||
- FirebaseAnalytics/Default (11.15.0):
|
||||
- FirebaseCore (~> 11.15.0)
|
||||
- FirebaseInstallations (~> 11.0)
|
||||
- GoogleAppMeasurement/Default (= 11.15.0)
|
||||
- GoogleUtilities/AppDelegateSwizzler (~> 8.1)
|
||||
- GoogleUtilities/MethodSwizzler (~> 8.1)
|
||||
- GoogleUtilities/Network (~> 8.1)
|
||||
- "GoogleUtilities/NSData+zlib (~> 8.1)"
|
||||
- nanopb (~> 3.30910.0)
|
||||
- FirebaseCore (11.15.0):
|
||||
- FirebaseCoreInternal (~> 11.15.0)
|
||||
- GoogleUtilities/Environment (~> 8.1)
|
||||
- GoogleUtilities/Logger (~> 8.1)
|
||||
- FirebaseCoreExtension (11.15.0):
|
||||
- FirebaseCore (~> 11.15.0)
|
||||
- FirebaseCoreInternal (11.15.0):
|
||||
- "GoogleUtilities/NSData+zlib (~> 8.1)"
|
||||
- FirebaseCrashlytics (11.15.0):
|
||||
- FirebaseCore (~> 11.15.0)
|
||||
- FirebaseInstallations (~> 11.0)
|
||||
- FirebaseRemoteConfigInterop (~> 11.0)
|
||||
- FirebaseSessions (~> 11.0)
|
||||
- GoogleDataTransport (~> 10.0)
|
||||
- GoogleUtilities/Environment (~> 8.1)
|
||||
- nanopb (~> 3.30910.0)
|
||||
- PromisesObjC (~> 2.4)
|
||||
- FirebaseInstallations (11.15.0):
|
||||
- FirebaseCore (~> 11.15.0)
|
||||
- GoogleUtilities/Environment (~> 8.1)
|
||||
- GoogleUtilities/UserDefaults (~> 8.1)
|
||||
- PromisesObjC (~> 2.4)
|
||||
- FirebaseMessaging (11.15.0):
|
||||
- FirebaseCore (~> 11.15.0)
|
||||
- FirebaseInstallations (~> 11.0)
|
||||
- GoogleDataTransport (~> 10.0)
|
||||
- GoogleUtilities/AppDelegateSwizzler (~> 8.1)
|
||||
- GoogleUtilities/Environment (~> 8.1)
|
||||
- GoogleUtilities/Reachability (~> 8.1)
|
||||
- GoogleUtilities/UserDefaults (~> 8.1)
|
||||
- nanopb (~> 3.30910.0)
|
||||
- FirebaseRemoteConfigInterop (11.15.0)
|
||||
- FirebaseSessions (11.15.0):
|
||||
- FirebaseCore (~> 11.15.0)
|
||||
- FirebaseCoreExtension (~> 11.15.0)
|
||||
- FirebaseInstallations (~> 11.0)
|
||||
- GoogleDataTransport (~> 10.0)
|
||||
- GoogleUtilities/Environment (~> 8.1)
|
||||
- GoogleUtilities/UserDefaults (~> 8.1)
|
||||
- nanopb (~> 3.30910.0)
|
||||
- PromisesSwift (~> 2.1)
|
||||
- FLAnimatedImage (1.0.17)
|
||||
- Flutter (1.0.0)
|
||||
- flutter_amazonpaymentservices (0.0.1):
|
||||
- Flutter
|
||||
- PayFortSDK
|
||||
- flutter_app_group_directory (0.0.1):
|
||||
- Flutter
|
||||
- flutter_callkit_incoming (0.0.1):
|
||||
- CryptoSwift
|
||||
- Flutter
|
||||
- flutter_image_compress_common (1.0.0):
|
||||
- Flutter
|
||||
- Mantle
|
||||
- SDWebImage
|
||||
- SDWebImageWebPCoder
|
||||
- flutter_inappwebview_ios (0.0.1):
|
||||
- Flutter
|
||||
- flutter_inappwebview_ios/Core (= 0.0.1)
|
||||
- OrderedSet (~> 6.0.3)
|
||||
- flutter_inappwebview_ios/Core (0.0.1):
|
||||
- Flutter
|
||||
- OrderedSet (~> 6.0.3)
|
||||
- flutter_ios_voip_kit_karmm (0.8.0):
|
||||
- Flutter
|
||||
- flutter_local_notifications (0.0.1):
|
||||
- Flutter
|
||||
- flutter_nfc_kit (3.6.0):
|
||||
- Flutter
|
||||
- flutter_paytabs_bridge (2.7.12):
|
||||
- Flutter
|
||||
- PayTabsSDK (= 6.6.54)
|
||||
- flutter_screenshot_blocker (0.0.1):
|
||||
- Flutter
|
||||
- flutter_zoom_videosdk (0.0.1):
|
||||
- Flutter
|
||||
- ZoomVideoSDK/CptShare (= 2.4.0)
|
||||
- ZoomVideoSDK/Whiteboard (= 2.4.0)
|
||||
- ZoomVideoSDK/zm_annoter_dynamic (= 2.4.0)
|
||||
- ZoomVideoSDK/zoomcml (= 2.4.0)
|
||||
- ZoomVideoSDK/ZoomTask (= 2.4.0)
|
||||
- ZoomVideoSDK/ZoomVideoSDK (= 2.4.0)
|
||||
- fluttertoast (0.0.2):
|
||||
- Flutter
|
||||
- geolocator_apple (1.2.0):
|
||||
- Flutter
|
||||
- FlutterMacOS
|
||||
- Google-Maps-iOS-Utils (5.0.0):
|
||||
- GoogleMaps (~> 8.0)
|
||||
- google_maps_flutter_ios (0.0.1):
|
||||
- Flutter
|
||||
- Google-Maps-iOS-Utils (< 7.0, >= 5.0)
|
||||
- GoogleMaps (< 11.0, >= 8.4)
|
||||
- GoogleAdsOnDeviceConversion (2.1.0):
|
||||
- GoogleUtilities/Logger (~> 8.1)
|
||||
- GoogleUtilities/Network (~> 8.1)
|
||||
- nanopb (~> 3.30910.0)
|
||||
- GoogleAppMeasurement/Core (11.15.0):
|
||||
- GoogleUtilities/AppDelegateSwizzler (~> 8.1)
|
||||
- GoogleUtilities/MethodSwizzler (~> 8.1)
|
||||
- GoogleUtilities/Network (~> 8.1)
|
||||
- "GoogleUtilities/NSData+zlib (~> 8.1)"
|
||||
- nanopb (~> 3.30910.0)
|
||||
- GoogleAppMeasurement/Default (11.15.0):
|
||||
- GoogleAdsOnDeviceConversion (= 2.1.0)
|
||||
- GoogleAppMeasurement/Core (= 11.15.0)
|
||||
- GoogleAppMeasurement/IdentitySupport (= 11.15.0)
|
||||
- GoogleUtilities/AppDelegateSwizzler (~> 8.1)
|
||||
- GoogleUtilities/MethodSwizzler (~> 8.1)
|
||||
- GoogleUtilities/Network (~> 8.1)
|
||||
- "GoogleUtilities/NSData+zlib (~> 8.1)"
|
||||
- nanopb (~> 3.30910.0)
|
||||
- GoogleAppMeasurement/IdentitySupport (11.15.0):
|
||||
- GoogleAppMeasurement/Core (= 11.15.0)
|
||||
- GoogleUtilities/AppDelegateSwizzler (~> 8.1)
|
||||
- GoogleUtilities/MethodSwizzler (~> 8.1)
|
||||
- GoogleUtilities/Network (~> 8.1)
|
||||
- "GoogleUtilities/NSData+zlib (~> 8.1)"
|
||||
- nanopb (~> 3.30910.0)
|
||||
- GoogleDataTransport (10.1.0):
|
||||
- nanopb (~> 3.30910.0)
|
||||
- PromisesObjC (~> 2.4)
|
||||
- GoogleMaps (8.4.0):
|
||||
- GoogleMaps/Maps (= 8.4.0)
|
||||
- GoogleMaps/Base (8.4.0)
|
||||
- GoogleMaps/Maps (8.4.0):
|
||||
- GoogleMaps/Base
|
||||
- GoogleUtilities/AppDelegateSwizzler (8.1.0):
|
||||
- GoogleUtilities/Environment
|
||||
- GoogleUtilities/Logger
|
||||
- GoogleUtilities/Network
|
||||
- GoogleUtilities/Privacy
|
||||
- GoogleUtilities/Environment (8.1.0):
|
||||
- GoogleUtilities/Privacy
|
||||
- GoogleUtilities/Logger (8.1.0):
|
||||
- GoogleUtilities/Environment
|
||||
- GoogleUtilities/Privacy
|
||||
- GoogleUtilities/MethodSwizzler (8.1.0):
|
||||
- GoogleUtilities/Logger
|
||||
- GoogleUtilities/Privacy
|
||||
- GoogleUtilities/Network (8.1.0):
|
||||
- GoogleUtilities/Logger
|
||||
- "GoogleUtilities/NSData+zlib"
|
||||
- GoogleUtilities/Privacy
|
||||
- GoogleUtilities/Reachability
|
||||
- "GoogleUtilities/NSData+zlib (8.1.0)":
|
||||
- GoogleUtilities/Privacy
|
||||
- GoogleUtilities/Privacy (8.1.0)
|
||||
- GoogleUtilities/Reachability (8.1.0):
|
||||
- GoogleUtilities/Logger
|
||||
- GoogleUtilities/Privacy
|
||||
- GoogleUtilities/UserDefaults (8.1.0):
|
||||
- GoogleUtilities/Logger
|
||||
- GoogleUtilities/Privacy
|
||||
- health (13.1.4):
|
||||
- Flutter
|
||||
- image_picker_ios (0.0.1):
|
||||
- Flutter
|
||||
- in_app_review (2.0.0):
|
||||
- Flutter
|
||||
- just_audio (0.0.1):
|
||||
- Flutter
|
||||
- FlutterMacOS
|
||||
- libwebp (1.5.0):
|
||||
- libwebp/demux (= 1.5.0)
|
||||
- libwebp/mux (= 1.5.0)
|
||||
- libwebp/sharpyuv (= 1.5.0)
|
||||
- libwebp/webp (= 1.5.0)
|
||||
- libwebp/demux (1.5.0):
|
||||
- libwebp/webp
|
||||
- libwebp/mux (1.5.0):
|
||||
- libwebp/demux
|
||||
- libwebp/sharpyuv (1.5.0)
|
||||
- libwebp/webp (1.5.0):
|
||||
- libwebp/sharpyuv
|
||||
- live_activities (0.0.1):
|
||||
- Flutter
|
||||
- local_auth_darwin (0.0.1):
|
||||
- Flutter
|
||||
- FlutterMacOS
|
||||
- location (0.0.1):
|
||||
- Flutter
|
||||
- manage_calendar_events (0.0.1):
|
||||
- Flutter
|
||||
- Mantle (2.2.0):
|
||||
- Mantle/extobjc (= 2.2.0)
|
||||
- Mantle/extobjc (2.2.0)
|
||||
- map_launcher (0.0.1):
|
||||
- Flutter
|
||||
- MapboxCommon (23.11.0)
|
||||
- MapboxCoreMaps (10.19.1):
|
||||
- MapboxCommon (~> 23.11)
|
||||
- MapboxCoreNavigation (2.19.0):
|
||||
- MapboxDirections (~> 2.14)
|
||||
- MapboxNavigationNative (< 207.0.0, >= 206.0.1)
|
||||
- MapboxDirections (2.14.2):
|
||||
- Polyline (~> 5.0)
|
||||
- Turf (~> 2.8.0)
|
||||
- MapboxMaps (10.19.0):
|
||||
- MapboxCommon (= 23.11.0)
|
||||
- MapboxCoreMaps (= 10.19.1)
|
||||
- MapboxMobileEvents (= 2.0.0)
|
||||
- Turf (= 2.8.0)
|
||||
- MapboxMobileEvents (2.0.0)
|
||||
- MapboxNavigation (2.19.0):
|
||||
- MapboxCoreNavigation (= 2.19.0)
|
||||
- MapboxMaps (~> 10.18)
|
||||
- MapboxSpeech (~> 2.0)
|
||||
- Solar-dev (~> 3.0)
|
||||
- MapboxNavigationNative (206.2.2):
|
||||
- MapboxCommon (~> 23.10)
|
||||
- MapboxSpeech (2.1.1)
|
||||
- nanopb (3.30910.0):
|
||||
- nanopb/decode (= 3.30910.0)
|
||||
- nanopb/encode (= 3.30910.0)
|
||||
- nanopb/decode (3.30910.0)
|
||||
- nanopb/encode (3.30910.0)
|
||||
- network_info_plus (0.0.1):
|
||||
- Flutter
|
||||
- open_filex (0.0.2):
|
||||
- Flutter
|
||||
- OrderedSet (6.0.3)
|
||||
- package_info_plus (0.4.5):
|
||||
- Flutter
|
||||
- path_provider_foundation (0.0.1):
|
||||
- Flutter
|
||||
- FlutterMacOS
|
||||
- PayFortSDK (3.2.1)
|
||||
- PayTabsSDK (6.6.54)
|
||||
- permission_handler_apple (9.3.0):
|
||||
- Flutter
|
||||
- Polyline (5.1.0)
|
||||
- PromisesObjC (2.4.0)
|
||||
- PromisesSwift (2.4.0):
|
||||
- PromisesObjC (= 2.4.0)
|
||||
- screen_brightness_ios (0.1.0):
|
||||
- Flutter
|
||||
- SDWebImage (5.21.2):
|
||||
- SDWebImage/Core (= 5.21.2)
|
||||
- SDWebImage/Core (5.21.2)
|
||||
- SDWebImageWebPCoder (0.15.0):
|
||||
- libwebp (~> 1.0)
|
||||
- SDWebImage/Core (~> 5.17)
|
||||
- share_plus (0.0.1):
|
||||
- Flutter
|
||||
- shared_preferences_foundation (0.0.1):
|
||||
- Flutter
|
||||
- FlutterMacOS
|
||||
- Solar-dev (3.0.1)
|
||||
- sqflite_darwin (0.0.4):
|
||||
- Flutter
|
||||
- FlutterMacOS
|
||||
- SwiftProtobuf (1.38.1)
|
||||
- SwiftyGif (5.4.5)
|
||||
- Turf (2.8.0)
|
||||
- url_launcher_ios (0.0.1):
|
||||
- Flutter
|
||||
- video_player_avfoundation (0.0.1):
|
||||
- Flutter
|
||||
- FlutterMacOS
|
||||
- wakelock_plus (0.0.1):
|
||||
- Flutter
|
||||
- webview_flutter_wkwebview (0.0.1):
|
||||
- Flutter
|
||||
- FlutterMacOS
|
||||
- ZoomVideoSDK/CptShare (2.4.0)
|
||||
- ZoomVideoSDK/Whiteboard (2.4.0)
|
||||
- ZoomVideoSDK/zm_annoter_dynamic (2.4.0)
|
||||
- ZoomVideoSDK/zoomcml (2.4.0)
|
||||
- ZoomVideoSDK/ZoomTask (2.4.0)
|
||||
- ZoomVideoSDK/ZoomVideoSDK (2.4.0)
|
||||
|
||||
DEPENDENCIES:
|
||||
- amazon_payfort (from `.symlinks/plugins/amazon_payfort/ios`)
|
||||
- audio_session (from `.symlinks/plugins/audio_session/ios`)
|
||||
- barcode_scan2 (from `.symlinks/plugins/barcode_scan2/ios`)
|
||||
- clarity_flutter (from `.symlinks/plugins/clarity_flutter/ios`)
|
||||
- connectivity_plus (from `.symlinks/plugins/connectivity_plus/ios`)
|
||||
- device_calendar (from `.symlinks/plugins/device_calendar/ios`)
|
||||
- device_calendar_plus_ios (from `.symlinks/plugins/device_calendar_plus_ios/ios`)
|
||||
- device_info_plus (from `.symlinks/plugins/device_info_plus/ios`)
|
||||
- file_picker (from `.symlinks/plugins/file_picker/ios`)
|
||||
- firebase_analytics (from `.symlinks/plugins/firebase_analytics/ios`)
|
||||
- firebase_core (from `.symlinks/plugins/firebase_core/ios`)
|
||||
- firebase_crashlytics (from `.symlinks/plugins/firebase_crashlytics/ios`)
|
||||
- firebase_messaging (from `.symlinks/plugins/firebase_messaging/ios`)
|
||||
- FLAnimatedImage
|
||||
- Flutter (from `Flutter`)
|
||||
- flutter_amazonpaymentservices (from `.symlinks/plugins/flutter_amazonpaymentservices/ios`)
|
||||
- flutter_app_group_directory (from `.symlinks/plugins/flutter_app_group_directory/ios`)
|
||||
- flutter_callkit_incoming (from `.symlinks/plugins/flutter_callkit_incoming/ios`)
|
||||
- flutter_image_compress_common (from `.symlinks/plugins/flutter_image_compress_common/ios`)
|
||||
- flutter_inappwebview_ios (from `.symlinks/plugins/flutter_inappwebview_ios/ios`)
|
||||
- flutter_ios_voip_kit_karmm (from `.symlinks/plugins/flutter_ios_voip_kit_karmm/ios`)
|
||||
- flutter_local_notifications (from `.symlinks/plugins/flutter_local_notifications/ios`)
|
||||
- flutter_nfc_kit (from `.symlinks/plugins/flutter_nfc_kit/ios`)
|
||||
- flutter_paytabs_bridge (from `.symlinks/plugins/flutter_paytabs_bridge/ios`)
|
||||
- flutter_screenshot_blocker (from `.symlinks/plugins/flutter_screenshot_blocker/ios`)
|
||||
- flutter_zoom_videosdk (from `.symlinks/plugins/flutter_zoom_videosdk/ios`)
|
||||
- fluttertoast (from `.symlinks/plugins/fluttertoast/ios`)
|
||||
- geolocator_apple (from `.symlinks/plugins/geolocator_apple/darwin`)
|
||||
- google_maps_flutter_ios (from `.symlinks/plugins/google_maps_flutter_ios/ios`)
|
||||
- health (from `.symlinks/plugins/health/ios`)
|
||||
- image_picker_ios (from `.symlinks/plugins/image_picker_ios/ios`)
|
||||
- in_app_review (from `.symlinks/plugins/in_app_review/ios`)
|
||||
- just_audio (from `.symlinks/plugins/just_audio/darwin`)
|
||||
- live_activities (from `.symlinks/plugins/live_activities/ios`)
|
||||
- local_auth_darwin (from `.symlinks/plugins/local_auth_darwin/darwin`)
|
||||
- location (from `.symlinks/plugins/location/ios`)
|
||||
- manage_calendar_events (from `.symlinks/plugins/manage_calendar_events/ios`)
|
||||
- map_launcher (from `.symlinks/plugins/map_launcher/ios`)
|
||||
- MapboxMaps (= 10.19.0)
|
||||
- MapboxNavigation (= 2.19.0)
|
||||
- network_info_plus (from `.symlinks/plugins/network_info_plus/ios`)
|
||||
- open_filex (from `.symlinks/plugins/open_filex/ios`)
|
||||
- package_info_plus (from `.symlinks/plugins/package_info_plus/ios`)
|
||||
- path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`)
|
||||
- permission_handler_apple (from `.symlinks/plugins/permission_handler_apple/ios`)
|
||||
- screen_brightness_ios (from `.symlinks/plugins/screen_brightness_ios/ios`)
|
||||
- share_plus (from `.symlinks/plugins/share_plus/ios`)
|
||||
- shared_preferences_foundation (from `.symlinks/plugins/shared_preferences_foundation/darwin`)
|
||||
- sqflite_darwin (from `.symlinks/plugins/sqflite_darwin/darwin`)
|
||||
- url_launcher_ios (from `.symlinks/plugins/url_launcher_ios/ios`)
|
||||
- video_player_avfoundation (from `.symlinks/plugins/video_player_avfoundation/darwin`)
|
||||
- wakelock_plus (from `.symlinks/plugins/wakelock_plus/ios`)
|
||||
- webview_flutter_wkwebview (from `.symlinks/plugins/webview_flutter_wkwebview/darwin`)
|
||||
|
||||
SPEC REPOS:
|
||||
trunk:
|
||||
- CryptoSwift
|
||||
- DKImagePickerController
|
||||
- DKPhotoGallery
|
||||
- Firebase
|
||||
- FirebaseAnalytics
|
||||
- FirebaseCore
|
||||
- FirebaseCoreExtension
|
||||
- FirebaseCoreInternal
|
||||
- FirebaseCrashlytics
|
||||
- FirebaseInstallations
|
||||
- FirebaseMessaging
|
||||
- FirebaseRemoteConfigInterop
|
||||
- FirebaseSessions
|
||||
- FLAnimatedImage
|
||||
- Google-Maps-iOS-Utils
|
||||
- GoogleAdsOnDeviceConversion
|
||||
- GoogleAppMeasurement
|
||||
- GoogleDataTransport
|
||||
- GoogleMaps
|
||||
- GoogleUtilities
|
||||
- libwebp
|
||||
- Mantle
|
||||
- MapboxCommon
|
||||
- MapboxCoreMaps
|
||||
- MapboxCoreNavigation
|
||||
- MapboxDirections
|
||||
- MapboxMaps
|
||||
- MapboxMobileEvents
|
||||
- MapboxNavigation
|
||||
- MapboxNavigationNative
|
||||
- MapboxSpeech
|
||||
- nanopb
|
||||
- OrderedSet
|
||||
- PayFortSDK
|
||||
- PayTabsSDK
|
||||
- Polyline
|
||||
- PromisesObjC
|
||||
- PromisesSwift
|
||||
- SDWebImage
|
||||
- SDWebImageWebPCoder
|
||||
- Solar-dev
|
||||
- SwiftProtobuf
|
||||
- SwiftyGif
|
||||
- Turf
|
||||
- ZoomVideoSDK
|
||||
|
||||
EXTERNAL SOURCES:
|
||||
amazon_payfort:
|
||||
:path: ".symlinks/plugins/amazon_payfort/ios"
|
||||
audio_session:
|
||||
:path: ".symlinks/plugins/audio_session/ios"
|
||||
barcode_scan2:
|
||||
:path: ".symlinks/plugins/barcode_scan2/ios"
|
||||
clarity_flutter:
|
||||
:path: ".symlinks/plugins/clarity_flutter/ios"
|
||||
connectivity_plus:
|
||||
:path: ".symlinks/plugins/connectivity_plus/ios"
|
||||
device_calendar:
|
||||
:path: ".symlinks/plugins/device_calendar/ios"
|
||||
device_calendar_plus_ios:
|
||||
:path: ".symlinks/plugins/device_calendar_plus_ios/ios"
|
||||
device_info_plus:
|
||||
:path: ".symlinks/plugins/device_info_plus/ios"
|
||||
file_picker:
|
||||
:path: ".symlinks/plugins/file_picker/ios"
|
||||
firebase_analytics:
|
||||
:path: ".symlinks/plugins/firebase_analytics/ios"
|
||||
firebase_core:
|
||||
:path: ".symlinks/plugins/firebase_core/ios"
|
||||
firebase_crashlytics:
|
||||
:path: ".symlinks/plugins/firebase_crashlytics/ios"
|
||||
firebase_messaging:
|
||||
:path: ".symlinks/plugins/firebase_messaging/ios"
|
||||
Flutter:
|
||||
:path: Flutter
|
||||
flutter_amazonpaymentservices:
|
||||
:path: ".symlinks/plugins/flutter_amazonpaymentservices/ios"
|
||||
flutter_app_group_directory:
|
||||
:path: ".symlinks/plugins/flutter_app_group_directory/ios"
|
||||
flutter_callkit_incoming:
|
||||
:path: ".symlinks/plugins/flutter_callkit_incoming/ios"
|
||||
flutter_image_compress_common:
|
||||
:path: ".symlinks/plugins/flutter_image_compress_common/ios"
|
||||
flutter_inappwebview_ios:
|
||||
:path: ".symlinks/plugins/flutter_inappwebview_ios/ios"
|
||||
flutter_ios_voip_kit_karmm:
|
||||
:path: ".symlinks/plugins/flutter_ios_voip_kit_karmm/ios"
|
||||
flutter_local_notifications:
|
||||
:path: ".symlinks/plugins/flutter_local_notifications/ios"
|
||||
flutter_nfc_kit:
|
||||
:path: ".symlinks/plugins/flutter_nfc_kit/ios"
|
||||
flutter_paytabs_bridge:
|
||||
:path: ".symlinks/plugins/flutter_paytabs_bridge/ios"
|
||||
flutter_screenshot_blocker:
|
||||
:path: ".symlinks/plugins/flutter_screenshot_blocker/ios"
|
||||
flutter_zoom_videosdk:
|
||||
:path: ".symlinks/plugins/flutter_zoom_videosdk/ios"
|
||||
fluttertoast:
|
||||
:path: ".symlinks/plugins/fluttertoast/ios"
|
||||
geolocator_apple:
|
||||
:path: ".symlinks/plugins/geolocator_apple/darwin"
|
||||
google_maps_flutter_ios:
|
||||
:path: ".symlinks/plugins/google_maps_flutter_ios/ios"
|
||||
health:
|
||||
:path: ".symlinks/plugins/health/ios"
|
||||
image_picker_ios:
|
||||
:path: ".symlinks/plugins/image_picker_ios/ios"
|
||||
in_app_review:
|
||||
:path: ".symlinks/plugins/in_app_review/ios"
|
||||
just_audio:
|
||||
:path: ".symlinks/plugins/just_audio/darwin"
|
||||
live_activities:
|
||||
:path: ".symlinks/plugins/live_activities/ios"
|
||||
local_auth_darwin:
|
||||
:path: ".symlinks/plugins/local_auth_darwin/darwin"
|
||||
location:
|
||||
:path: ".symlinks/plugins/location/ios"
|
||||
manage_calendar_events:
|
||||
:path: ".symlinks/plugins/manage_calendar_events/ios"
|
||||
map_launcher:
|
||||
:path: ".symlinks/plugins/map_launcher/ios"
|
||||
network_info_plus:
|
||||
:path: ".symlinks/plugins/network_info_plus/ios"
|
||||
open_filex:
|
||||
:path: ".symlinks/plugins/open_filex/ios"
|
||||
package_info_plus:
|
||||
:path: ".symlinks/plugins/package_info_plus/ios"
|
||||
path_provider_foundation:
|
||||
:path: ".symlinks/plugins/path_provider_foundation/darwin"
|
||||
permission_handler_apple:
|
||||
:path: ".symlinks/plugins/permission_handler_apple/ios"
|
||||
screen_brightness_ios:
|
||||
:path: ".symlinks/plugins/screen_brightness_ios/ios"
|
||||
share_plus:
|
||||
:path: ".symlinks/plugins/share_plus/ios"
|
||||
shared_preferences_foundation:
|
||||
:path: ".symlinks/plugins/shared_preferences_foundation/darwin"
|
||||
sqflite_darwin:
|
||||
:path: ".symlinks/plugins/sqflite_darwin/darwin"
|
||||
url_launcher_ios:
|
||||
:path: ".symlinks/plugins/url_launcher_ios/ios"
|
||||
video_player_avfoundation:
|
||||
:path: ".symlinks/plugins/video_player_avfoundation/darwin"
|
||||
wakelock_plus:
|
||||
:path: ".symlinks/plugins/wakelock_plus/ios"
|
||||
webview_flutter_wkwebview:
|
||||
:path: ".symlinks/plugins/webview_flutter_wkwebview/darwin"
|
||||
|
||||
SPEC CHECKSUMS:
|
||||
amazon_payfort: 4ad7a3413acc1c4c4022117a80d18fee23c572d3
|
||||
audio_session: 9bb7f6c970f21241b19f5a3658097ae459681ba0
|
||||
barcode_scan2: 4e4b850b112f4e29017833e4715f36161f987966
|
||||
clarity_flutter: d665e4a61c0000a28e7829668a4e287cc1b657bd
|
||||
connectivity_plus: cb623214f4e1f6ef8fe7403d580fdad517d2f7dd
|
||||
CryptoSwift: e64e11850ede528a02a0f3e768cec8e9d92ecb90
|
||||
device_calendar: b55b2c5406cfba45c95a59f9059156daee1f74ed
|
||||
device_calendar_plus_ios: 2c04ad7643c6e697438216e33693b84e8ca45ded
|
||||
device_info_plus: 21fcca2080fbcd348be798aa36c3e5ed849eefbe
|
||||
DKImagePickerController: 946cec48c7873164274ecc4624d19e3da4c1ef3c
|
||||
DKPhotoGallery: b3834fecb755ee09a593d7c9e389d8b5d6deed60
|
||||
file_picker: a0560bc09d61de87f12d246fc47d2119e6ef37be
|
||||
Firebase: d99ac19b909cd2c548339c2241ecd0d1599ab02e
|
||||
firebase_analytics: 0e25ca1d4001ccedd40b4e5b74c0ec34e18f6425
|
||||
firebase_core: 995454a784ff288be5689b796deb9e9fa3601818
|
||||
firebase_crashlytics: 30dcd6dfd2fe895c0848af46722a4227346c19aa
|
||||
firebase_messaging: f4a41dd102ac18b840eba3f39d67e77922d3f707
|
||||
FirebaseAnalytics: 6433dfd311ba78084fc93bdfc145e8cb75740eae
|
||||
FirebaseCore: efb3893e5b94f32b86e331e3bd6dadf18b66568e
|
||||
FirebaseCoreExtension: edbd30474b5ccf04e5f001470bdf6ea616af2435
|
||||
FirebaseCoreInternal: 9afa45b1159304c963da48addb78275ef701c6b4
|
||||
FirebaseCrashlytics: e09d0bc19aa54a51e45b8039c836ef73f32c039a
|
||||
FirebaseInstallations: 317270fec08a5d418fdbc8429282238cab3ac843
|
||||
FirebaseMessaging: 3b26e2cee503815e01c3701236b020aa9b576f09
|
||||
FirebaseRemoteConfigInterop: 1c6135e8a094cc6368949f5faeeca7ee8948b8aa
|
||||
FirebaseSessions: b9a92c1c51bbb81e78fc3142cda6d925d700f8e7
|
||||
FLAnimatedImage: bbf914596368867157cc71b38a8ec834b3eeb32b
|
||||
Flutter: cabc95a1d2626b1b06e7179b784ebcf0c0cde467
|
||||
flutter_amazonpaymentservices: 30d57c19319b81de776345023e4f0697c7d94866
|
||||
flutter_app_group_directory: 55b5362007d1c0cb45dc1dd1e94f67d615f45a6b
|
||||
flutter_callkit_incoming: cb8138af67cda6dd981f7101a5d709003af21502
|
||||
flutter_image_compress_common: 1697a328fd72bfb335507c6bca1a65fa5ad87df1
|
||||
flutter_inappwebview_ios: b89ba3482b96fb25e00c967aae065701b66e9b99
|
||||
flutter_ios_voip_kit_karmm: 371663476722afb631d5a13a39dee74c56c1abd0
|
||||
flutter_local_notifications: a5a732f069baa862e728d839dd2ebb904737effb
|
||||
flutter_nfc_kit: e1b71583eafd2c9650bc86844a7f2d185fb414f6
|
||||
flutter_paytabs_bridge: 193d7ae44a86bf5a9b618fc839433e721e04012d
|
||||
flutter_screenshot_blocker: 87493b3202126286ddce134a2703fdfc1f9267ea
|
||||
flutter_zoom_videosdk: d0c2be11c6e3bfdae9ace300f878943036cf909c
|
||||
fluttertoast: 2c67e14dce98bbdb200df9e1acf610d7a6264ea1
|
||||
geolocator_apple: ab36aa0e8b7d7a2d7639b3b4e48308394e8cef5e
|
||||
Google-Maps-iOS-Utils: 66d6de12be1ce6d3742a54661e7a79cb317a9321
|
||||
google_maps_flutter_ios: 3213e1e5f5588b6134935cb8fc59acb4e6d88377
|
||||
GoogleAdsOnDeviceConversion: 2be6297a4f048459e0ae17fad9bfd2844e10cf64
|
||||
GoogleAppMeasurement: 700dce7541804bec33db590a5c496b663fbe2539
|
||||
GoogleDataTransport: aae35b7ea0c09004c3797d53c8c41f66f219d6a7
|
||||
GoogleMaps: 8939898920281c649150e0af74aa291c60f2e77d
|
||||
GoogleUtilities: 00c88b9a86066ef77f0da2fab05f65d7768ed8e1
|
||||
health: 32d2fbc7f26f9a2388d1a514ce168adbfa5bda65
|
||||
image_picker_ios: e0ece4aa2a75771a7de3fa735d26d90817041326
|
||||
in_app_review: 7dd1ea365263f834b8464673f9df72c80c17c937
|
||||
just_audio: 4e391f57b79cad2b0674030a00453ca5ce817eed
|
||||
libwebp: 02b23773aedb6ff1fd38cec7a77b81414c6842a8
|
||||
live_activities: 4dfa736d0736e1c77866a2f9c056a76513cc9e7b
|
||||
local_auth_darwin: c3ee6cce0a8d56be34c8ccb66ba31f7f180aaebb
|
||||
location: 155caecf9da4f280ab5fe4a55f94ceccfab838f8
|
||||
manage_calendar_events: fe1541069431af035ced925ebd9def8b4b271254
|
||||
Mantle: c5aa8794a29a022dfbbfc9799af95f477a69b62d
|
||||
map_launcher: 8051ad5783913cafce93f2414c6858f2904fd8df
|
||||
MapboxCommon: 119f3759f7dc9457f0695848108ab323eb643cb4
|
||||
MapboxCoreMaps: ca17f67baced23f8c952166ac6314c35bad3f66c
|
||||
MapboxCoreNavigation: 3be9990fae3ed732a101001746d0e3b4234ec023
|
||||
MapboxDirections: d4fe7d43cff82aa0c15955d1b4563a5a01e2d4de
|
||||
MapboxMaps: b7f29ec7c33f7dc6d2947c1148edce6db81db9a7
|
||||
MapboxMobileEvents: d044b9edbe0ec7df60f6c2c9634fe9a7f449266b
|
||||
MapboxNavigation: da9cf3d773ed5b0fa0fb388fccdaa117ee681f31
|
||||
MapboxNavigationNative: 629e359f3d2590acd1ebbacaaf99e1a80ee57e42
|
||||
MapboxSpeech: cd25ef99c3a3d2e0da72620ff558276ea5991a77
|
||||
nanopb: fad817b59e0457d11a5dfbde799381cd727c1275
|
||||
network_info_plus: cf61925ab5205dce05a4f0895989afdb6aade5fc
|
||||
open_filex: 432f3cd11432da3e39f47fcc0df2b1603854eff1
|
||||
OrderedSet: e539b66b644ff081c73a262d24ad552a69be3a94
|
||||
package_info_plus: af8e2ca6888548050f16fa2f1938db7b5a5df499
|
||||
path_provider_foundation: bb55f6dbba17d0dccd6737fe6f7f34fbd0376880
|
||||
PayFortSDK: 233eabe9a45601fdbeac67fa6e5aae46ed8faf82
|
||||
PayTabsSDK: 51d21d0174679d08ee816583266aa5f557ebf5ed
|
||||
permission_handler_apple: 4ed2196e43d0651e8ff7ca3483a069d469701f2d
|
||||
Polyline: 2a1f29f87f8d9b7de868940f4f76deb8c678a5b1
|
||||
PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47
|
||||
PromisesSwift: 9d77319bbe72ebf6d872900551f7eeba9bce2851
|
||||
screen_brightness_ios: 28c5fbdb40634de44f86025d84470158ad4df48c
|
||||
SDWebImage: 9f177d83116802728e122410fb25ad88f5c7608a
|
||||
SDWebImageWebPCoder: 0e06e365080397465cc73a7a9b472d8a3bd0f377
|
||||
share_plus: 50da8cb520a8f0f65671c6c6a99b3617ed10a58a
|
||||
shared_preferences_foundation: 7036424c3d8ec98dfe75ff1667cb0cd531ec82bb
|
||||
Solar-dev: 4612dc9878b9fed2667d23b327f1d4e54e16e8d0
|
||||
sqflite_darwin: 20b2a3a3b70e43edae938624ce550a3cbf66a3d0
|
||||
SwiftProtobuf: 409d3aaec90e51b1705b1dd8065b56893450e77c
|
||||
SwiftyGif: 706c60cf65fa2bc5ee0313beece843c8eb8194d4
|
||||
Turf: aa2ede4298009639d10db36aba1a7ebaad072a5e
|
||||
url_launcher_ios: 7a95fa5b60cc718a708b8f2966718e93db0cef1b
|
||||
video_player_avfoundation: dd410b52df6d2466a42d28550e33e4146928280a
|
||||
wakelock_plus: e29112ab3ef0b318e58cfa5c32326458be66b556
|
||||
webview_flutter_wkwebview: 8ebf4fded22593026f7dbff1fbff31ea98573c8d
|
||||
ZoomVideoSDK: c3ac797074847382d9b539044d77f5971d6b62cd
|
||||
|
||||
PODFILE CHECKSUM: b2fdde559476ac2931f2a7ceec6cf5a78743c72b
|
||||
|
||||
COCOAPODS: 1.16.2
|
||||
@ -0,0 +1,37 @@
|
||||
//
|
||||
// LiveActivityHelper.swift
|
||||
// Runner
|
||||
//
|
||||
// Created by Cloud Solutions on 28/01/2026.
|
||||
//
|
||||
|
||||
import Foundation
|
||||
|
||||
|
||||
class LiveActivityHelper{
|
||||
|
||||
private let channelName = "clear_data"
|
||||
|
||||
var flutterMethodChannelPenguinIn:FlutterMethodChannel? = nil
|
||||
func initialize(_ controller :FlutterViewController){
|
||||
openChannel(controller: controller)
|
||||
}
|
||||
|
||||
private func openChannel(controller :FlutterViewController){
|
||||
flutterMethodChannelPenguinIn = FlutterMethodChannel(name: channelName, binaryMessenger: controller.binaryMessenger)
|
||||
|
||||
flutterMethodChannelPenguinIn?.setMethodCallHandler { (methodCall, result) in
|
||||
print("Called function \(methodCall.method)")
|
||||
|
||||
|
||||
if methodCall.method == "clearUserDefaultData"{
|
||||
let sharedDefaults: UserDefaults = UserDefaults(suiteName: "group.alhabib.patientApp")!
|
||||
sharedDefaults.removePersistentDomain(forName: "group.alhabib.patientApp")
|
||||
sharedDefaults.synchronize()
|
||||
result(nil)
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,11 @@
|
||||
{
|
||||
"colors" : [
|
||||
{
|
||||
"idiom" : "universal"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"author" : "xcode",
|
||||
"version" : 1
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,35 @@
|
||||
{
|
||||
"images" : [
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"platform" : "ios",
|
||||
"size" : "1024x1024"
|
||||
},
|
||||
{
|
||||
"appearances" : [
|
||||
{
|
||||
"appearance" : "luminosity",
|
||||
"value" : "dark"
|
||||
}
|
||||
],
|
||||
"idiom" : "universal",
|
||||
"platform" : "ios",
|
||||
"size" : "1024x1024"
|
||||
},
|
||||
{
|
||||
"appearances" : [
|
||||
{
|
||||
"appearance" : "luminosity",
|
||||
"value" : "tinted"
|
||||
}
|
||||
],
|
||||
"idiom" : "universal",
|
||||
"platform" : "ios",
|
||||
"size" : "1024x1024"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"author" : "xcode",
|
||||
"version" : 1
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,6 @@
|
||||
{
|
||||
"info" : {
|
||||
"author" : "xcode",
|
||||
"version" : 1
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,11 @@
|
||||
{
|
||||
"colors" : [
|
||||
{
|
||||
"idiom" : "universal"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"author" : "xcode",
|
||||
"version" : 1
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,23 @@
|
||||
{
|
||||
"images" : [
|
||||
{
|
||||
"filename" : "hmg.svg",
|
||||
"idiom" : "universal",
|
||||
"scale" : "1x"
|
||||
},
|
||||
{
|
||||
"filename" : "hmg 1.svg",
|
||||
"idiom" : "universal",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"filename" : "hmg 2.svg",
|
||||
"idiom" : "universal",
|
||||
"scale" : "3x"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"author" : "xcode",
|
||||
"version" : 1
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,5 @@
|
||||
<svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<rect width="14" height="14" rx="3" fill="#ED1C2B"/>
|
||||
<path d="M2.54806 11.4469C2.54806 11.4469 2.98492 11.4437 3.29241 11.4437L5.6242 11.455C5.90252 11.455 6.13431 11.1634 6.14737 10.7422L6.15002 8.82227C6.15002 8.41291 6.3357 8.09262 6.6236 8.07432L7.33877 8.06869C7.62708 8.08618 7.825 8.4105 7.825 8.81725L7.82316 10.7474C7.83581 11.1685 8.03006 11.4433 8.30981 11.4433L11.4488 11.4518L11.4545 9.07923C11.4545 8.67107 11.2554 8.354 10.9648 8.3353L9.70382 8.32907C9.4249 8.32907 9.20555 8.03893 9.19372 7.6173L9.18882 6.97551C9.20269 6.55449 9.42326 6.26496 9.7028 6.26496L10.9707 6.26858C11.2588 6.25028 11.4465 5.91511 11.4465 5.50755L11.4496 2.5459C11.346 2.71309 11.2043 2.85421 11.0357 2.95807C10.8671 3.06193 10.6763 3.12568 10.4784 3.14426L8.34613 3.14245C8.06843 3.14245 7.83602 3.44083 7.82296 3.86185L7.82296 5.76371C7.8099 6.18393 7.59178 6.4813 7.31285 6.4813L6.66767 6.47647C6.38793 6.47647 6.1643 6.18875 6.15165 5.76974L6.15328 3.84698C6.14063 3.42575 5.91904 3.14326 5.63991 3.14326L2.54562 3.14466L2.54562 5.50997C2.54562 5.91853 2.73925 6.24565 3.02817 6.26455L4.29609 6.25933C4.58277 6.27782 4.78579 6.61481 4.78579 7.02115L4.78192 7.56865C4.78192 7.97701 4.58604 8.30373 4.29793 8.32223L3.02797 8.31921C2.73905 8.33932 2.54541 8.66102 2.54541 9.06938L2.54806 11.4469Z" fill="white"/>
|
||||
<path d="M2.54806 11.4469C2.54806 11.4469 2.98492 11.4437 3.29241 11.4437L5.6242 11.455C5.90252 11.455 6.13431 11.1634 6.14737 10.7422L6.15002 8.82227C6.15002 8.41291 6.3357 8.09262 6.6236 8.07432L7.33877 8.06869C7.62708 8.08618 7.825 8.4105 7.825 8.81725L7.82316 10.7474C7.83581 11.1685 8.03006 11.4433 8.30981 11.4433L11.4488 11.4518L11.4545 9.07923C11.4545 8.67107 11.2554 8.354 10.9648 8.3353L9.70382 8.32907C9.4249 8.32907 9.20555 8.03893 9.19372 7.6173L9.18882 6.97551C9.20269 6.55449 9.42326 6.26496 9.7028 6.26496L10.9707 6.26858C11.2588 6.25028 11.4465 5.91511 11.4465 5.50755L11.4496 2.5459C11.346 2.71309 11.2043 2.85421 11.0357 2.95807C10.8671 3.06193 10.6763 3.12568 10.4784 3.14426L8.34613 3.14245C8.06843 3.14245 7.83602 3.44083 7.82296 3.86185L7.82296 5.76371C7.8099 6.18393 7.59178 6.4813 7.31285 6.4813L6.66767 6.47647C6.38793 6.47647 6.1643 6.18875 6.15165 5.76974L6.15328 3.84698C6.14063 3.42575 5.91904 3.14326 5.63991 3.14326L2.54562 3.14466L2.54562 5.50997C2.54562 5.91853 2.73925 6.24565 3.02817 6.26455L4.29609 6.25933C4.58277 6.27782 4.78579 6.61481 4.78579 7.02115L4.78192 7.56865C4.78192 7.97701 4.58604 8.30373 4.29793 8.32223L3.02797 8.31921C2.73905 8.33932 2.54541 8.66102 2.54541 9.06938L2.54806 11.4469Z" fill="white"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2.6 KiB |
@ -0,0 +1,5 @@
|
||||
<svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<rect width="14" height="14" rx="3" fill="#ED1C2B"/>
|
||||
<path d="M2.54806 11.4469C2.54806 11.4469 2.98492 11.4437 3.29241 11.4437L5.6242 11.455C5.90252 11.455 6.13431 11.1634 6.14737 10.7422L6.15002 8.82227C6.15002 8.41291 6.3357 8.09262 6.6236 8.07432L7.33877 8.06869C7.62708 8.08618 7.825 8.4105 7.825 8.81725L7.82316 10.7474C7.83581 11.1685 8.03006 11.4433 8.30981 11.4433L11.4488 11.4518L11.4545 9.07923C11.4545 8.67107 11.2554 8.354 10.9648 8.3353L9.70382 8.32907C9.4249 8.32907 9.20555 8.03893 9.19372 7.6173L9.18882 6.97551C9.20269 6.55449 9.42326 6.26496 9.7028 6.26496L10.9707 6.26858C11.2588 6.25028 11.4465 5.91511 11.4465 5.50755L11.4496 2.5459C11.346 2.71309 11.2043 2.85421 11.0357 2.95807C10.8671 3.06193 10.6763 3.12568 10.4784 3.14426L8.34613 3.14245C8.06843 3.14245 7.83602 3.44083 7.82296 3.86185L7.82296 5.76371C7.8099 6.18393 7.59178 6.4813 7.31285 6.4813L6.66767 6.47647C6.38793 6.47647 6.1643 6.18875 6.15165 5.76974L6.15328 3.84698C6.14063 3.42575 5.91904 3.14326 5.63991 3.14326L2.54562 3.14466L2.54562 5.50997C2.54562 5.91853 2.73925 6.24565 3.02817 6.26455L4.29609 6.25933C4.58277 6.27782 4.78579 6.61481 4.78579 7.02115L4.78192 7.56865C4.78192 7.97701 4.58604 8.30373 4.29793 8.32223L3.02797 8.31921C2.73905 8.33932 2.54541 8.66102 2.54541 9.06938L2.54806 11.4469Z" fill="white"/>
|
||||
<path d="M2.54806 11.4469C2.54806 11.4469 2.98492 11.4437 3.29241 11.4437L5.6242 11.455C5.90252 11.455 6.13431 11.1634 6.14737 10.7422L6.15002 8.82227C6.15002 8.41291 6.3357 8.09262 6.6236 8.07432L7.33877 8.06869C7.62708 8.08618 7.825 8.4105 7.825 8.81725L7.82316 10.7474C7.83581 11.1685 8.03006 11.4433 8.30981 11.4433L11.4488 11.4518L11.4545 9.07923C11.4545 8.67107 11.2554 8.354 10.9648 8.3353L9.70382 8.32907C9.4249 8.32907 9.20555 8.03893 9.19372 7.6173L9.18882 6.97551C9.20269 6.55449 9.42326 6.26496 9.7028 6.26496L10.9707 6.26858C11.2588 6.25028 11.4465 5.91511 11.4465 5.50755L11.4496 2.5459C11.346 2.71309 11.2043 2.85421 11.0357 2.95807C10.8671 3.06193 10.6763 3.12568 10.4784 3.14426L8.34613 3.14245C8.06843 3.14245 7.83602 3.44083 7.82296 3.86185L7.82296 5.76371C7.8099 6.18393 7.59178 6.4813 7.31285 6.4813L6.66767 6.47647C6.38793 6.47647 6.1643 6.18875 6.15165 5.76974L6.15328 3.84698C6.14063 3.42575 5.91904 3.14326 5.63991 3.14326L2.54562 3.14466L2.54562 5.50997C2.54562 5.91853 2.73925 6.24565 3.02817 6.26455L4.29609 6.25933C4.58277 6.27782 4.78579 6.61481 4.78579 7.02115L4.78192 7.56865C4.78192 7.97701 4.58604 8.30373 4.29793 8.32223L3.02797 8.31921C2.73905 8.33932 2.54541 8.66102 2.54541 9.06938L2.54806 11.4469Z" fill="white"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2.6 KiB |
@ -0,0 +1,5 @@
|
||||
<svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<rect width="14" height="14" rx="3" fill="#ED1C2B"/>
|
||||
<path d="M2.54806 11.4469C2.54806 11.4469 2.98492 11.4437 3.29241 11.4437L5.6242 11.455C5.90252 11.455 6.13431 11.1634 6.14737 10.7422L6.15002 8.82227C6.15002 8.41291 6.3357 8.09262 6.6236 8.07432L7.33877 8.06869C7.62708 8.08618 7.825 8.4105 7.825 8.81725L7.82316 10.7474C7.83581 11.1685 8.03006 11.4433 8.30981 11.4433L11.4488 11.4518L11.4545 9.07923C11.4545 8.67107 11.2554 8.354 10.9648 8.3353L9.70382 8.32907C9.4249 8.32907 9.20555 8.03893 9.19372 7.6173L9.18882 6.97551C9.20269 6.55449 9.42326 6.26496 9.7028 6.26496L10.9707 6.26858C11.2588 6.25028 11.4465 5.91511 11.4465 5.50755L11.4496 2.5459C11.346 2.71309 11.2043 2.85421 11.0357 2.95807C10.8671 3.06193 10.6763 3.12568 10.4784 3.14426L8.34613 3.14245C8.06843 3.14245 7.83602 3.44083 7.82296 3.86185L7.82296 5.76371C7.8099 6.18393 7.59178 6.4813 7.31285 6.4813L6.66767 6.47647C6.38793 6.47647 6.1643 6.18875 6.15165 5.76974L6.15328 3.84698C6.14063 3.42575 5.91904 3.14326 5.63991 3.14326L2.54562 3.14466L2.54562 5.50997C2.54562 5.91853 2.73925 6.24565 3.02817 6.26455L4.29609 6.25933C4.58277 6.27782 4.78579 6.61481 4.78579 7.02115L4.78192 7.56865C4.78192 7.97701 4.58604 8.30373 4.29793 8.32223L3.02797 8.31921C2.73905 8.33932 2.54541 8.66102 2.54541 9.06938L2.54806 11.4469Z" fill="white"/>
|
||||
<path d="M2.54806 11.4469C2.54806 11.4469 2.98492 11.4437 3.29241 11.4437L5.6242 11.455C5.90252 11.455 6.13431 11.1634 6.14737 10.7422L6.15002 8.82227C6.15002 8.41291 6.3357 8.09262 6.6236 8.07432L7.33877 8.06869C7.62708 8.08618 7.825 8.4105 7.825 8.81725L7.82316 10.7474C7.83581 11.1685 8.03006 11.4433 8.30981 11.4433L11.4488 11.4518L11.4545 9.07923C11.4545 8.67107 11.2554 8.354 10.9648 8.3353L9.70382 8.32907C9.4249 8.32907 9.20555 8.03893 9.19372 7.6173L9.18882 6.97551C9.20269 6.55449 9.42326 6.26496 9.7028 6.26496L10.9707 6.26858C11.2588 6.25028 11.4465 5.91511 11.4465 5.50755L11.4496 2.5459C11.346 2.71309 11.2043 2.85421 11.0357 2.95807C10.8671 3.06193 10.6763 3.12568 10.4784 3.14426L8.34613 3.14245C8.06843 3.14245 7.83602 3.44083 7.82296 3.86185L7.82296 5.76371C7.8099 6.18393 7.59178 6.4813 7.31285 6.4813L6.66767 6.47647C6.38793 6.47647 6.1643 6.18875 6.15165 5.76974L6.15328 3.84698C6.14063 3.42575 5.91904 3.14326 5.63991 3.14326L2.54562 3.14466L2.54562 5.50997C2.54562 5.91853 2.73925 6.24565 3.02817 6.26455L4.29609 6.25933C4.58277 6.27782 4.78579 6.61481 4.78579 7.02115L4.78192 7.56865C4.78192 7.97701 4.58604 8.30373 4.29793 8.32223L3.02797 8.31921C2.73905 8.33932 2.54541 8.66102 2.54541 9.06938L2.54806 11.4469Z" fill="white"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2.6 KiB |
@ -0,0 +1,11 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>NSExtension</key>
|
||||
<dict>
|
||||
<key>NSExtensionPointIdentifier</key>
|
||||
<string>com.apple.widgetkit-extension</string>
|
||||
</dict>
|
||||
</dict>
|
||||
</plist>
|
||||
@ -0,0 +1,16 @@
|
||||
//
|
||||
// live_notificationBundle.swift
|
||||
// live_notification
|
||||
//
|
||||
// Created by Cloud Solutions on 22/07/2026.
|
||||
//
|
||||
|
||||
import WidgetKit
|
||||
import SwiftUI
|
||||
|
||||
@main
|
||||
struct live_notificationBundle: WidgetBundle {
|
||||
var body: some Widget {
|
||||
live_notificationLiveActivity()
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,583 @@
|
||||
import ActivityKit
|
||||
import WidgetKit
|
||||
import SwiftUI
|
||||
|
||||
|
||||
struct LiveActivitiesAppAttributes: ActivityAttributes, Identifiable {
|
||||
public typealias LiveDeliveryData = ContentState // don't forget to add this line, otherwise, live activity will not display it.
|
||||
|
||||
public struct ContentState: Codable, Hashable { }
|
||||
|
||||
var id = UUID()
|
||||
}
|
||||
|
||||
|
||||
let sharedDefault = UserDefaults(suiteName: "group.alhabib.patientApp")!
|
||||
struct AppWidgetAttributes: ActivityAttributes {
|
||||
public struct ContentState: Codable, Hashable {
|
||||
// Dynamic stateful properties about your activity go here!
|
||||
var emoji: String
|
||||
}
|
||||
|
||||
// Fixed non-changing properties about your activity go here!
|
||||
var name: String
|
||||
}
|
||||
|
||||
extension Color {
|
||||
static let redColorText = Color(hex: "#ED1C2B")
|
||||
static let yellowColor = Color(hex: "#FFAF15")
|
||||
static let successColor = Color(hex: "#18C273")
|
||||
static let inactiveColor = Color(hex: "#FFA2A2A2")
|
||||
static let textColor = Color(hex: "#A2A2A2")
|
||||
static let colorWhite = Color(hex: "#FFFFFF")
|
||||
|
||||
// Helper initializer for hex colors
|
||||
init(hex: String) {
|
||||
let hex = hex.trimmingCharacters(in: CharacterSet.alphanumerics.inverted)
|
||||
var int: UInt64 = 0
|
||||
Scanner(string: hex).scanHexInt64(&int)
|
||||
let a, r, g, b: UInt64
|
||||
switch hex.count {
|
||||
case 3: // RGB (12-bit)
|
||||
(a, r, g, b) = (255, (int >> 8) * 17, (int >> 4 & 0xF) * 17, (int & 0xF) * 17)
|
||||
case 6: // RGB (24-bit)
|
||||
(a, r, g, b) = (255, int >> 16, int >> 8 & 0xFF, int & 0xFF)
|
||||
case 8: // ARGB (32-bit)
|
||||
(a, r, g, b) = (int >> 24, int >> 16 & 0xFF, int >> 8 & 0xFF, int & 0xFF)
|
||||
default:
|
||||
(a, r, g, b) = (255, 0, 0, 0)
|
||||
}
|
||||
self.init(
|
||||
.sRGB,
|
||||
red: Double(r) / 255,
|
||||
green: Double(g) / 255,
|
||||
blue: Double(b) / 255,
|
||||
opacity: Double(a) / 255
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: - Widget Configuration based on nextStepBackground
|
||||
struct WidgetColorConfig {
|
||||
let nextStepBackground: Color
|
||||
let nextStepTextColor: Color
|
||||
let containerBorderColor: Color
|
||||
|
||||
static func config(for value: Int) -> WidgetColorConfig {
|
||||
switch value {
|
||||
case 0:
|
||||
return WidgetColorConfig(
|
||||
nextStepBackground: .inactiveColor,
|
||||
nextStepTextColor: .colorWhite,
|
||||
containerBorderColor: .yellowColor
|
||||
)
|
||||
case 1:
|
||||
return WidgetColorConfig(
|
||||
nextStepBackground: .redColorText,
|
||||
nextStepTextColor: .colorWhite,
|
||||
containerBorderColor: .redColorText
|
||||
)
|
||||
case 2:
|
||||
return WidgetColorConfig(
|
||||
nextStepBackground: .successColor,
|
||||
nextStepTextColor: .colorWhite,
|
||||
containerBorderColor: .successColor
|
||||
)
|
||||
default:
|
||||
return WidgetColorConfig(
|
||||
nextStepBackground: .inactiveColor,
|
||||
nextStepTextColor: .textColor,
|
||||
containerBorderColor: .yellowColor
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: - Widget Data Model
|
||||
struct NotificationWidgetData {
|
||||
let currentTicket: String
|
||||
let currentlyServingHeader: String
|
||||
let currentlyServing: String
|
||||
let currentlyServingStatus: String
|
||||
let nextStep: String
|
||||
let imageName: String
|
||||
let colorConfig: WidgetColorConfig
|
||||
let progress: Double
|
||||
let yourTicketHeaderText : String
|
||||
}
|
||||
struct NotificationWidgetView: View {
|
||||
private let data: NotificationWidgetData
|
||||
private let backgroundColor: Color
|
||||
let animateProgress = false
|
||||
init(data: NotificationWidgetData, backgroundColor: Color = .white) {
|
||||
print("it is being loaded")
|
||||
self.data = data
|
||||
self.backgroundColor = backgroundColor
|
||||
}
|
||||
|
||||
|
||||
var body : some View{
|
||||
ZStack {
|
||||
// Dark background
|
||||
Color(red: 0.15, green: 0.15, blue: 0.15)
|
||||
.ignoresSafeArea()
|
||||
|
||||
// Main card
|
||||
VStack(alignment: .leading, spacing: 0) {
|
||||
// Header section
|
||||
HStack(alignment: .top) {
|
||||
HStack( alignment: .center,spacing: 4) {
|
||||
Text(data.currentTicket)
|
||||
.font(.system(size: 32, weight: .bold, design: .default))
|
||||
.foregroundColor(Color(red: 0, green: 0.2, blue: 0.4))
|
||||
|
||||
Text(data.yourTicketHeaderText)
|
||||
.font(.system(size: 14, weight: .regular))
|
||||
.foregroundColor(Color(hex: "#8F9AA3"))
|
||||
}
|
||||
|
||||
Spacer()
|
||||
|
||||
// Hourglass icon
|
||||
Image("hmg")
|
||||
.frame(width: 24, height:24 )
|
||||
.foregroundColor(Color(hex: "#2E3039"))
|
||||
.padding(.top, 4)
|
||||
}
|
||||
.padding(.top,4)
|
||||
|
||||
.padding(.bottom, 4)
|
||||
|
||||
// Alert banner
|
||||
HStack(spacing: 4) {
|
||||
Image("profession")
|
||||
|
||||
Text(data.nextStep)
|
||||
.font(.system(size: 10, weight: .semibold))
|
||||
.foregroundColor(data.colorConfig.nextStepTextColor)
|
||||
|
||||
}
|
||||
.padding(8)
|
||||
.background(data.colorConfig.nextStepBackground)
|
||||
.cornerRadius(8)
|
||||
.padding(.bottom, 10)
|
||||
|
||||
// // Progress bar
|
||||
// VStack(alignment: .leading) {
|
||||
// ZStack(alignment: .leading) {
|
||||
// // Background track
|
||||
// Capsule()
|
||||
// .fill(Color(red: 0.9, green: 0.9, blue: 0.9))
|
||||
// .frame(height: 4)
|
||||
//
|
||||
// // Progress fill
|
||||
// Capsule()
|
||||
// .fill(Color.green)
|
||||
// .frame(width: data.progress, height: 4)
|
||||
// .animation(
|
||||
// Animation.easeInOut(duration: 1.5)
|
||||
// .delay(0.3),
|
||||
// value: animateProgress
|
||||
// )
|
||||
//
|
||||
// ZStack{
|
||||
// Circle()
|
||||
// .fill(Color.white)
|
||||
// .frame(width: 12, height: 12)
|
||||
//
|
||||
// Circle()
|
||||
// .fill(data.colorConfig.nextStepBackground)
|
||||
// .frame(width: 10, height: 10)
|
||||
//
|
||||
// .animation(
|
||||
// Animation.easeInOut(duration: 1.5)
|
||||
// .delay(0.3),
|
||||
// value: animateProgress
|
||||
// )
|
||||
// }
|
||||
// .offset(x:data.progress)
|
||||
//
|
||||
// }
|
||||
// }
|
||||
// .padding(.bottom, 10)
|
||||
|
||||
// Footer section
|
||||
if !data.currentlyServing.isEmpty {
|
||||
HStack {
|
||||
VStack(alignment: .leading, spacing: 0) {
|
||||
HStack(spacing: 4) {
|
||||
Text(data.currentlyServingHeader)
|
||||
.font(.system(size: 14, weight: .regular))
|
||||
.foregroundColor(Color(hex:"#8F9AA3"))
|
||||
|
||||
Text(data.currentlyServing)
|
||||
.font(.system(size: 18, weight: .bold))
|
||||
.foregroundColor(Color(hex:"#2E3039"))
|
||||
}
|
||||
}
|
||||
|
||||
Spacer()
|
||||
|
||||
// Visiting Nurse badge
|
||||
HStack(spacing: 8) {
|
||||
Image("profession")
|
||||
.font(.system(size: 10, weight: .semibold))
|
||||
.foregroundColor(Color(hex: "#18C273"))
|
||||
|
||||
Text(data.currentlyServingStatus)
|
||||
.font(.system(size: 10, weight: .semibold))
|
||||
.foregroundColor(data.colorConfig.nextStepTextColor)
|
||||
}
|
||||
.padding(8)
|
||||
.background(data.colorConfig.nextStepBackground)
|
||||
.cornerRadius(8)
|
||||
}
|
||||
.padding(.horizontal, 8)
|
||||
.padding(.bottom, 8)
|
||||
}
|
||||
}
|
||||
.padding(24)
|
||||
.background(backgroundColor)
|
||||
.cornerRadius(24)
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
// var body2 : some View {
|
||||
// Text(data.currentTicket)
|
||||
// .font(.custom("Poppins-Medium", size: 28))
|
||||
// .fontWeight(.bold)
|
||||
// .foregroundColor(.black)
|
||||
// .padding(.trailing, 10)
|
||||
// .frame(maxWidth: .infinity, alignment: .leading)
|
||||
// }
|
||||
//current one that todo will be handled
|
||||
// var body2: some View {
|
||||
// VStack(alignment: .leading, spacing: 0) {
|
||||
// // Top section with current ticket and image
|
||||
// HStack(alignment: .top, spacing: 0) {
|
||||
// // Current ticket value
|
||||
// Text(data.currentTicket)
|
||||
// .font(.custom("Poppins-Medium", size: 28))
|
||||
// .fontWeight(.bold)
|
||||
// .foregroundColor(.black)
|
||||
// .padding(.trailing, 10)
|
||||
// .frame(maxWidth: .infinity, alignment: .leading)
|
||||
//
|
||||
// Image(data.imageName)
|
||||
// .resizable()
|
||||
// .scaledToFit()
|
||||
// .frame(width: 34, height: 34)
|
||||
// }
|
||||
// .padding(.top, 16)
|
||||
// .padding(.horizontal, 16)
|
||||
//
|
||||
// // Currently Serving Header
|
||||
// Text(data.currentlyServingHeader)
|
||||
// .font(.custom("Poppins-Medium", size: 14))
|
||||
// .fontWeight(.bold)
|
||||
// .foregroundColor(.black)
|
||||
// .padding(.trailing, 12)
|
||||
// .padding(.bottom, 10)
|
||||
// .padding(.horizontal, 16)
|
||||
//
|
||||
// // Currently Serving section with currentlyServingStatus
|
||||
// HStack(alignment: .center, spacing: 0) {
|
||||
// // Currently serving text
|
||||
// Text(data.currentlyServing)
|
||||
// .font(.custom("Poppins-Medium", size: 16))
|
||||
// .fontWeight(.bold)
|
||||
// .foregroundColor(.black)
|
||||
// .frame(maxWidth: .infinity, alignment: .leading)
|
||||
//
|
||||
// // currentlyServingStatus badge
|
||||
// Text(data.currentlyServingStatus)
|
||||
// .font(.custom("Poppins-Medium", size: 12))
|
||||
// .foregroundColor(data.colorConfig.nextStepTextColor)
|
||||
// .padding(.horizontal, 12)
|
||||
// .padding(.vertical, 8)
|
||||
// .background(
|
||||
// RoundedRectangle(cornerRadius: 8)
|
||||
// .fill(Color.inactiveColor.opacity(0.2))
|
||||
// )
|
||||
// }
|
||||
// .padding(.horizontal, 16)
|
||||
// Spacer()
|
||||
// // Next Step badge
|
||||
// Text(data.nextStep)
|
||||
// .font(.custom("Poppins-Medium", size: 12))
|
||||
// .foregroundColor(data.colorConfig.nextStepTextColor)
|
||||
// .padding(.horizontal, 12)
|
||||
// .padding(.vertical, 8)
|
||||
// .background(
|
||||
// RoundedRectangle(cornerRadius: 8)
|
||||
// .fill(data.colorConfig.nextStepBackground)
|
||||
// )
|
||||
// .padding(.horizontal, 16)
|
||||
// .padding(.bottom, 16)
|
||||
// }
|
||||
// .background(Color.black.opacity(0.01))
|
||||
// .cornerRadius(20)
|
||||
|
||||
// .border(width: 10, edges: [.top, .bottom], color: data.colorConfig.containerBorderColor)
|
||||
// .border(width: 2, edges: [.leading, .trailing], color: data.colorConfig.containerBorderColor)
|
||||
// .overlay(
|
||||
// RoundedRectangle(cornerRadius: 20)
|
||||
// .stroke(data.colorConfig.containerBorderColor, lineWidth: 20)
|
||||
// )
|
||||
// }
|
||||
}
|
||||
|
||||
|
||||
// MARK: - Live Activity Widget
|
||||
struct live_notificationLiveActivity: Widget {
|
||||
|
||||
var body: some WidgetConfiguration {
|
||||
ActivityConfiguration(for: LiveActivitiesAppAttributes.self) { context in
|
||||
|
||||
// Extract parameters from Flutter
|
||||
|
||||
// print("the queno is \(context.attributes.prefixedKey("title")) ===== \(sharedDefault.string(forKey: context.attributes.prefixedKey("queueNo")) )")
|
||||
// let title = sharedDefault.string(forKey: context.attributes.prefixedKey("title")) ?? "testes"
|
||||
// let contentText = sharedDefault.string(forKey: context.attributes.prefixedKey("contentText")) ?? "tested"
|
||||
// let currentTicket = sharedDefault.string(forKey: context.attributes.prefixedKey("queueNo")) ?? "test1234"
|
||||
// let currentlyServingStatus = sharedDefault.string(forKey: context.attributes.prefixedKey("callType")) ?? "test3345"
|
||||
// let currentlyServing = sharedDefault.string(forKey: context.attributes.prefixedKey("currentlyServingTitle")) ?? "tes"
|
||||
// let nextStep = sharedDefault.string(forKey: context.attributes.prefixedKey("currentlyServingcurrentlyServingStatus")) ??
|
||||
// "test111"
|
||||
// let nextStepBackground = sharedDefault.integer(forKey: context.attributes.prefixedKey("currentlyServingCallType"))
|
||||
|
||||
// let title = sharedDefault.string(forKey: context.attributes.prefixedKey("title")) ?? "testes"
|
||||
// let contentText = sharedDefault.string(forKey: context.attributes.prefixedKey("contentText")) ?? "tested"
|
||||
let currentTicket = getValueFromSharedDefaults("queueNo")
|
||||
let currentlyServingStatus = getValueFromSharedDefaults("currentlyServingStatus") ?? "test3345"
|
||||
let currentlyServing = getValueFromSharedDefaults("currentlyServingToken")
|
||||
let currentlyServingHeader = getValueFromSharedDefaults("currentlyServingTitle")
|
||||
let yourTicketHeader = getValueFromSharedDefaults("yourTicketHeader")
|
||||
let nextStep = getValueFromSharedDefaults("nextTicketStatus")
|
||||
let nextStepBackground = Int(sharedDefault.string(forKey: context.attributes.prefixedKey("currentlyServingCallType")) ?? "0") ?? 0
|
||||
let callType = sharedDefault.integer(forKey: context.attributes.prefixedKey("callType")) ?? 0
|
||||
|
||||
|
||||
|
||||
|
||||
// Get color configuration based on nextStepBackground
|
||||
let colorConfig = WidgetColorConfig.config(for: callType)
|
||||
|
||||
// Create widget data
|
||||
let widgetData = NotificationWidgetData(
|
||||
currentTicket: currentTicket,
|
||||
currentlyServingHeader: currentlyServingHeader,
|
||||
currentlyServing: currentlyServing,
|
||||
currentlyServingStatus: currentlyServingStatus,
|
||||
nextStep: nextStep,
|
||||
imageName:"hmg",
|
||||
colorConfig: colorConfig,
|
||||
progress: 33 * Double(callType),
|
||||
yourTicketHeaderText : yourTicketHeader,
|
||||
)
|
||||
//
|
||||
// Lock screen/banner UI
|
||||
NotificationWidgetView(data: widgetData)
|
||||
|
||||
|
||||
// Text(widgetData.currentTicket)
|
||||
// .font(.custom("Poppins-Medium", size: 28))
|
||||
// .fontWeight(.bold)
|
||||
// .foregroundColor(.black)
|
||||
// .padding(.trailing, 10)
|
||||
// .frame(maxWidth: .infinity, alignment: .leading)
|
||||
|
||||
} dynamicIsland: { context in
|
||||
|
||||
let currentTicket = getValueFromSharedDefaults("queueNo")
|
||||
let currentlyServingStatus = getValueFromSharedDefaults("currentlyServingStatus") ?? "test3345"
|
||||
let currentlyServing = getValueFromSharedDefaults("currentlyServingToken")
|
||||
let nextStep = getValueFromSharedDefaults("nextTicketStatus")
|
||||
let nextStepBackground = Int(sharedDefault.string(forKey: context.attributes.prefixedKey("currentlyServingCallType")) ?? "0") ?? 0
|
||||
let currentlyServingHeader = getValueFromSharedDefaults("currentlyServingTitle")
|
||||
let yourTicketHeader = getValueFromSharedDefaults("yourTicketHeader")
|
||||
let callType = sharedDefault.integer(forKey: context.attributes.prefixedKey("callType")) ?? 0
|
||||
|
||||
|
||||
|
||||
let colorConfig = WidgetColorConfig.config(for: callType)
|
||||
let widgetData = NotificationWidgetData(
|
||||
currentTicket: currentTicket,
|
||||
currentlyServingHeader: currentlyServingHeader,
|
||||
currentlyServing: currentlyServing,
|
||||
currentlyServingStatus: currentlyServingStatus,
|
||||
nextStep: nextStep,
|
||||
imageName:"hmg",
|
||||
colorConfig: colorConfig,
|
||||
progress: 33 * Double(callType),
|
||||
yourTicketHeaderText: yourTicketHeader
|
||||
)
|
||||
return DynamicIsland {
|
||||
|
||||
//
|
||||
// Lock screen/banner UI
|
||||
|
||||
|
||||
// // Expanded UI
|
||||
DynamicIslandExpandedRegion(.center) {
|
||||
NotificationWidgetView(data: widgetData, backgroundColor: .black.opacity(0.4)).padding(-24)
|
||||
}
|
||||
|
||||
// DynamicIslandExpandedRegion(.trailing) {
|
||||
// Image("hmg")
|
||||
// .resizable()
|
||||
// .scaledToFit()
|
||||
// .frame(width: 34, height: 34)
|
||||
// .foregroundColor(.gray)
|
||||
// }
|
||||
//
|
||||
// DynamicIslandExpandedRegion(.center) {
|
||||
// VStack(spacing: 4) {
|
||||
// Text("Currently Servings:")
|
||||
// .font(.caption2)
|
||||
// .foregroundColor(.secondary)
|
||||
//
|
||||
// Text(currentlyServing)
|
||||
// .font(.caption)
|
||||
// .fontWeight(.semibold)
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// DynamicIslandExpandedRegion(.bottom) {
|
||||
// HStack {
|
||||
// Text(currentlyServingStatus)
|
||||
// .font(.caption2)
|
||||
// .padding(.horizontal, 8)
|
||||
// .padding(.vertical, 4)
|
||||
// .background(
|
||||
// RoundedRectangle(cornerRadius: 6)
|
||||
// .fill(colorConfig.nextStepBackground.opacity(0.2))
|
||||
// )
|
||||
//
|
||||
// Spacer()
|
||||
//
|
||||
// Text(nextStep)
|
||||
// .font(.caption2)
|
||||
// .foregroundColor(colorConfig.nextStepTextColor)
|
||||
// .padding(.horizontal, 8)
|
||||
// .padding(.vertical, 4)
|
||||
// .background(
|
||||
// RoundedRectangle(cornerRadius: 6)
|
||||
// .fill(colorConfig.nextStepBackground)
|
||||
// )
|
||||
// }
|
||||
// .padding(.horizontal)
|
||||
// }
|
||||
|
||||
} compactLeading: {
|
||||
// Compact leading view
|
||||
Text(currentTicket)
|
||||
.font(.caption2)
|
||||
.fontWeight(.bold)
|
||||
} compactTrailing: {
|
||||
// Compact trailing view
|
||||
Image("hmg")
|
||||
.resizable()
|
||||
.scaledToFit()
|
||||
.frame(width: 12, height: 12)
|
||||
.foregroundColor(colorConfig.containerBorderColor).padding(4)
|
||||
} minimal: {
|
||||
// Minimal view
|
||||
HStack{
|
||||
Text(currentTicket)
|
||||
.font(.caption2)
|
||||
.fontWeight(.bold)
|
||||
Spacer()
|
||||
Image("hmg")
|
||||
.resizable()
|
||||
.scaledToFit()
|
||||
.frame(width: 4, height: 4)
|
||||
.foregroundColor(colorConfig.containerBorderColor)
|
||||
}.padding(2)
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
extension LiveActivitiesAppAttributes {
|
||||
func prefixedKey(_ key: String) -> String {
|
||||
print("the id is \(id)")
|
||||
return "\(id)_\(key)"
|
||||
}
|
||||
}
|
||||
|
||||
//struct NotificationWidgetView_Previews: PreviewProvider {
|
||||
// static var previews: some View {
|
||||
// Group {
|
||||
// // Preview with nextStepBackground = 0 (Yellow border)
|
||||
// NotificationWidgetView(
|
||||
// data: NotificationWidgetData(
|
||||
// currentTicket: "42",
|
||||
// currentlyServingHeader: "Currently Serving3:",
|
||||
// currentlyServing: "Customer #15",
|
||||
// currentlyServingStatus: "Pending",
|
||||
// nextStep: "Next: Prepare Order",
|
||||
// imageName: "bell.fill",
|
||||
// colorConfig: .config(for: 0)
|
||||
// )
|
||||
// )
|
||||
// .previewDisplayName("Yellow Border (0)")
|
||||
//
|
||||
// // Preview with nextStepBackground = 1 (Red border)
|
||||
// NotificationWidgetView(
|
||||
// data: NotificationWidgetData(
|
||||
// currentTicket: "89",
|
||||
// currentlyServingHeader: "Currently Serving2:",
|
||||
// currentlyServing: "Customer #67",
|
||||
// currentlyServingStatus: "Active",
|
||||
// nextStep: "Next: Quality Check",
|
||||
// imageName: "bell.fill",
|
||||
// colorConfig: .config(for: 1)
|
||||
// )
|
||||
// )
|
||||
// .previewDisplayName("Red Border (1)")
|
||||
//
|
||||
// // Preview with nextStepBackground = 2 (Green border)
|
||||
// NotificationWidgetView(
|
||||
// data: NotificationWidgetData(
|
||||
// currentTicket: "125",
|
||||
// currentlyServingHeader: "Currently Serving1:",
|
||||
// currentlyServing: "Customer #98",
|
||||
// currentlyServingStatus: "Completed",
|
||||
// nextStep: "Next: Ready for Pickup",
|
||||
// imageName: "bell.fill",
|
||||
// colorConfig: .config(for: 2)
|
||||
// )
|
||||
// )
|
||||
// .previewDisplayName("Green Border (2)")
|
||||
// }
|
||||
// .padding()
|
||||
// .previewLayout(.sizeThatFits)
|
||||
// }
|
||||
//}
|
||||
|
||||
|
||||
func getValueFromSharedDefaults(_ containingString: String) -> String {
|
||||
print("Function `getValueFromSharedDefaults` is being called")
|
||||
let dictionary = sharedDefault.dictionaryRepresentation()
|
||||
print("Contents of sharedDefault: \(dictionary)")
|
||||
|
||||
for (key, value) in dictionary {
|
||||
print("Inspecting key: \(key), value: \(value)")
|
||||
|
||||
if key.contains(containingString) {
|
||||
let components = key.split(separator: "_")
|
||||
if let stringValue = value as? String {
|
||||
return stringValue
|
||||
} else {
|
||||
return ""
|
||||
}
|
||||
}
|
||||
}
|
||||
return ""
|
||||
}
|
||||
@ -0,0 +1,10 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>com.apple.security.application-groups</key>
|
||||
<array>
|
||||
<string>group.alhabib.patientApp</string>
|
||||
</array>
|
||||
</dict>
|
||||
</plist>
|
||||
@ -0,0 +1,18 @@
|
||||
//
|
||||
// AppIntent.swift
|
||||
// live_notifications
|
||||
//
|
||||
// Created by Haroon Amjad on 20/07/2026.
|
||||
//
|
||||
|
||||
import WidgetKit
|
||||
import AppIntents
|
||||
|
||||
struct ConfigurationAppIntent: WidgetConfigurationIntent {
|
||||
static var title: LocalizedStringResource { "Configuration" }
|
||||
static var description: IntentDescription { "This is an example widget." }
|
||||
|
||||
// An example configurable parameter.
|
||||
@Parameter(title: "Favorite Emoji", default: "😃")
|
||||
var favoriteEmoji: String
|
||||
}
|
||||
@ -0,0 +1,11 @@
|
||||
{
|
||||
"colors" : [
|
||||
{
|
||||
"idiom" : "universal"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"author" : "xcode",
|
||||
"version" : 1
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,35 @@
|
||||
{
|
||||
"images" : [
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"platform" : "ios",
|
||||
"size" : "1024x1024"
|
||||
},
|
||||
{
|
||||
"appearances" : [
|
||||
{
|
||||
"appearance" : "luminosity",
|
||||
"value" : "dark"
|
||||
}
|
||||
],
|
||||
"idiom" : "universal",
|
||||
"platform" : "ios",
|
||||
"size" : "1024x1024"
|
||||
},
|
||||
{
|
||||
"appearances" : [
|
||||
{
|
||||
"appearance" : "luminosity",
|
||||
"value" : "tinted"
|
||||
}
|
||||
],
|
||||
"idiom" : "universal",
|
||||
"platform" : "ios",
|
||||
"size" : "1024x1024"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"author" : "xcode",
|
||||
"version" : 1
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,6 @@
|
||||
{
|
||||
"info" : {
|
||||
"author" : "xcode",
|
||||
"version" : 1
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,11 @@
|
||||
{
|
||||
"colors" : [
|
||||
{
|
||||
"idiom" : "universal"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"author" : "xcode",
|
||||
"version" : 1
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,23 @@
|
||||
{
|
||||
"images" : [
|
||||
{
|
||||
"filename" : "hmg.svg",
|
||||
"idiom" : "universal",
|
||||
"scale" : "1x"
|
||||
},
|
||||
{
|
||||
"filename" : "hmg 1.svg",
|
||||
"idiom" : "universal",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"filename" : "hmg 2.svg",
|
||||
"idiom" : "universal",
|
||||
"scale" : "3x"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"author" : "xcode",
|
||||
"version" : 1
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,5 @@
|
||||
<svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<rect width="14" height="14" rx="3" fill="#ED1C2B"/>
|
||||
<path d="M2.54806 11.4469C2.54806 11.4469 2.98492 11.4437 3.29241 11.4437L5.6242 11.455C5.90252 11.455 6.13431 11.1634 6.14737 10.7422L6.15002 8.82227C6.15002 8.41291 6.3357 8.09262 6.6236 8.07432L7.33877 8.06869C7.62708 8.08618 7.825 8.4105 7.825 8.81725L7.82316 10.7474C7.83581 11.1685 8.03006 11.4433 8.30981 11.4433L11.4488 11.4518L11.4545 9.07923C11.4545 8.67107 11.2554 8.354 10.9648 8.3353L9.70382 8.32907C9.4249 8.32907 9.20555 8.03893 9.19372 7.6173L9.18882 6.97551C9.20269 6.55449 9.42326 6.26496 9.7028 6.26496L10.9707 6.26858C11.2588 6.25028 11.4465 5.91511 11.4465 5.50755L11.4496 2.5459C11.346 2.71309 11.2043 2.85421 11.0357 2.95807C10.8671 3.06193 10.6763 3.12568 10.4784 3.14426L8.34613 3.14245C8.06843 3.14245 7.83602 3.44083 7.82296 3.86185L7.82296 5.76371C7.8099 6.18393 7.59178 6.4813 7.31285 6.4813L6.66767 6.47647C6.38793 6.47647 6.1643 6.18875 6.15165 5.76974L6.15328 3.84698C6.14063 3.42575 5.91904 3.14326 5.63991 3.14326L2.54562 3.14466L2.54562 5.50997C2.54562 5.91853 2.73925 6.24565 3.02817 6.26455L4.29609 6.25933C4.58277 6.27782 4.78579 6.61481 4.78579 7.02115L4.78192 7.56865C4.78192 7.97701 4.58604 8.30373 4.29793 8.32223L3.02797 8.31921C2.73905 8.33932 2.54541 8.66102 2.54541 9.06938L2.54806 11.4469Z" fill="white"/>
|
||||
<path d="M2.54806 11.4469C2.54806 11.4469 2.98492 11.4437 3.29241 11.4437L5.6242 11.455C5.90252 11.455 6.13431 11.1634 6.14737 10.7422L6.15002 8.82227C6.15002 8.41291 6.3357 8.09262 6.6236 8.07432L7.33877 8.06869C7.62708 8.08618 7.825 8.4105 7.825 8.81725L7.82316 10.7474C7.83581 11.1685 8.03006 11.4433 8.30981 11.4433L11.4488 11.4518L11.4545 9.07923C11.4545 8.67107 11.2554 8.354 10.9648 8.3353L9.70382 8.32907C9.4249 8.32907 9.20555 8.03893 9.19372 7.6173L9.18882 6.97551C9.20269 6.55449 9.42326 6.26496 9.7028 6.26496L10.9707 6.26858C11.2588 6.25028 11.4465 5.91511 11.4465 5.50755L11.4496 2.5459C11.346 2.71309 11.2043 2.85421 11.0357 2.95807C10.8671 3.06193 10.6763 3.12568 10.4784 3.14426L8.34613 3.14245C8.06843 3.14245 7.83602 3.44083 7.82296 3.86185L7.82296 5.76371C7.8099 6.18393 7.59178 6.4813 7.31285 6.4813L6.66767 6.47647C6.38793 6.47647 6.1643 6.18875 6.15165 5.76974L6.15328 3.84698C6.14063 3.42575 5.91904 3.14326 5.63991 3.14326L2.54562 3.14466L2.54562 5.50997C2.54562 5.91853 2.73925 6.24565 3.02817 6.26455L4.29609 6.25933C4.58277 6.27782 4.78579 6.61481 4.78579 7.02115L4.78192 7.56865C4.78192 7.97701 4.58604 8.30373 4.29793 8.32223L3.02797 8.31921C2.73905 8.33932 2.54541 8.66102 2.54541 9.06938L2.54806 11.4469Z" fill="white"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2.6 KiB |
@ -0,0 +1,5 @@
|
||||
<svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<rect width="14" height="14" rx="3" fill="#ED1C2B"/>
|
||||
<path d="M2.54806 11.4469C2.54806 11.4469 2.98492 11.4437 3.29241 11.4437L5.6242 11.455C5.90252 11.455 6.13431 11.1634 6.14737 10.7422L6.15002 8.82227C6.15002 8.41291 6.3357 8.09262 6.6236 8.07432L7.33877 8.06869C7.62708 8.08618 7.825 8.4105 7.825 8.81725L7.82316 10.7474C7.83581 11.1685 8.03006 11.4433 8.30981 11.4433L11.4488 11.4518L11.4545 9.07923C11.4545 8.67107 11.2554 8.354 10.9648 8.3353L9.70382 8.32907C9.4249 8.32907 9.20555 8.03893 9.19372 7.6173L9.18882 6.97551C9.20269 6.55449 9.42326 6.26496 9.7028 6.26496L10.9707 6.26858C11.2588 6.25028 11.4465 5.91511 11.4465 5.50755L11.4496 2.5459C11.346 2.71309 11.2043 2.85421 11.0357 2.95807C10.8671 3.06193 10.6763 3.12568 10.4784 3.14426L8.34613 3.14245C8.06843 3.14245 7.83602 3.44083 7.82296 3.86185L7.82296 5.76371C7.8099 6.18393 7.59178 6.4813 7.31285 6.4813L6.66767 6.47647C6.38793 6.47647 6.1643 6.18875 6.15165 5.76974L6.15328 3.84698C6.14063 3.42575 5.91904 3.14326 5.63991 3.14326L2.54562 3.14466L2.54562 5.50997C2.54562 5.91853 2.73925 6.24565 3.02817 6.26455L4.29609 6.25933C4.58277 6.27782 4.78579 6.61481 4.78579 7.02115L4.78192 7.56865C4.78192 7.97701 4.58604 8.30373 4.29793 8.32223L3.02797 8.31921C2.73905 8.33932 2.54541 8.66102 2.54541 9.06938L2.54806 11.4469Z" fill="white"/>
|
||||
<path d="M2.54806 11.4469C2.54806 11.4469 2.98492 11.4437 3.29241 11.4437L5.6242 11.455C5.90252 11.455 6.13431 11.1634 6.14737 10.7422L6.15002 8.82227C6.15002 8.41291 6.3357 8.09262 6.6236 8.07432L7.33877 8.06869C7.62708 8.08618 7.825 8.4105 7.825 8.81725L7.82316 10.7474C7.83581 11.1685 8.03006 11.4433 8.30981 11.4433L11.4488 11.4518L11.4545 9.07923C11.4545 8.67107 11.2554 8.354 10.9648 8.3353L9.70382 8.32907C9.4249 8.32907 9.20555 8.03893 9.19372 7.6173L9.18882 6.97551C9.20269 6.55449 9.42326 6.26496 9.7028 6.26496L10.9707 6.26858C11.2588 6.25028 11.4465 5.91511 11.4465 5.50755L11.4496 2.5459C11.346 2.71309 11.2043 2.85421 11.0357 2.95807C10.8671 3.06193 10.6763 3.12568 10.4784 3.14426L8.34613 3.14245C8.06843 3.14245 7.83602 3.44083 7.82296 3.86185L7.82296 5.76371C7.8099 6.18393 7.59178 6.4813 7.31285 6.4813L6.66767 6.47647C6.38793 6.47647 6.1643 6.18875 6.15165 5.76974L6.15328 3.84698C6.14063 3.42575 5.91904 3.14326 5.63991 3.14326L2.54562 3.14466L2.54562 5.50997C2.54562 5.91853 2.73925 6.24565 3.02817 6.26455L4.29609 6.25933C4.58277 6.27782 4.78579 6.61481 4.78579 7.02115L4.78192 7.56865C4.78192 7.97701 4.58604 8.30373 4.29793 8.32223L3.02797 8.31921C2.73905 8.33932 2.54541 8.66102 2.54541 9.06938L2.54806 11.4469Z" fill="white"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2.6 KiB |
@ -0,0 +1,5 @@
|
||||
<svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<rect width="14" height="14" rx="3" fill="#ED1C2B"/>
|
||||
<path d="M2.54806 11.4469C2.54806 11.4469 2.98492 11.4437 3.29241 11.4437L5.6242 11.455C5.90252 11.455 6.13431 11.1634 6.14737 10.7422L6.15002 8.82227C6.15002 8.41291 6.3357 8.09262 6.6236 8.07432L7.33877 8.06869C7.62708 8.08618 7.825 8.4105 7.825 8.81725L7.82316 10.7474C7.83581 11.1685 8.03006 11.4433 8.30981 11.4433L11.4488 11.4518L11.4545 9.07923C11.4545 8.67107 11.2554 8.354 10.9648 8.3353L9.70382 8.32907C9.4249 8.32907 9.20555 8.03893 9.19372 7.6173L9.18882 6.97551C9.20269 6.55449 9.42326 6.26496 9.7028 6.26496L10.9707 6.26858C11.2588 6.25028 11.4465 5.91511 11.4465 5.50755L11.4496 2.5459C11.346 2.71309 11.2043 2.85421 11.0357 2.95807C10.8671 3.06193 10.6763 3.12568 10.4784 3.14426L8.34613 3.14245C8.06843 3.14245 7.83602 3.44083 7.82296 3.86185L7.82296 5.76371C7.8099 6.18393 7.59178 6.4813 7.31285 6.4813L6.66767 6.47647C6.38793 6.47647 6.1643 6.18875 6.15165 5.76974L6.15328 3.84698C6.14063 3.42575 5.91904 3.14326 5.63991 3.14326L2.54562 3.14466L2.54562 5.50997C2.54562 5.91853 2.73925 6.24565 3.02817 6.26455L4.29609 6.25933C4.58277 6.27782 4.78579 6.61481 4.78579 7.02115L4.78192 7.56865C4.78192 7.97701 4.58604 8.30373 4.29793 8.32223L3.02797 8.31921C2.73905 8.33932 2.54541 8.66102 2.54541 9.06938L2.54806 11.4469Z" fill="white"/>
|
||||
<path d="M2.54806 11.4469C2.54806 11.4469 2.98492 11.4437 3.29241 11.4437L5.6242 11.455C5.90252 11.455 6.13431 11.1634 6.14737 10.7422L6.15002 8.82227C6.15002 8.41291 6.3357 8.09262 6.6236 8.07432L7.33877 8.06869C7.62708 8.08618 7.825 8.4105 7.825 8.81725L7.82316 10.7474C7.83581 11.1685 8.03006 11.4433 8.30981 11.4433L11.4488 11.4518L11.4545 9.07923C11.4545 8.67107 11.2554 8.354 10.9648 8.3353L9.70382 8.32907C9.4249 8.32907 9.20555 8.03893 9.19372 7.6173L9.18882 6.97551C9.20269 6.55449 9.42326 6.26496 9.7028 6.26496L10.9707 6.26858C11.2588 6.25028 11.4465 5.91511 11.4465 5.50755L11.4496 2.5459C11.346 2.71309 11.2043 2.85421 11.0357 2.95807C10.8671 3.06193 10.6763 3.12568 10.4784 3.14426L8.34613 3.14245C8.06843 3.14245 7.83602 3.44083 7.82296 3.86185L7.82296 5.76371C7.8099 6.18393 7.59178 6.4813 7.31285 6.4813L6.66767 6.47647C6.38793 6.47647 6.1643 6.18875 6.15165 5.76974L6.15328 3.84698C6.14063 3.42575 5.91904 3.14326 5.63991 3.14326L2.54562 3.14466L2.54562 5.50997C2.54562 5.91853 2.73925 6.24565 3.02817 6.26455L4.29609 6.25933C4.58277 6.27782 4.78579 6.61481 4.78579 7.02115L4.78192 7.56865C4.78192 7.97701 4.58604 8.30373 4.29793 8.32223L3.02797 8.31921C2.73905 8.33932 2.54541 8.66102 2.54541 9.06938L2.54806 11.4469Z" fill="white"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2.6 KiB |
@ -0,0 +1,11 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>NSExtension</key>
|
||||
<dict>
|
||||
<key>NSExtensionPointIdentifier</key>
|
||||
<string>com.apple.widgetkit-extension</string>
|
||||
</dict>
|
||||
</dict>
|
||||
</plist>
|
||||
@ -0,0 +1,84 @@
|
||||
//
|
||||
// live_notifications.swift
|
||||
// live_notifications
|
||||
//
|
||||
// Created by Cloud Solutions on 21/07/2026.
|
||||
//
|
||||
|
||||
import WidgetKit
|
||||
import SwiftUI
|
||||
|
||||
struct Provider: TimelineProvider {
|
||||
func placeholder(in context: Context) -> SimpleEntry {
|
||||
SimpleEntry(date: Date(), emoji: "😀")
|
||||
}
|
||||
|
||||
func getSnapshot(in context: Context, completion: @escaping (SimpleEntry) -> ()) {
|
||||
let entry = SimpleEntry(date: Date(), emoji: "😀")
|
||||
completion(entry)
|
||||
}
|
||||
|
||||
func getTimeline(in context: Context, completion: @escaping (Timeline<Entry>) -> ()) {
|
||||
var entries: [SimpleEntry] = []
|
||||
|
||||
// Generate a timeline consisting of five entries an hour apart, starting from the current date.
|
||||
let currentDate = Date()
|
||||
for hourOffset in 0 ..< 5 {
|
||||
let entryDate = Calendar.current.date(byAdding: .hour, value: hourOffset, to: currentDate)!
|
||||
let entry = SimpleEntry(date: entryDate, emoji: "😀")
|
||||
entries.append(entry)
|
||||
}
|
||||
|
||||
let timeline = Timeline(entries: entries, policy: .atEnd)
|
||||
completion(timeline)
|
||||
}
|
||||
|
||||
// func relevances() async -> WidgetRelevances<Void> {
|
||||
// // Generate a list containing the contexts this widget is relevant in.
|
||||
// }
|
||||
}
|
||||
|
||||
struct SimpleEntry: TimelineEntry {
|
||||
let date: Date
|
||||
let emoji: String
|
||||
}
|
||||
|
||||
struct live_notificationEntryView : View {
|
||||
var entry: Provider.Entry
|
||||
|
||||
var body: some View {
|
||||
VStack {
|
||||
Text("Time:")
|
||||
Text(entry.date, style: .time)
|
||||
|
||||
Text("Emoji:")
|
||||
Text(entry.emoji)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
struct live_notification: Widget {
|
||||
let kind: String = "live_notifications"
|
||||
|
||||
var body: some WidgetConfiguration {
|
||||
StaticConfiguration(kind: kind, provider: Provider()) { entry in
|
||||
if #available(iOS 17.0, *) {
|
||||
live_notificationEntryView(entry: entry)
|
||||
.containerBackground(.fill.tertiary, for: .widget)
|
||||
} else {
|
||||
live_notificationEntryView(entry: entry)
|
||||
.padding()
|
||||
.background()
|
||||
}
|
||||
}
|
||||
.configurationDisplayName("My Widget")
|
||||
.description("This is an example widget.")
|
||||
}
|
||||
}
|
||||
|
||||
#Preview(as: .systemSmall) {
|
||||
live_notification()
|
||||
} timeline: {
|
||||
SimpleEntry(date: .now, emoji: "😀")
|
||||
SimpleEntry(date: .now, emoji: "🤩")
|
||||
}
|
||||
@ -0,0 +1,16 @@
|
||||
//
|
||||
// live_notificationBundle.swift
|
||||
// live_notifications
|
||||
//
|
||||
// Created by Haroon Amjad on 20/07/2026.
|
||||
//
|
||||
|
||||
import WidgetKit
|
||||
import SwiftUI
|
||||
|
||||
@main
|
||||
struct live_notificationBundle: WidgetBundle {
|
||||
var body: some Widget {
|
||||
live_notificationLiveActivity()
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,420 @@
|
||||
import ActivityKit
|
||||
import WidgetKit
|
||||
import SwiftUI
|
||||
|
||||
struct LiveActivitiesAppAttributes: ActivityAttributes, Identifiable {
|
||||
public typealias LiveDeliveryData = ContentState // don't forget to add this line, otherwise, live activity will not display it.
|
||||
|
||||
public struct ContentState: Codable, Hashable { }
|
||||
|
||||
var id = UUID()
|
||||
}
|
||||
|
||||
|
||||
let sharedDefault = UserDefaults(suiteName: "group.alhabib.patientApp")!
|
||||
struct AppWidgetAttributes: ActivityAttributes {
|
||||
public struct ContentState: Codable, Hashable {
|
||||
// Dynamic stateful properties about your activity go here!
|
||||
var emoji: String
|
||||
}
|
||||
|
||||
// Fixed non-changing properties about your activity go here!
|
||||
var name: String
|
||||
}
|
||||
|
||||
extension Color {
|
||||
static let redColorText = Color(hex: "#ED1C2B")
|
||||
static let yellowColor = Color(hex: "#FFAF15")
|
||||
static let successColor = Color(hex: "#18C273")
|
||||
static let inactiveColor = Color(hex: "#ED1C2B")
|
||||
static let textColor = Color(hex: "#A2A2A2")
|
||||
static let colorWhite = Color(hex: "#FFFFFF")
|
||||
|
||||
// Helper initializer for hex colors
|
||||
init(hex: String) {
|
||||
let hex = hex.trimmingCharacters(in: CharacterSet.alphanumerics.inverted)
|
||||
var int: UInt64 = 0
|
||||
Scanner(string: hex).scanHexInt64(&int)
|
||||
let a, r, g, b: UInt64
|
||||
switch hex.count {
|
||||
case 3: // RGB (12-bit)
|
||||
(a, r, g, b) = (255, (int >> 8) * 17, (int >> 4 & 0xF) * 17, (int & 0xF) * 17)
|
||||
case 6: // RGB (24-bit)
|
||||
(a, r, g, b) = (255, int >> 16, int >> 8 & 0xFF, int & 0xFF)
|
||||
case 8: // ARGB (32-bit)
|
||||
(a, r, g, b) = (int >> 24, int >> 16 & 0xFF, int >> 8 & 0xFF, int & 0xFF)
|
||||
default:
|
||||
(a, r, g, b) = (255, 0, 0, 0)
|
||||
}
|
||||
self.init(
|
||||
.sRGB,
|
||||
red: Double(r) / 255,
|
||||
green: Double(g) / 255,
|
||||
blue: Double(b) / 255,
|
||||
opacity: Double(a) / 255
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: - Widget Configuration based on currentServingStatusBackground
|
||||
struct WidgetColorConfig {
|
||||
let currentServingStatusBackground: Color
|
||||
let currentServingStatusTextColor: Color
|
||||
let containerBorderColor: Color
|
||||
|
||||
static func config(for value: Int) -> WidgetColorConfig {
|
||||
switch value {
|
||||
case 0:
|
||||
return WidgetColorConfig(
|
||||
currentServingStatusBackground: .inactiveColor,
|
||||
currentServingStatusTextColor: .textColor,
|
||||
containerBorderColor: .yellowColor
|
||||
)
|
||||
case 1:
|
||||
return WidgetColorConfig(
|
||||
currentServingStatusBackground: .redColorText,
|
||||
currentServingStatusTextColor: .colorWhite,
|
||||
containerBorderColor: .redColorText
|
||||
)
|
||||
case 2:
|
||||
return WidgetColorConfig(
|
||||
currentServingStatusBackground: .successColor,
|
||||
currentServingStatusTextColor: .colorWhite,
|
||||
containerBorderColor: .successColor
|
||||
)
|
||||
default:
|
||||
return WidgetColorConfig(
|
||||
currentServingStatusBackground: .inactiveColor,
|
||||
currentServingStatusTextColor: .textColor,
|
||||
containerBorderColor: .yellowColor
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: - Widget Data Model
|
||||
struct NotificationWidgetData {
|
||||
let queueNo: String
|
||||
let yourTicketHeader: String
|
||||
let currentlyServing: String
|
||||
let status: Int
|
||||
let currentServingStatus: String
|
||||
let imageName: String
|
||||
let nextTicketStatus: String
|
||||
let colorConfig: WidgetColorConfig
|
||||
}
|
||||
struct NotificationWidgetView: View {
|
||||
private let data: NotificationWidgetData
|
||||
|
||||
init(data: NotificationWidgetData) {
|
||||
print("it is being loaded")
|
||||
self.data = data
|
||||
}
|
||||
|
||||
|
||||
var body : some View{
|
||||
// ZStack(){
|
||||
body2
|
||||
// .frame(width: .infinity, height: 400 )
|
||||
// .padding(.top, 340)
|
||||
// .cornerRadius(20)
|
||||
// }.background(data.colorConfig.containerBorderColor)
|
||||
// .cornerRadius(20)
|
||||
|
||||
}
|
||||
// var body2 : some View {
|
||||
// Text(data.queueNo)
|
||||
// .font(.custom("Poppins-Medium", size: 28))
|
||||
// .fontWeight(.bold)
|
||||
// .foregroundColor(.black)
|
||||
// .padding(.trailing, 10)
|
||||
// .frame(maxWidth: .infinity, alignment: .leading)
|
||||
// }
|
||||
//current one that todo will be handled
|
||||
var body2: some View {
|
||||
VStack(alignment: .leading, spacing: 0) {
|
||||
// Top section with current ticket and image
|
||||
HStack(alignment: .top, spacing: 0) {
|
||||
// Current ticket value
|
||||
Text(data.yourTicketHeader)
|
||||
.font(.custom("Poppins-Medium", size: 28))
|
||||
.fontWeight(.bold)
|
||||
.foregroundColor(.black)
|
||||
.padding(.trailing, 10)
|
||||
.frame(maxWidth: .infinity, alignment: .leading)
|
||||
|
||||
Image(data.imageName)
|
||||
.resizable()
|
||||
.scaledToFit()
|
||||
.frame(width: 34, height: 34)
|
||||
}
|
||||
.padding(.top, 16)
|
||||
.padding(.horizontal, 16)
|
||||
|
||||
// Currently Serving Header
|
||||
Text(data.queueNo)
|
||||
.font(.custom("Poppins-Medium", size: 14))
|
||||
.fontWeight(.bold)
|
||||
.foregroundColor(.black)
|
||||
.padding(.trailing, 12)
|
||||
.padding(.bottom, 10)
|
||||
.padding(.horizontal, 16)
|
||||
|
||||
// Currently Serving section with status
|
||||
HStack(alignment: .center, spacing: 0) {
|
||||
// Currently serving text
|
||||
Text(data.currentlyServing)
|
||||
.font(.custom("Poppins-Medium", size: 16))
|
||||
.fontWeight(.bold)
|
||||
.foregroundColor(.black)
|
||||
.frame(maxWidth: .infinity, alignment: .leading)
|
||||
|
||||
// Status badge
|
||||
Text(data.currentServingStatus)
|
||||
.font(.custom("Poppins-Medium", size: 12))
|
||||
.foregroundColor(data.colorConfig.currentServingStatusTextColor)
|
||||
.padding(.horizontal, 12)
|
||||
.padding(.vertical, 8)
|
||||
.background(
|
||||
RoundedRectangle(cornerRadius: 8)
|
||||
.fill(Color.inactiveColor.opacity(0.2))
|
||||
)
|
||||
}
|
||||
.padding(.horizontal, 16)
|
||||
Spacer()
|
||||
// Next Step badge
|
||||
Text(data.currentServingStatus)
|
||||
.font(.custom("Poppins-Medium", size: 12))
|
||||
.foregroundColor(data.colorConfig.currentServingStatusTextColor)
|
||||
.padding(.horizontal, 12)
|
||||
.padding(.vertical, 8)
|
||||
.background(
|
||||
RoundedRectangle(cornerRadius: 8)
|
||||
.fill(data.colorConfig.currentServingStatusBackground)
|
||||
)
|
||||
.padding(.horizontal, 16)
|
||||
.padding(.bottom, 16)
|
||||
}
|
||||
.background(Color.black.opacity(0.01))
|
||||
.cornerRadius(20)
|
||||
|
||||
// .border(width: 10, edges: [.top, .bottom], color: data.colorConfig.containerBorderColor)
|
||||
// .border(width: 2, edges: [.leading, .trailing], color: data.colorConfig.containerBorderColor)
|
||||
// .overlay(
|
||||
// RoundedRectangle(cornerRadius: 20)
|
||||
// .stroke(data.colorConfig.containerBorderColor, lineWidth: 20)
|
||||
// )
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// MARK: - Live Activity Widget
|
||||
struct live_notificationLiveActivity: Widget {
|
||||
|
||||
var body: some WidgetConfiguration {
|
||||
ActivityConfiguration(for: LiveActivitiesAppAttributes.self) { context in
|
||||
// Extract parameters from Flut
|
||||
// print("the queno is \(context.attributes.prefixedKey("title")) ===== \(sharedDefault.string(forKey: context.attributes.prefixedKey("queueNo")) )")
|
||||
let title = sharedDefault.string(forKey: context.attributes.prefixedKey("title")) ?? ""
|
||||
let yourTicketHeader = sharedDefault.string(forKey: context.attributes.prefixedKey("currentlyServingHeader")) ?? ""
|
||||
let nextTicketStatus = sharedDefault.string(forKey: context.attributes.prefixedKey("nextTicketStatus")) ?? ""
|
||||
|
||||
let queueNo = sharedDefault.string(forKey: context.attributes.prefixedKey("queueNo")) ?? ""
|
||||
let currentlyServingToken = sharedDefault.string(forKey: context.attributes.prefixedKey("currentlyServingToken")) ?? ""
|
||||
let currentlyServing = sharedDefault.string(forKey: context.attributes.prefixedKey("currentlyServingTitle")) ?? ""
|
||||
let currentServingStatus = sharedDefault.string(forKey: context.attributes.prefixedKey("currentlyServingStatus")) ??
|
||||
""
|
||||
let currentServingStatusBackground = sharedDefault.integer(forKey: context.attributes.prefixedKey("currentlyServingCallType"))
|
||||
|
||||
let status = sharedDefault.integer(forKey: context.attributes.prefixedKey("callType")) ?? 0
|
||||
|
||||
|
||||
// Get color configuration based on currentServingStatusBackground
|
||||
let colorConfig = WidgetColorConfig.config(for: status)
|
||||
|
||||
// Create widget data
|
||||
let widgetData = NotificationWidgetData(
|
||||
queueNo: queueNo,
|
||||
yourTicketHeader: yourTicketHeader,
|
||||
currentlyServing: currentlyServing,
|
||||
status: status,
|
||||
currentServingStatus: currentServingStatus,
|
||||
imageName:"hmg",
|
||||
nextTicketStatus:nextTicketStatus,
|
||||
colorConfig: colorConfig
|
||||
)
|
||||
//
|
||||
// Lock screen/banner UI
|
||||
NotificationWidgetView(data: widgetData)
|
||||
.activityBackgroundTint(Color.clear)
|
||||
.activitySystemActionForegroundColor(Color.black)
|
||||
|
||||
// Text(widgetData.queueNo)
|
||||
// .font(.custom("Poppins-Medium", size: 28))
|
||||
// .fontWeight(.bold)
|
||||
// .foregroundColor(.black)
|
||||
// .padding(.trailing, 10)
|
||||
// .frame(maxWidth: .infinity, alignment: .leading)
|
||||
|
||||
} dynamicIsland: { context in
|
||||
|
||||
let title = sharedDefault.string(forKey: context.attributes.prefixedKey("title")) ?? "testes"
|
||||
let contentText = sharedDefault.string(forKey: context.attributes.prefixedKey("contentText")) ?? "tested"
|
||||
let queueNo = sharedDefault.string(forKey: context.attributes.prefixedKey("queueNo")) ?? "test1234"
|
||||
let status = sharedDefault.string(forKey: context.attributes.prefixedKey("callType")) ?? "test3345"
|
||||
let currentlyServing = sharedDefault.string(forKey: context.attributes.prefixedKey("currentlyServingTitle")) ?? "tes"
|
||||
let currentServingStatus = sharedDefault.string(forKey: context.attributes.prefixedKey("currentlyServingStatus")) ??
|
||||
"test111"
|
||||
let currentServingStatusBackground = sharedDefault.integer(forKey: context.attributes.prefixedKey("currentlyServingCallType"))
|
||||
|
||||
|
||||
let colorConfig = WidgetColorConfig.config(for: currentServingStatusBackground)
|
||||
|
||||
return DynamicIsland {
|
||||
// Expanded UI
|
||||
DynamicIslandExpandedRegion(.leading) {
|
||||
VStack(alignment: .leading) {
|
||||
Text(queueNo)
|
||||
.font(.system(size: 24, weight: .bold))
|
||||
.foregroundColor(.primary)
|
||||
}
|
||||
}
|
||||
|
||||
DynamicIslandExpandedRegion(.trailing) {
|
||||
Image("hmg")
|
||||
.resizable()
|
||||
.scaledToFit()
|
||||
.frame(width: 34, height: 34)
|
||||
.foregroundColor(.gray)
|
||||
}
|
||||
|
||||
DynamicIslandExpandedRegion(.center) {
|
||||
VStack(spacing: 4) {
|
||||
Text("Currently Servings:")
|
||||
.font(.caption2)
|
||||
.foregroundColor(.secondary)
|
||||
|
||||
Text(currentlyServing)
|
||||
.font(.caption)
|
||||
.fontWeight(.semibold)
|
||||
}
|
||||
}
|
||||
|
||||
DynamicIslandExpandedRegion(.bottom) {
|
||||
HStack {
|
||||
Text(status)
|
||||
.font(.caption2)
|
||||
.padding(.horizontal, 8)
|
||||
.padding(.vertical, 4)
|
||||
.background(
|
||||
RoundedRectangle(cornerRadius: 6)
|
||||
.fill(colorConfig.currentServingStatusBackground.opacity(0.2))
|
||||
)
|
||||
|
||||
Spacer()
|
||||
|
||||
Text(currentServingStatus)
|
||||
.font(.caption2)
|
||||
.foregroundColor(colorConfig.currentServingStatusTextColor)
|
||||
.padding(.horizontal, 8)
|
||||
.padding(.vertical, 4)
|
||||
.background(
|
||||
RoundedRectangle(cornerRadius: 6)
|
||||
.fill(colorConfig.currentServingStatusBackground)
|
||||
)
|
||||
}
|
||||
.padding(.horizontal)
|
||||
}
|
||||
|
||||
} compactLeading: {
|
||||
// Compact leading view
|
||||
Text(queueNo)
|
||||
.font(.caption2)
|
||||
.fontWeight(.bold)
|
||||
} compactTrailing: {
|
||||
// Compact trailing view
|
||||
Image("hmg")
|
||||
.resizable()
|
||||
.scaledToFit()
|
||||
.frame(width: 12, height: 12)
|
||||
.foregroundColor(colorConfig.containerBorderColor).padding(4)
|
||||
} minimal: {
|
||||
// Minimal view
|
||||
HStack{
|
||||
Text(queueNo)
|
||||
.font(.caption2)
|
||||
.fontWeight(.bold)
|
||||
Spacer()
|
||||
Image("hmg")
|
||||
.resizable()
|
||||
.scaledToFit()
|
||||
.frame(width: 4, height: 4)
|
||||
.foregroundColor(colorConfig.containerBorderColor)
|
||||
}.padding(2)
|
||||
|
||||
}
|
||||
.contentMargins(.all, 20,for: .expanded)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
extension LiveActivitiesAppAttributes {
|
||||
func prefixedKey(_ key: String) -> String {
|
||||
print("the id to get the element is \(id)")
|
||||
return "\(id)_\(key)"
|
||||
}
|
||||
}
|
||||
// MARK: - Preview for Testing
|
||||
struct NotificationWidgetView_Previews: PreviewProvider {
|
||||
static var previews: some View {
|
||||
Group {
|
||||
// Preview with currentServingStatusBackground = 0 (Yellow border)
|
||||
NotificationWidgetView(
|
||||
data: NotificationWidgetData(
|
||||
queueNo: "42",
|
||||
yourTicketHeader: "Currently Serving3:",
|
||||
currentlyServing: "Customer #15",
|
||||
status: 0,
|
||||
currentServingStatus: "Next: Prepare Order",
|
||||
imageName: "bell.fill",
|
||||
nextTicketStatus: "bell.fill",
|
||||
colorConfig: .config(for: 0)
|
||||
)
|
||||
)
|
||||
.previewDisplayName("Yellow Border (0)")
|
||||
|
||||
// Preview with currentServingStatusBackground = 1 (Red border)
|
||||
NotificationWidgetView(
|
||||
data: NotificationWidgetData(
|
||||
queueNo: "89",
|
||||
yourTicketHeader: "Currently Serving2:",
|
||||
currentlyServing: "Customer #67",
|
||||
status: 1,
|
||||
currentServingStatus: "Next: Quality Check",
|
||||
imageName: "bell.fill",
|
||||
nextTicketStatus: "bell.fill",
|
||||
colorConfig: .config(for: 1)
|
||||
)
|
||||
)
|
||||
.previewDisplayName("Red Border (1)")
|
||||
|
||||
// Preview with currentServingStatusBackground = 2 (Green border)
|
||||
NotificationWidgetView(
|
||||
data: NotificationWidgetData(
|
||||
queueNo: "125",
|
||||
yourTicketHeader: "Currently Serving1:",
|
||||
currentlyServing: "Customer #98",
|
||||
status: 1,
|
||||
currentServingStatus: "Next: Ready for Pickup",
|
||||
imageName: "bell.fill",
|
||||
nextTicketStatus: "bell.fill",
|
||||
colorConfig: .config(for: 2)
|
||||
)
|
||||
)
|
||||
.previewDisplayName("Green Border (2)")
|
||||
}
|
||||
.padding()
|
||||
.previewLayout(.sizeThatFits)
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,10 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>com.apple.security.application-groups</key>
|
||||
<array>
|
||||
<string>group.alhabib.patientApp</string>
|
||||
</array>
|
||||
</dict>
|
||||
</plist>
|
||||
@ -0,0 +1,30 @@
|
||||
class PatientQueue {
|
||||
|
||||
final String? queueNo;
|
||||
final String? currentlyServingStatus;
|
||||
final String? currentlyServingToken;
|
||||
final String? yourTicketHeader;
|
||||
final String? currentlyServingTitle;
|
||||
final String? nextTicketStatus;
|
||||
final int? currentlyServingCallType;
|
||||
final int? callType;// background will be same as of the [Utils.getCardButtonColor]
|
||||
|
||||
const PatientQueue({this.yourTicketHeader,this.currentlyServingTitle, this.queueNo, this.currentlyServingStatus, this.nextTicketStatus, this.callType, this.currentlyServingToken,this
|
||||
.currentlyServingCallType,
|
||||
});
|
||||
|
||||
/// Converts this PatientQueue object to a map.
|
||||
/// This is used for passing data to the native side for Live Activities.
|
||||
Map<String, dynamic> toMap() {
|
||||
return {
|
||||
'queueNo': queueNo,
|
||||
'currentlyServingStatus': currentlyServingStatus,
|
||||
'nextTicketStatus': nextTicketStatus,
|
||||
'callType': callType,
|
||||
'currentlyServingToken': currentlyServingToken,
|
||||
'currentlyServingCallType': currentlyServingCallType,
|
||||
'yourTicketHeader':yourTicketHeader,
|
||||
'currentlyServingTitle':currentlyServingTitle,
|
||||
};
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,38 @@
|
||||
|
||||
|
||||
// Background message handler (must be top-level function)
|
||||
import 'package:firebase_core/firebase_core.dart';
|
||||
import 'package:firebase_messaging/firebase_messaging.dart';
|
||||
|
||||
@pragma('vm:entry-point')
|
||||
Future<void> _firebaseMessagingBackgroundHandler(RemoteMessage message) async {
|
||||
await Firebase.initializeApp();
|
||||
print('Handling background message: ${message.messageId}');
|
||||
}
|
||||
|
||||
class NotificationService {
|
||||
final FirebaseMessaging _fcm = FirebaseMessaging.instance;
|
||||
|
||||
|
||||
Future<void> initialize() async {
|
||||
|
||||
String? token = await _fcm. getToken();
|
||||
print('FCM Token: $token');
|
||||
|
||||
// Set up background handler
|
||||
FirebaseMessaging.onBackgroundMessage(_firebaseMessagingBackgroundHandler);
|
||||
|
||||
// Foreground message handler
|
||||
FirebaseMessaging.onMessage.listen(_handleForegroundMessage);
|
||||
|
||||
}
|
||||
|
||||
// Foreground message handler
|
||||
void _handleForegroundMessage(RemoteMessage message) {
|
||||
print('Foreground notification: ${message.notification?.title}');
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@ -0,0 +1,14 @@
|
||||
import 'package:flutter/services.dart';
|
||||
|
||||
class LiveActivityHelperChannel {
|
||||
static const MethodChannel _channel = MethodChannel('clear_data');
|
||||
|
||||
static Future<void> removeData() async {
|
||||
try {
|
||||
await _channel.invokeMethod('clearUserDefaultData');
|
||||
} on PlatformException catch (e) {
|
||||
print("Failed to removeData: '${e.message}'.");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,3 @@
|
||||
class QueueLiveNotificationModel {
|
||||
Map<String, dynamic> data = {};
|
||||
}
|
||||