live notification handled on ios side

live_activities
tahaalam 3 weeks ago
parent b73afa705a
commit b479e674d0

@ -196,9 +196,9 @@ public final class GeneratedPluginRegistrant {
Log.e(TAG, "Error registering plugin just_audio, com.ryanheise.just_audio.JustAudioPlugin", e);
}
try {
flutterEngine.getPlugins().add(new com.example.live_activities.LiveActivitiesPlugin());
flutterEngine.getPlugins().add(new com.istornz.live_activities.LiveActivitiesPlugin());
} catch (Exception e) {
Log.e(TAG, "Error registering plugin live_activities, com.example.live_activities.LiveActivitiesPlugin", 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());

@ -8,6 +8,8 @@ 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
@ -41,16 +43,33 @@ class CustomLiveActivityManager(context: Context) :
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
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 ?: "")

@ -1,5 +1,5 @@
flutter.buildMode=debug
flutter.sdk=/Users/mohamedmekawy/Documents/Flutter_SDKs/flutter_3.35.3
flutter.sdk=/Users/cloud/sdk/flutter
flutter.versionCode=38
flutter.versionName=0.0.39
sdk.dir=/Users/mohamedmekawy/Library/Android/sdk
sdk.dir=/Users/cloud/Library/Android/sdk

@ -1,16 +0,0 @@
//
// AppWidgetBundle.swift
// AppWidget
//
// Created by Cloud Solutions on 15/12/2025.
//
import WidgetKit
import SwiftUI
@main
struct AppWidgetBundle: WidgetBundle {
var body: some Widget {
AppWidgetLiveActivity()
}
}

@ -1,26 +0,0 @@
{
"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
},
"properties" : {
"preserves-vector-representation" : true
}
}

@ -1,17 +0,0 @@
<?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>UIAppFonts</key>
<array>
<string>Poppins-Medium.ttf</string>
</array>
<key>NSSupportsLiveActivities</key>
<true/>
<key>NSExtension</key>
<dict>
<key>NSExtensionPointIdentifier</key>
<string>com.apple.widgetkit-extension</string>
</dict>
</dict>
</plist>

Binary file not shown.

@ -1,17 +0,0 @@
//
// AppWidgetLiveActivityBundle.swift
// AppWidgetLiveActivity
//
// Created by Cloud Solutions on 27/01/2026.
//
import WidgetKit
import SwiftUI
@main
struct AppWidgetLiveActivityBundle: WidgetBundle {
var body: some Widget {
AppWidgetLiveActivity()
}
}

@ -1,575 +0,0 @@
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 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: .textColor,
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 status: 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("clock")
.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(Color(hex:"#18C273"))
}
.padding(8)
.background(Color(hex:"#1A18C273"))
.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(Color.green)
.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
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.status)
.font(.system(size: 10, weight: .semibold))
.foregroundColor(Color(hex: "#18C273"))
}
.padding(8)
.background(Color(hex:"#1A18C273"))
.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 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.status)
// .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 AppWidgetLiveActivity: 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 status = 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("currentlyServingStatus")) ??
// "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 status = 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
// Get color configuration based on nextStepBackground
let colorConfig = WidgetColorConfig.config(for: nextStepBackground)
// Create widget data
let widgetData = NotificationWidgetData(
currentTicket: currentTicket,
currentlyServingHeader: currentlyServingHeader,
currentlyServing: currentlyServing,
status: status,
nextStep: nextStep,
imageName:"hmg",
colorConfig: colorConfig,
progress: 33 * Double(nextStepBackground),
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 status = 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 colorConfig = WidgetColorConfig.config(for: nextStepBackground)
let widgetData = NotificationWidgetData(
currentTicket: currentTicket,
currentlyServingHeader: currentlyServingHeader,
currentlyServing: currentlyServing,
status: status,
nextStep: nextStep,
imageName:"hmg",
colorConfig: colorConfig,
progress: 33 * Double(nextStepBackground),
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(status)
// .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",
// status: "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",
// status: "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",
// status: "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 "no value"
}
}
}
return "no value"
}

@ -1,11 +0,0 @@
{
"colors" : [
{
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

@ -1,35 +0,0 @@
{
"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
}
}

@ -1,6 +0,0 @@
{
"info" : {
"author" : "xcode",
"version" : 1
}
}

@ -1,11 +0,0 @@
{
"colors" : [
{
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

@ -1,21 +0,0 @@
{
"images" : [
{
"filename" : "icon.svg",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

@ -1,4 +0,0 @@
<svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
<path opacity="0.4" d="M8.3335 31.6667V36.6667L31.6668 36.6667V31.6667C31.6668 25.2233 26.4435 20 20.0002 20C13.5568 20 8.3335 25.2233 8.3335 31.6667Z" fill="#9C9C9C"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M6.6665 2.08398C5.97615 2.08398 5.4165 2.64363 5.4165 3.33398C5.4165 4.02434 5.97615 4.58398 6.6665 4.58398H7.08317L7.08317 8.33398C7.08317 13.4808 10.0935 17.9246 14.4494 20.0007C10.0935 22.0767 7.08317 26.5205 7.08317 31.6673L7.08317 35.4173H6.6665C5.97615 35.4173 5.4165 35.977 5.4165 36.6673C5.4165 37.3577 5.97615 37.9173 6.6665 37.9173L33.3332 37.9173C34.0235 37.9173 34.5832 37.3577 34.5832 36.6673C34.5832 35.977 34.0235 35.4173 33.3332 35.4173H32.9165V31.6673C32.9165 26.5205 29.9062 22.0767 25.5502 20.0007C29.9062 17.9246 32.9165 13.4808 32.9165 8.33398V4.58398H33.3332C34.0235 4.58398 34.5832 4.02434 34.5832 3.33398C34.5832 2.64363 34.0235 2.08398 33.3332 2.08398L6.6665 2.08398ZM30.4165 4.58398L9.58317 4.58398L9.58317 8.33398C9.58317 14.087 14.2469 18.7507 19.9998 18.7507C25.7528 18.7507 30.4165 14.087 30.4165 8.33398V4.58398ZM30.4165 35.4173V31.6673C30.4165 25.9144 25.7528 21.2507 19.9998 21.2507C14.2469 21.2507 9.58317 25.9143 9.58317 31.6673V35.4173L30.4165 35.4173Z" fill="#2E3039"/>
</svg>

Before

Width:  |  Height:  |  Size: 1.3 KiB

@ -1,5 +0,0 @@
<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>

Before

Width:  |  Height:  |  Size: 2.6 KiB

@ -1,5 +0,0 @@
<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>

Before

Width:  |  Height:  |  Size: 2.6 KiB

@ -1,5 +0,0 @@
<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>

Before

Width:  |  Height:  |  Size: 2.6 KiB

@ -1,21 +0,0 @@
{
"images" : [
{
"filename" : "doctor-02.svg",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

@ -1,4 +0,0 @@
<svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M5.25016 8.89518C5.38787 8.89518 5.51754 8.96002 5.60016 9.07018L7.00016 10.9368L8.40016 9.07018C8.48279 8.96002 8.61246 8.89518 8.75016 8.89518C9.27763 8.89518 9.72393 8.89517 10.0671 8.92628C10.4208 8.95833 10.7298 9.02617 11.0106 9.18825C11.3431 9.38025 11.6193 9.65639 11.8113 9.98893C11.9733 10.2697 12.0412 10.5787 12.0732 10.9324C12.1043 11.2756 12.1043 11.701 12.1043 12.2285V12.8327C12.1043 13.0743 11.9085 13.2702 11.6668 13.2702H2.3335C2.09187 13.2702 1.896 13.0743 1.896 12.8327V12.2285C1.89599 11.701 1.89599 11.2756 1.92709 10.9324C1.95915 10.5787 2.02699 10.2697 2.18907 9.98893C2.38106 9.65639 2.6572 9.38025 2.98975 9.18825C3.27048 9.02617 3.57953 8.95833 3.93323 8.92628C4.2764 8.89517 4.72269 8.89518 5.25016 8.89518Z" fill="#18C273"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M9.73438 4.71896L10.3155 2.3578C10.5171 1.53855 9.90831 0.728516 9.05507 0.728516H4.94519C4.09195 0.728516 3.48316 1.53855 3.68478 2.3578L4.26579 4.71859V5.83268C4.26579 7.35644 5.48349 8.60352 7.00009 8.60352C8.51668 8.60352 9.73438 7.35644 9.73438 5.83268V4.71896ZM5.14079 5.10323H8.85938V5.83268C8.85938 6.88626 8.02046 7.72852 7.00009 7.72852C5.97971 7.72852 5.14079 6.88626 5.14079 5.83268V5.10323ZM7.00002 1.60352C7.24164 1.60352 7.43752 1.79939 7.43752 2.04102V2.47837H7.87516C8.11679 2.47837 8.31266 2.67425 8.31266 2.91587C8.31266 3.1575 8.11679 3.35337 7.87516 3.35337H7.43752V3.79102C7.43752 4.03264 7.24164 4.22852 7.00002 4.22852C6.7584 4.22852 6.56252 4.03264 6.56252 3.79102V3.35337H6.12516C5.88354 3.35337 5.68766 3.1575 5.68766 2.91587C5.68766 2.67425 5.88354 2.47837 6.12516 2.47837H6.56252V2.04102C6.56252 1.79939 6.7584 1.60352 7.00002 1.60352Z" fill="#18C273"/>
</svg>

Before

Width:  |  Height:  |  Size: 1.8 KiB

@ -20,7 +20,5 @@
<string>????</string>
<key>CFBundleVersion</key>
<string>1.0</string>
<key>MinimumOSVersion</key>
<string>13.0</string>
</dict>
</plist>

@ -576,23 +576,23 @@ EXTERNAL SOURCES:
:path: ".symlinks/plugins/webview_flutter_wkwebview/darwin"
SPEC CHECKSUMS:
amazon_payfort: 782d287860ac8962baf4e0a2a0fb2f81fdf27204
audio_session: 19e9480dbdd4e5f6c4543826b2e8b0e4ab6145fe
barcode_scan2: 050b7b327e85954c8918715d42e83c5a35c3ed89
clarity_flutter: e4e49caa906b833300b7dabc0a9f60d0e91ccbc0
connectivity_plus: 2a701ffec2c0ae28a48cf7540e279787e77c447d
amazon_payfort: 4ad7a3413acc1c4c4022117a80d18fee23c572d3
audio_session: 9bb7f6c970f21241b19f5a3658097ae459681ba0
barcode_scan2: 4e4b850b112f4e29017833e4715f36161f987966
clarity_flutter: d665e4a61c0000a28e7829668a4e287cc1b657bd
connectivity_plus: cb623214f4e1f6ef8fe7403d580fdad517d2f7dd
CryptoSwift: e64e11850ede528a02a0f3e768cec8e9d92ecb90
device_calendar: 9cb33f88a02e19652ec7b8b122ca778f751b1f7b
device_calendar_plus_ios: 34dca387f44fad29b840096a840f94edc55af858
device_info_plus: bf2e3232933866d73fe290f2942f2156cdd10342
device_calendar: b55b2c5406cfba45c95a59f9059156daee1f74ed
device_calendar_plus_ios: 2c04ad7643c6e697438216e33693b84e8ca45ded
device_info_plus: 21fcca2080fbcd348be798aa36c3e5ed849eefbe
DKImagePickerController: 946cec48c7873164274ecc4624d19e3da4c1ef3c
DKPhotoGallery: b3834fecb755ee09a593d7c9e389d8b5d6deed60
file_picker: b159e0c068aef54932bb15dc9fd1571818edaf49
file_picker: a0560bc09d61de87f12d246fc47d2119e6ef37be
Firebase: d99ac19b909cd2c548339c2241ecd0d1599ab02e
firebase_analytics: bf93e20703c95030404d6ddbb1adf05bf5c3885b
firebase_core: 99a37263b3c27536063a7b601d9e2a49400a433c
firebase_crashlytics: 986773c0c7ea4c3f5a4ead141b58522fcd9dfdb1
firebase_messaging: bf6697c61f31c7cc0f654131212ff04c0115c2c7
firebase_analytics: 0e25ca1d4001ccedd40b4e5b74c0ec34e18f6425
firebase_core: 995454a784ff288be5689b796deb9e9fa3601818
firebase_crashlytics: 30dcd6dfd2fe895c0848af46722a4227346c19aa
firebase_messaging: f4a41dd102ac18b840eba3f39d67e77922d3f707
FirebaseAnalytics: 6433dfd311ba78084fc93bdfc145e8cb75740eae
FirebaseCore: efb3893e5b94f32b86e331e3bd6dadf18b66568e
FirebaseCoreExtension: edbd30474b5ccf04e5f001470bdf6ea616af2435
@ -604,37 +604,37 @@ SPEC CHECKSUMS:
FirebaseSessions: b9a92c1c51bbb81e78fc3142cda6d925d700f8e7
FLAnimatedImage: bbf914596368867157cc71b38a8ec834b3eeb32b
Flutter: cabc95a1d2626b1b06e7179b784ebcf0c0cde467
flutter_amazonpaymentservices: 65a823f0cde190eaa78f1441c73b6c766ac2b899
flutter_app_group_directory: d2c3337f424828558953172f9378d00df9b7756d
flutter_callkit_incoming: 417dd1b46541cdd5d855ad795ccbe97d1c18155e
flutter_image_compress_common: ec1d45c362c9d30a3f6a0426c297f47c52007e3e
flutter_inappwebview_ios: 6f63631e2c62a7c350263b13fa5427aedefe81d4
flutter_ios_voip_kit_karmm: 7ea37381a8841c92d186edf1f4604df5cc437579
flutter_local_notifications: ff50f8405aaa0ccdc7dcfb9022ca192e8ad9688f
flutter_nfc_kit: 3985c93f749b9cb4747479205c2f10bd2f877a11
flutter_paytabs_bridge: 6398a23e4c217f46a87d041d50d814cd1bf901f8
flutter_screenshot_blocker: af896cc18564521a9bcf34e8ba09ff481ec87148
flutter_zoom_videosdk: 9d59a78c3e426bcf4723c7e14ac469bde1d0566b
fluttertoast: 21eecd6935e7064cc1fcb733a4c5a428f3f24f0f
geolocator_apple: 66b711889fd333205763b83c9dcf0a57a28c7afd
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: ffdd933832966673a1f57f5effd014dc8d4d43a2
google_maps_flutter_ios: 3213e1e5f5588b6134935cb8fc59acb4e6d88377
GoogleAdsOnDeviceConversion: 2be6297a4f048459e0ae17fad9bfd2844e10cf64
GoogleAppMeasurement: 700dce7541804bec33db590a5c496b663fbe2539
GoogleDataTransport: aae35b7ea0c09004c3797d53c8c41f66f219d6a7
GoogleMaps: 8939898920281c649150e0af74aa291c60f2e77d
GoogleUtilities: 00c88b9a86066ef77f0da2fab05f65d7768ed8e1
health: 9cd70a5c9d9ec559a12d639a1471091c0cbb6b48
image_picker_ios: 4f2f91b01abdb52842a8e277617df877e40f905b
in_app_review: 436034b18594851a7328d7f1c2ed5ec235b79cfc
just_audio: a42c63806f16995daf5b219ae1d679deb76e6a79
health: 32d2fbc7f26f9a2388d1a514ce168adbfa5bda65
image_picker_ios: e0ece4aa2a75771a7de3fa735d26d90817041326
in_app_review: 7dd1ea365263f834b8464673f9df72c80c17c937
just_audio: 4e391f57b79cad2b0674030a00453ca5ce817eed
libwebp: 02b23773aedb6ff1fd38cec7a77b81414c6842a8
live_activities: 5a5313d5bf801bbbbe80d51eab80aed6d6df376b
local_auth_darwin: 63c73d6d28cc3e239be2b6aa460ea6e317cd5100
location: d5cf8598915965547c3f36761ae9cc4f4e87d22e
manage_calendar_events: 9b2889799340398027b3e3f5c4891d41599ec257
live_activities: 4dfa736d0736e1c77866a2f9c056a76513cc9e7b
local_auth_darwin: c3ee6cce0a8d56be34c8ccb66ba31f7f180aaebb
location: 155caecf9da4f280ab5fe4a55f94ceccfab838f8
manage_calendar_events: fe1541069431af035ced925ebd9def8b4b271254
Mantle: c5aa8794a29a022dfbbfc9799af95f477a69b62d
map_launcher: 8a4e484aaddff55680a7da9bc9e25f512067fb87
map_launcher: 8051ad5783913cafce93f2414c6858f2904fd8df
MapboxCommon: 119f3759f7dc9457f0695848108ab323eb643cb4
MapboxCoreMaps: ca17f67baced23f8c952166ac6314c35bad3f66c
MapboxCoreNavigation: 3be9990fae3ed732a101001746d0e3b4234ec023
@ -645,31 +645,31 @@ SPEC CHECKSUMS:
MapboxNavigationNative: 629e359f3d2590acd1ebbacaaf99e1a80ee57e42
MapboxSpeech: cd25ef99c3a3d2e0da72620ff558276ea5991a77
nanopb: fad817b59e0457d11a5dfbde799381cd727c1275
network_info_plus: 6613d9d7cdeb0e6f366ed4dbe4b3c51c52d567a9
open_filex: 6e26e659846ec990262224a12ef1c528bb4edbe4
network_info_plus: cf61925ab5205dce05a4f0895989afdb6aade5fc
open_filex: 432f3cd11432da3e39f47fcc0df2b1603854eff1
OrderedSet: e539b66b644ff081c73a262d24ad552a69be3a94
package_info_plus: c0502532a26c7662a62a356cebe2692ec5fe4ec4
path_provider_foundation: 0b743cbb62d8e47eab856f09262bb8c1ddcfe6ba
package_info_plus: af8e2ca6888548050f16fa2f1938db7b5a5df499
path_provider_foundation: bb55f6dbba17d0dccd6737fe6f7f34fbd0376880
PayFortSDK: 233eabe9a45601fdbeac67fa6e5aae46ed8faf82
PayTabsSDK: 51d21d0174679d08ee816583266aa5f557ebf5ed
permission_handler_apple: 9878588469a2b0d0fc1e048d9f43605f92e6cec2
permission_handler_apple: 4ed2196e43d0651e8ff7ca3483a069d469701f2d
Polyline: 2a1f29f87f8d9b7de868940f4f76deb8c678a5b1
PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47
PromisesSwift: 9d77319bbe72ebf6d872900551f7eeba9bce2851
screen_brightness_ios: 7437207a2a9bc56553aa10f782afecf830b4c4e2
screen_brightness_ios: 28c5fbdb40634de44f86025d84470158ad4df48c
SDWebImage: 9f177d83116802728e122410fb25ad88f5c7608a
SDWebImageWebPCoder: 0e06e365080397465cc73a7a9b472d8a3bd0f377
share_plus: 8b6f8b3447e494cca5317c8c3073de39b3600d1f
shared_preferences_foundation: 5086985c1d43c5ba4d5e69a4e8083a389e2909e6
share_plus: 50da8cb520a8f0f65671c6c6a99b3617ed10a58a
shared_preferences_foundation: 7036424c3d8ec98dfe75ff1667cb0cd531ec82bb
Solar-dev: 4612dc9878b9fed2667d23b327f1d4e54e16e8d0
sqflite_darwin: 5a7236e3b501866c1c9befc6771dfd73ffb8702d
sqflite_darwin: 20b2a3a3b70e43edae938624ce550a3cbf66a3d0
SwiftProtobuf: 409d3aaec90e51b1705b1dd8065b56893450e77c
SwiftyGif: 706c60cf65fa2bc5ee0313beece843c8eb8194d4
Turf: aa2ede4298009639d10db36aba1a7ebaad072a5e
url_launcher_ios: bb13df5870e8c4234ca12609d04010a21be43dfa
video_player_avfoundation: 7993f492ae0bd77edaea24d9dc051d8bb2cd7c86
wakelock_plus: 76957ab028e12bfa4e66813c99e46637f367fc7e
webview_flutter_wkwebview: 29eb20d43355b48fe7d07113835b9128f84e3af4
url_launcher_ios: 7a95fa5b60cc718a708b8f2966718e93db0cef1b
video_player_avfoundation: dd410b52df6d2466a42d28550e33e4146928280a
wakelock_plus: e29112ab3ef0b318e58cfa5c32326458be66b556
webview_flutter_wkwebview: 8ebf4fded22593026f7dbff1fbff31ea98573c8d
ZoomVideoSDK: c3ac797074847382d9b539044d77f5971d6b62cd
PODFILE CHECKSUM: b2fdde559476ac2931f2a7ceec6cf5a78743c72b

@ -8,24 +8,16 @@
/* Begin PBXBuildFile section */
1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };
1587365701FF0D2AAAFED0D8 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A83C76CFF9D3F92EDE3B22B4 /* Pods_Runner.framework */; };
331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; };
3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
478CFA942E638C8E0064F3D7 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 478CFA932E638C8E0064F3D7 /* GoogleService-Info.plist */; };
61243B492EC5FA3700D46FA0 /* PenguinModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61243B422EC5FA3700D46FA0 /* PenguinModel.swift */; };
61243B4C2EC5FA3700D46FA0 /* HMGPenguinInPlatformBridge.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61243B3D2EC5FA3700D46FA0 /* HMGPenguinInPlatformBridge.swift */; };
61243B502EC5FA3700D46FA0 /* PenguinView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61243B452EC5FA3700D46FA0 /* PenguinView.swift */; };
61243B542EC5FA3700D46FA0 /* PenguinPlugin.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61243B442EC5FA3700D46FA0 /* PenguinPlugin.swift */; };
61243B562EC5FA3700D46FA0 /* PenguinNavigator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61243B432EC5FA3700D46FA0 /* PenguinNavigator.swift */; };
61243B572EC5FA3700D46FA0 /* PenguinViewFactory.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61243B462EC5FA3700D46FA0 /* PenguinViewFactory.swift */; };
58A16A1D1E63FA0AF61318A5 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CE7076AA781403E32077FCBF /* Pods_Runner.framework */; };
61AE8DCB3010AA4700DB059A /* WidgetKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 61D6D9F1300F522E002E5487 /* WidgetKit.framework */; };
61AE8DCC3010AA4700DB059A /* SwiftUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 61D6D9F3300F522E002E5487 /* SwiftUI.framework */; };
61AE8DD93010AA4A00DB059A /* live_notificationExtension.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = 61AE8DCA3010AA4700DB059A /* live_notificationExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
61D6DAB9300F718A002E5487 /* LiveActivityHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61D6DAB8300F718A002E5487 /* LiveActivityHelper.swift */; };
74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; };
76AA18AE2F3B2A4D00DC8DFC /* ring_30Sec.caf in Resources */ = {isa = PBXBuildFile; fileRef = 76AA18AC2F3B2A4D00DC8DFC /* ring_30Sec.caf */; };
76B1D2512F91BF8000DBBD1B /* Penguin.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 76B1D24E2F91BF8000DBBD1B /* Penguin.xcframework */; };
76B1D2522F91BF8000DBBD1B /* Penguin.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 76B1D24E2F91BF8000DBBD1B /* Penguin.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
76B1D2532F91BF8000DBBD1B /* PenguinINRenderer.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 76B1D24F2F91BF8000DBBD1B /* PenguinINRenderer.xcframework */; };
76B1D2542F91BF8000DBBD1B /* PenguinINRenderer.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 76B1D24F2F91BF8000DBBD1B /* PenguinINRenderer.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
76B1D2552F91BF8000DBBD1B /* PenNavUI.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 76B1D2502F91BF8000DBBD1B /* PenNavUI.xcframework */; };
76B1D2562F91BF8000DBBD1B /* PenNavUI.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 76B1D2502F91BF8000DBBD1B /* PenNavUI.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };
97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };
@ -39,18 +31,33 @@
remoteGlobalIDString = 97C146ED1CF9000F007C117D;
remoteInfo = Runner;
};
61AE8DD73010AA4A00DB059A /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 97C146E61CF9000F007C117D /* Project object */;
proxyType = 1;
remoteGlobalIDString = 61AE8DC93010AA4700DB059A;
remoteInfo = live_notificationExtension;
};
/* End PBXContainerItemProxy section */
/* Begin PBXCopyFilesBuildPhase section */
61D6DA07300F5240002E5487 /* Embed Foundation Extensions */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
dstPath = "";
dstSubfolderSpec = 13;
files = (
61AE8DD93010AA4A00DB059A /* live_notificationExtension.appex in Embed Foundation Extensions */,
);
name = "Embed Foundation Extensions";
runOnlyForDeploymentPostprocessing = 0;
};
765A5A922F35CD8B0003FF7D /* Embed Frameworks */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
dstPath = "";
dstSubfolderSpec = 10;
files = (
76B1D2542F91BF8000DBBD1B /* PenguinINRenderer.xcframework in Embed Frameworks */,
76B1D2522F91BF8000DBBD1B /* Penguin.xcframework in Embed Frameworks */,
76B1D2562F91BF8000DBBD1B /* PenNavUI.xcframework in Embed Frameworks */,
);
name = "Embed Frameworks";
runOnlyForDeploymentPostprocessing = 0;
@ -58,30 +65,26 @@
/* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */
05E1B2A0E6844572ADA81174 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = "<group>"; };
1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = "<group>"; };
1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = "<group>"; };
237D1205ED89EAB6C90BC64D /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = "<group>"; };
331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = "<group>"; };
331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = "<group>"; };
3EAE1F31D8D0AA94CA6C11EB /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = "<group>"; };
478CFA932E638C8E0064F3D7 /* GoogleService-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = "<group>"; };
478CFA952E6E20A60064F3D7 /* Runner.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Runner.entitlements; sourceTree = "<group>"; };
61243B3D2EC5FA3700D46FA0 /* HMGPenguinInPlatformBridge.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HMGPenguinInPlatformBridge.swift; sourceTree = "<group>"; };
61243B422EC5FA3700D46FA0 /* PenguinModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PenguinModel.swift; sourceTree = "<group>"; };
61243B432EC5FA3700D46FA0 /* PenguinNavigator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PenguinNavigator.swift; sourceTree = "<group>"; };
61243B442EC5FA3700D46FA0 /* PenguinPlugin.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PenguinPlugin.swift; sourceTree = "<group>"; };
61243B452EC5FA3700D46FA0 /* PenguinView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PenguinView.swift; sourceTree = "<group>"; };
61243B462EC5FA3700D46FA0 /* PenguinViewFactory.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PenguinViewFactory.swift; sourceTree = "<group>"; };
612BC91D3011009600FF6F5B /* live_notificationExtensionDebug.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = live_notificationExtensionDebug.entitlements; sourceTree = "<group>"; };
61AE8DCA3010AA4700DB059A /* live_notificationExtension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = live_notificationExtension.appex; sourceTree = BUILT_PRODUCTS_DIR; };
61D6D9F1300F522E002E5487 /* WidgetKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WidgetKit.framework; path = System/Library/Frameworks/WidgetKit.framework; sourceTree = SDKROOT; };
61D6D9F3300F522E002E5487 /* SwiftUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SwiftUI.framework; path = System/Library/Frameworks/SwiftUI.framework; sourceTree = SDKROOT; };
61D6DAB8300F718A002E5487 /* LiveActivityHelper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = LiveActivityHelper.swift; path = Helper/LiveActivityHelper.swift; sourceTree = "<group>"; };
74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = "<group>"; };
74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
769C9BF82E6F106D009F68A9 /* RunnerDebug.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = RunnerDebug.entitlements; sourceTree = "<group>"; };
76AA18AC2F3B2A4D00DC8DFC /* ring_30Sec.caf */ = {isa = PBXFileReference; lastKnownFileType = file; path = ring_30Sec.caf; sourceTree = "<group>"; };
76B1D24E2F91BF8000DBBD1B /* Penguin.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = Penguin.xcframework; path = Frameworks/Penguin.xcframework; sourceTree = "<group>"; };
76B1D24F2F91BF8000DBBD1B /* PenguinINRenderer.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = PenguinINRenderer.xcframework; path = Frameworks/PenguinINRenderer.xcframework; sourceTree = "<group>"; };
76B1D2502F91BF8000DBBD1B /* PenNavUI.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = PenNavUI.xcframework; path = Frameworks/PenNavUI.xcframework; sourceTree = "<group>"; };
7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = "<group>"; };
7BEF44ABFEF585D64D3F266C /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = "<group>"; };
80AB360F7825C2FB720CB86E /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = "<group>"; };
93CFB47A4DD7AA77469CFEC2 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = "<group>"; };
9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = "<group>"; };
9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = "<group>"; };
97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; };
@ -89,18 +92,49 @@
97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
A83C76CFF9D3F92EDE3B22B4 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };
CE7076AA781403E32077FCBF /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };
/* End PBXFileReference section */
/* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */
61AE8DDA3010AA4A00DB059A /* Exceptions for "live_notification" folder in "live_notificationExtension" target */ = {
isa = PBXFileSystemSynchronizedBuildFileExceptionSet;
membershipExceptions = (
Info.plist,
);
target = 61AE8DC93010AA4700DB059A /* live_notificationExtension */;
};
/* End PBXFileSystemSynchronizedBuildFileExceptionSet section */
/* Begin PBXFileSystemSynchronizedRootGroup section */
61AE8DCD3010AA4700DB059A /* live_notification */ = {
isa = PBXFileSystemSynchronizedRootGroup;
exceptions = (
61AE8DDA3010AA4A00DB059A /* Exceptions for "live_notification" folder in "live_notificationExtension" target */,
);
explicitFileTypes = {
};
explicitFolders = (
);
path = live_notification;
sourceTree = "<group>";
};
/* End PBXFileSystemSynchronizedRootGroup section */
/* Begin PBXFrameworksBuildPhase section */
61AE8DC73010AA4700DB059A /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
61AE8DCC3010AA4700DB059A /* SwiftUI.framework in Frameworks */,
61AE8DCB3010AA4700DB059A /* WidgetKit.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
97C146EB1CF9000F007C117D /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
76B1D2512F91BF8000DBBD1B /* Penguin.xcframework in Frameworks */,
76B1D2552F91BF8000DBBD1B /* PenNavUI.xcframework in Frameworks */,
76B1D2532F91BF8000DBBD1B /* PenguinINRenderer.xcframework in Frameworks */,
DE1EF78253E64BE86845D2CC /* Pods_Runner.framework in Frameworks */,
58A16A1D1E63FA0AF61318A5 /* Pods_Runner.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@ -115,33 +149,12 @@
path = RunnerTests;
sourceTree = "<group>";
};
61243B412EC5FA3700D46FA0 /* Helper */ = {
isa = PBXGroup;
children = (
61243B3D2EC5FA3700D46FA0 /* HMGPenguinInPlatformBridge.swift */,
);
path = Helper;
sourceTree = "<group>";
};
61243B472EC5FA3700D46FA0 /* Penguin */ = {
isa = PBXGroup;
children = (
61243B422EC5FA3700D46FA0 /* PenguinModel.swift */,
61243B432EC5FA3700D46FA0 /* PenguinNavigator.swift */,
61243B442EC5FA3700D46FA0 /* PenguinPlugin.swift */,
61243B452EC5FA3700D46FA0 /* PenguinView.swift */,
61243B462EC5FA3700D46FA0 /* PenguinViewFactory.swift */,
);
path = Penguin;
sourceTree = "<group>";
};
766D8CB22EC60BE600D05E07 /* Frameworks */ = {
isa = PBXGroup;
children = (
76B1D24E2F91BF8000DBBD1B /* Penguin.xcframework */,
76B1D24F2F91BF8000DBBD1B /* PenguinINRenderer.xcframework */,
76B1D2502F91BF8000DBBD1B /* PenNavUI.xcframework */,
A83C76CFF9D3F92EDE3B22B4 /* Pods_Runner.framework */,
61D6D9F1300F522E002E5487 /* WidgetKit.framework */,
61D6D9F3300F522E002E5487 /* SwiftUI.framework */,
CE7076AA781403E32077FCBF /* Pods_Runner.framework */,
);
name = Frameworks;
sourceTree = "<group>";
@ -149,9 +162,9 @@
79DD2093A1D9674C94359FC8 /* Pods */ = {
isa = PBXGroup;
children = (
3EAE1F31D8D0AA94CA6C11EB /* Pods-Runner.debug.xcconfig */,
05E1B2A0E6844572ADA81174 /* Pods-Runner.release.xcconfig */,
7BEF44ABFEF585D64D3F266C /* Pods-Runner.profile.xcconfig */,
237D1205ED89EAB6C90BC64D /* Pods-Runner.debug.xcconfig */,
93CFB47A4DD7AA77469CFEC2 /* Pods-Runner.release.xcconfig */,
80AB360F7825C2FB720CB86E /* Pods-Runner.profile.xcconfig */,
);
path = Pods;
sourceTree = "<group>";
@ -170,8 +183,10 @@
97C146E51CF9000F007C117D = {
isa = PBXGroup;
children = (
612BC91D3011009600FF6F5B /* live_notificationExtensionDebug.entitlements */,
9740EEB11CF90186004384FC /* Flutter */,
97C146F01CF9000F007C117D /* Runner */,
61AE8DCD3010AA4700DB059A /* live_notification */,
97C146EF1CF9000F007C117D /* Products */,
331C8082294A63A400263BE5 /* RunnerTests */,
79DD2093A1D9674C94359FC8 /* Pods */,
@ -184,6 +199,7 @@
children = (
97C146EE1CF9000F007C117D /* Runner.app */,
331C8081294A63A400263BE5 /* RunnerTests.xctest */,
61AE8DCA3010AA4700DB059A /* live_notificationExtension.appex */,
);
name = Products;
sourceTree = "<group>";
@ -191,9 +207,8 @@
97C146F01CF9000F007C117D /* Runner */ = {
isa = PBXGroup;
children = (
61D6DAB8300F718A002E5487 /* LiveActivityHelper.swift */,
76AA18AC2F3B2A4D00DC8DFC /* ring_30Sec.caf */,
61243B412EC5FA3700D46FA0 /* Helper */,
61243B472EC5FA3700D46FA0 /* Penguin */,
769C9BF82E6F106D009F68A9 /* RunnerDebug.entitlements */,
478CFA952E6E20A60064F3D7 /* Runner.entitlements */,
478CFA932E638C8E0064F3D7 /* GoogleService-Info.plist */,
@ -229,23 +244,45 @@
productReference = 331C8081294A63A400263BE5 /* RunnerTests.xctest */;
productType = "com.apple.product-type.bundle.unit-test";
};
61AE8DC93010AA4700DB059A /* live_notificationExtension */ = {
isa = PBXNativeTarget;
buildConfigurationList = 61AE8DDB3010AA4A00DB059A /* Build configuration list for PBXNativeTarget "live_notificationExtension" */;
buildPhases = (
61AE8DC63010AA4700DB059A /* Sources */,
61AE8DC73010AA4700DB059A /* Frameworks */,
61AE8DC83010AA4700DB059A /* Resources */,
);
buildRules = (
);
dependencies = (
);
fileSystemSynchronizedGroups = (
61AE8DCD3010AA4700DB059A /* live_notification */,
);
name = live_notificationExtension;
productName = live_notificationExtension;
productReference = 61AE8DCA3010AA4700DB059A /* live_notificationExtension.appex */;
productType = "com.apple.product-type.app-extension";
};
97C146ED1CF9000F007C117D /* Runner */ = {
isa = PBXNativeTarget;
buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */;
buildPhases = (
EA10FC42B68E41E75A052FAA /* [CP] Check Pods Manifest.lock */,
8DED67C11B08C38D4CA4B516 /* [CP] Check Pods Manifest.lock */,
9740EEB61CF901F6004384FC /* Run Script */,
97C146EA1CF9000F007C117D /* Sources */,
97C146EB1CF9000F007C117D /* Frameworks */,
61D6DA07300F5240002E5487 /* Embed Foundation Extensions */,
97C146EC1CF9000F007C117D /* Resources */,
765A5A922F35CD8B0003FF7D /* Embed Frameworks */,
3B06AD1E1E4923F5004D2608 /* Thin Binary */,
5D78F615DF2D966539B34DE2 /* [CP] Embed Pods Frameworks */,
4AA9AE39AD56A64A1F16E548 /* [CP] Copy Pods Resources */,
64913143522DD2E7A5709D09 /* [CP] Embed Pods Frameworks */,
57400ED2A0499CE460F108E2 /* [CP] Copy Pods Resources */,
);
buildRules = (
);
dependencies = (
61AE8DD83010AA4A00DB059A /* PBXTargetDependency */,
);
name = Runner;
productName = Runner;
@ -259,6 +296,7 @@
isa = PBXProject;
attributes = {
BuildIndependentTargetsInParallel = YES;
LastSwiftUpdateCheck = 2640;
LastUpgradeCheck = 1510;
ORGANIZATIONNAME = "";
TargetAttributes = {
@ -266,6 +304,9 @@
CreatedOnToolsVersion = 14.0;
TestTargetID = 97C146ED1CF9000F007C117D;
};
61AE8DC93010AA4700DB059A = {
CreatedOnToolsVersion = 26.4.1;
};
97C146ED1CF9000F007C117D = {
CreatedOnToolsVersion = 7.3.1;
LastSwiftMigration = 1100;
@ -287,6 +328,7 @@
targets = (
97C146ED1CF9000F007C117D /* Runner */,
331C8080294A63A400263BE5 /* RunnerTests */,
61AE8DC93010AA4700DB059A /* live_notificationExtension */,
);
};
/* End PBXProject section */
@ -299,6 +341,13 @@
);
runOnlyForDeploymentPostprocessing = 0;
};
61AE8DC83010AA4700DB059A /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
97C146EC1CF9000F007C117D /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
@ -329,9 +378,9 @@
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin";
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin\n";
};
4AA9AE39AD56A64A1F16E548 /* [CP] Copy Pods Resources */ = {
57400ED2A0499CE460F108E2 /* [CP] Copy Pods Resources */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
@ -348,7 +397,7 @@
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n";
showEnvVarsInLog = 0;
};
5D78F615DF2D966539B34DE2 /* [CP] Embed Pods Frameworks */ = {
64913143522DD2E7A5709D09 /* [CP] Embed Pods Frameworks */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
@ -365,42 +414,42 @@
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n";
showEnvVarsInLog = 0;
};
9740EEB61CF901F6004384FC /* Run Script */ = {
8DED67C11B08C38D4CA4B516 /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase;
alwaysOutOfDate = 1;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
);
inputPaths = (
"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
"${PODS_ROOT}/Manifest.lock",
);
name = "[CP] Check Pods Manifest.lock";
outputFileListPaths = (
);
name = "Run Script";
outputPaths = (
"$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build";
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
showEnvVarsInLog = 0;
};
EA10FC42B68E41E75A052FAA /* [CP] Check Pods Manifest.lock */ = {
9740EEB61CF901F6004384FC /* Run Script */ = {
isa = PBXShellScriptBuildPhase;
alwaysOutOfDate = 1;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
);
inputPaths = (
"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
"${PODS_ROOT}/Manifest.lock",
);
name = "[CP] Check Pods Manifest.lock";
outputFileListPaths = (
);
name = "Run Script";
outputPaths = (
"$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
showEnvVarsInLog = 0;
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build";
};
/* End PBXShellScriptBuildPhase section */
@ -413,18 +462,20 @@
);
runOnlyForDeploymentPostprocessing = 0;
};
61AE8DC63010AA4700DB059A /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
97C146EA1CF9000F007C117D /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */,
61243B492EC5FA3700D46FA0 /* PenguinModel.swift in Sources */,
61243B4C2EC5FA3700D46FA0 /* HMGPenguinInPlatformBridge.swift in Sources */,
61243B502EC5FA3700D46FA0 /* PenguinView.swift in Sources */,
61243B542EC5FA3700D46FA0 /* PenguinPlugin.swift in Sources */,
61243B562EC5FA3700D46FA0 /* PenguinNavigator.swift in Sources */,
61243B572EC5FA3700D46FA0 /* PenguinViewFactory.swift in Sources */,
1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */,
61D6DAB9300F718A002E5487 /* LiveActivityHelper.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@ -436,6 +487,11 @@
target = 97C146ED1CF9000F007C117D /* Runner */;
targetProxy = 331C8085294A63A400263BE5 /* PBXContainerItemProxy */;
};
61AE8DD83010AA4A00DB059A /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = 61AE8DC93010AA4700DB059A /* live_notificationExtension */;
targetProxy = 61AE8DD73010AA4A00DB059A /* PBXContainerItemProxy */;
};
/* End PBXTargetDependency section */
/* Begin PBXVariantGroup section */
@ -586,6 +642,136 @@
};
name = Profile;
};
61AE8DDC3010AA4A00DB059A /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CODE_SIGN_ENTITLEMENTS = live_notificationExtensionDebug.entitlements;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = 3A359E86ZF;
ENABLE_USER_SCRIPT_SANDBOXING = YES;
GCC_C_LANGUAGE_STANDARD = gnu17;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = live_notification/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = live_notification;
INFOPLIST_KEY_NSHumanReadableCopyright = "";
IPHONEOS_DEPLOYMENT_TARGET = 26.4;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
"@executable_path/../../Frameworks",
);
LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
MARKETING_VERSION = 1.0;
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = "com.cloudsolutions.HMGPatientApp.live-notification";
PRODUCT_NAME = "$(TARGET_NAME)";
SKIP_INSTALL = YES;
STRING_CATALOG_GENERATE_SYMBOLS = YES;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)";
SWIFT_APPROACHABLE_CONCURRENCY = YES;
SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Debug;
};
61AE8DDD3010AA4A00DB059A /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = 3A359E86ZF;
ENABLE_USER_SCRIPT_SANDBOXING = YES;
GCC_C_LANGUAGE_STANDARD = gnu17;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = live_notification/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = live_notification;
INFOPLIST_KEY_NSHumanReadableCopyright = "";
IPHONEOS_DEPLOYMENT_TARGET = 26.4;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
"@executable_path/../../Frameworks",
);
LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
MARKETING_VERSION = 1.0;
MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = "com.cloudsolutions.HMGPatientApp.live-notification";
PRODUCT_NAME = "$(TARGET_NAME)";
SKIP_INSTALL = YES;
STRING_CATALOG_GENERATE_SYMBOLS = YES;
SWIFT_APPROACHABLE_CONCURRENCY = YES;
SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Release;
};
61AE8DDE3010AA4A00DB059A /* Profile */ = {
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = 3A359E86ZF;
ENABLE_USER_SCRIPT_SANDBOXING = YES;
GCC_C_LANGUAGE_STANDARD = gnu17;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = live_notification/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = live_notification;
INFOPLIST_KEY_NSHumanReadableCopyright = "";
IPHONEOS_DEPLOYMENT_TARGET = 26.4;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
"@executable_path/../../Frameworks",
);
LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
MARKETING_VERSION = 1.0;
MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = "com.cloudsolutions.HMGPatientApp.live-notification";
PRODUCT_NAME = "$(TARGET_NAME)";
SKIP_INSTALL = YES;
STRING_CATALOG_GENERATE_SYMBOLS = YES;
SWIFT_APPROACHABLE_CONCURRENCY = YES;
SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Profile;
};
97C147031CF9000F007C117D /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
@ -703,7 +889,7 @@
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
CODE_SIGN_ENTITLEMENTS = Runner/RunnerDebug.entitlements;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 2;
@ -769,6 +955,16 @@
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Debug;
};
61AE8DDB3010AA4A00DB059A /* Build configuration list for PBXNativeTarget "live_notificationExtension" */ = {
isa = XCConfigurationList;
buildConfigurations = (
61AE8DDC3010AA4A00DB059A /* Debug */,
61AE8DDD3010AA4A00DB059A /* Release */,
61AE8DDE3010AA4A00DB059A /* Profile */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Debug;
};
97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = {
isa = XCConfigurationList;
buildConfigurations = (

@ -20,6 +20,7 @@ import GoogleMaps
func initializePlatformChannels(){
if let mainViewController = window?.rootViewController as? FlutterViewController{ // platform initialization suppose to be in foreground
HMGPenguinInPlatformBridge.initialize(flutterViewController: mainViewController)
LiveActivityHelper().initialize(mainViewController)
}
}
override func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken:Data){

@ -6,7 +6,7 @@
//
import Foundation
import FLAnimatedImage
class LiveActivityHelper{

@ -4,6 +4,14 @@
<dict>
<key>aps-environment</key>
<string>development</string>
<key>com.apple.developer.healthkit</key>
<true/>
<key>com.apple.developer.healthkit.access</key>
<array>
<string>health-records</string>
</array>
<key>com.apple.developer.healthkit.background-delivery</key>
<true/>
<key>com.apple.developer.in-app-payments</key>
<array>
<string>merchant.com.hmgwebservices</string>
@ -13,5 +21,9 @@
<array>
<string>TAG</string>
</array>
<key>com.apple.security.application-groups</key>
<array>
<string>group.alhabib.patientApp</string>
</array>
</dict>
</plist>

@ -2,7 +2,7 @@
// live_notificationBundle.swift
// live_notification
//
// Created by Haroon Amjad on 20/07/2026.
// Created by Cloud Solutions on 22/07/2026.
//
import WidgetKit

@ -2,12 +2,13 @@ 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 typealias LiveDeliveryData = ContentState // don't forget to add this line, otherwise, live activity will not display it.
public struct ContentState: Codable, Hashable { }
public struct ContentState: Codable, Hashable { }
var id = UUID()
var id = UUID()
}
@ -26,7 +27,7 @@ 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 inactiveColor = Color(hex: "#FFA2A2A2")
static let textColor = Color(hex: "#A2A2A2")
static let colorWhite = Color(hex: "#FFFFFF")
@ -67,7 +68,7 @@ struct WidgetColorConfig {
case 0:
return WidgetColorConfig(
nextStepBackground: .inactiveColor,
nextStepTextColor: .textColor,
nextStepTextColor: .colorWhite,
containerBorderColor: .yellowColor
)
case 1:
@ -97,28 +98,150 @@ struct NotificationWidgetData {
let currentTicket: String
let currentlyServingHeader: String
let currentlyServing: String
let status: 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
init(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(){
body2
// .frame(width: .infinity, height: 400 )
// .padding(.top, 340)
// .cornerRadius(20)
// }.background(data.colorConfig.containerBorderColor)
// .cornerRadius(20)
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 {
@ -130,46 +253,46 @@ struct NotificationWidgetView: View {
// .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 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.status)
// 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)
@ -178,24 +301,24 @@ struct NotificationWidgetView: View {
// 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)
// }
// .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)
@ -203,7 +326,7 @@ struct NotificationWidgetView: View {
// RoundedRectangle(cornerRadius: 20)
// .stroke(data.colorConfig.containerBorderColor, lineWidth: 20)
// )
}
// }
}
@ -212,35 +335,52 @@ struct live_notificationLiveActivity: Widget {
var body: some WidgetConfiguration {
ActivityConfiguration(for: LiveActivitiesAppAttributes.self) { context in
// Extract parameters from Flut
// 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")) ?? "IMD A-89"
let status = sharedDefault.string(forKey: context.attributes.prefixedKey("callType")) ?? "0"
let currentlyServing = sharedDefault.string(forKey: context.attributes.prefixedKey("currentlyServingTitle")) ?? "IMD A-86"
let nextStep = sharedDefault.string(forKey: context.attributes.prefixedKey("currentlyServingStatus")) ??
"Please wait! you will be called for vital signs"
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 = 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: nextStepBackground)
let colorConfig = WidgetColorConfig.config(for: callType)
// Create widget data
let widgetData = NotificationWidgetData(
currentTicket: currentTicket,
currentlyServingHeader: "Currently Serving:",
currentlyServingHeader: currentlyServingHeader,
currentlyServing: currentlyServing,
status: status,
currentlyServingStatus: currentlyServingStatus,
nextStep: nextStep,
imageName:"hmg",
colorConfig: colorConfig
)
colorConfig: colorConfig,
progress: 33 * Double(callType),
yourTicketHeaderText : yourTicketHeader,
)
//
// Lock screen/banner UI
NotificationWidgetView(data: widgetData)
.activityBackgroundTint(Color.clear)
.activitySystemActionForegroundColor(Color.black)
// Lock screen/banner UI
NotificationWidgetView(data: widgetData)
// Text(widgetData.currentTicket)
// .font(.custom("Poppins-Medium", size: 28))
@ -251,73 +391,85 @@ struct live_notificationLiveActivity: Widget {
} dynamicIsland: { context in
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 status = 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("currentlyServingStatus")) ??
"test111"
let nextStepBackground = sharedDefault.integer(forKey: context.attributes.prefixedKey("currentlyServingCallType"))
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: nextStepBackground)
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 {
// Expanded UI
DynamicIslandExpandedRegion(.leading) {
VStack(alignment: .leading) {
Text(currentTicket)
.font(.system(size: 24, weight: .bold))
.foregroundColor(.primary)
}
}
DynamicIslandExpandedRegion(.trailing) {
Image("hmg")
.resizable()
.scaledToFit()
.frame(width: 34, height: 34)
.foregroundColor(.gray)
}
//
// Lock screen/banner UI
// // Expanded UI
DynamicIslandExpandedRegion(.center) {
VStack(spacing: 4) {
Text("Currently Servings:")
.font(.caption2)
.foregroundColor(.secondary)
Text(currentlyServing)
.font(.caption)
.fontWeight(.semibold)
}
NotificationWidgetView(data: widgetData, backgroundColor: .black.opacity(0.4)).padding(-24)
}
DynamicIslandExpandedRegion(.bottom) {
HStack {
Text(status)
.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)
}
// 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
@ -326,11 +478,11 @@ struct live_notificationLiveActivity: Widget {
.fontWeight(.bold)
} compactTrailing: {
// Compact trailing view
Image("hmg")
.resizable()
.scaledToFit()
.frame(width: 12, height: 12)
.foregroundColor(colorConfig.containerBorderColor).padding(4)
Image("hmg")
.resizable()
.scaledToFit()
.frame(width: 12, height: 12)
.foregroundColor(colorConfig.containerBorderColor).padding(4)
} minimal: {
// Minimal view
HStack{
@ -346,64 +498,86 @@ struct live_notificationLiveActivity: Widget {
}.padding(2)
}
.contentMargins(.all, 20,for: .expanded)
}
}
}
}
extension LiveActivitiesAppAttributes {
func prefixedKey(_ key: String) -> String {
return "\(id)_\(key)"
}
func prefixedKey(_ key: String) -> String {
print("the id is \(id)")
return "\(id)_\(key)"
}
}
// MARK: - Preview for Testing
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",
status: "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",
status: "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",
status: "Completed",
nextStep: "Next: Ready for Pickup",
imageName: "bell.fill",
colorConfig: .config(for: 2)
)
)
.previewDisplayName("Green Border (2)")
//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 ""
}
}
.padding()
.previewLayout(.sizeThatFits)
}
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>

@ -1,6 +1,6 @@
//
// AppIntent.swift
// live_notification
// live_notifications
//
// Created by Haroon Amjad on 20/07/2026.
//

Before

Width:  |  Height:  |  Size: 2.6 KiB

After

Width:  |  Height:  |  Size: 2.6 KiB

Before

Width:  |  Height:  |  Size: 2.6 KiB

After

Width:  |  Height:  |  Size: 2.6 KiB

Before

Width:  |  Height:  |  Size: 2.6 KiB

After

Width:  |  Height:  |  Size: 2.6 KiB

@ -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()
}
}

@ -56,36 +56,36 @@ extension Color {
}
}
// MARK: - Widget Configuration based on nextStepBackground
// MARK: - Widget Configuration based on currentServingStatusBackground
struct WidgetColorConfig {
let nextStepBackground: Color
let nextStepTextColor: Color
let currentServingStatusBackground: Color
let currentServingStatusTextColor: Color
let containerBorderColor: Color
static func config(for value: Int) -> WidgetColorConfig {
switch value {
case 0:
return WidgetColorConfig(
nextStepBackground: .inactiveColor,
nextStepTextColor: .textColor,
currentServingStatusBackground: .inactiveColor,
currentServingStatusTextColor: .textColor,
containerBorderColor: .yellowColor
)
case 1:
return WidgetColorConfig(
nextStepBackground: .redColorText,
nextStepTextColor: .colorWhite,
currentServingStatusBackground: .redColorText,
currentServingStatusTextColor: .colorWhite,
containerBorderColor: .redColorText
)
case 2:
return WidgetColorConfig(
nextStepBackground: .successColor,
nextStepTextColor: .colorWhite,
currentServingStatusBackground: .successColor,
currentServingStatusTextColor: .colorWhite,
containerBorderColor: .successColor
)
default:
return WidgetColorConfig(
nextStepBackground: .inactiveColor,
nextStepTextColor: .textColor,
currentServingStatusBackground: .inactiveColor,
currentServingStatusTextColor: .textColor,
containerBorderColor: .yellowColor
)
}
@ -94,12 +94,13 @@ struct WidgetColorConfig {
// MARK: - Widget Data Model
struct NotificationWidgetData {
let currentTicket: String
let currentlyServingHeader: String
let queueNo: String
let yourTicketHeader: String
let currentlyServing: String
let status: String
let nextStep: String
let status: Int
let currentServingStatus: String
let imageName: String
let nextTicketStatus: String
let colorConfig: WidgetColorConfig
}
struct NotificationWidgetView: View {
@ -110,136 +111,170 @@ struct NotificationWidgetView: View {
self.data = data
}
var body: some View {
ZStack {
data.colorConfig.containerBorderColor // Background color
.edgesIgnoringSafeArea(.all) // Ensure it covers the entire screen
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)
var body : some View{
// ZStack(){
body2
// .frame(width: .infinity, height: 400 )
// .padding(.top, 340)
// .cornerRadius(20)
// }.background(data.colorConfig.containerBorderColor)
// .cornerRadius(20)
// Currently Serving Header
Text(data.currentlyServingHeader)
.font(.custom("Poppins-Medium", size: 14))
}
// 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, 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.status)
.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(.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)
Spacer()
// 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)
// Next Step badge
Text(data.nextStep)
// Status badge
Text(data.currentServingStatus)
.font(.custom("Poppins-Medium", size: 12))
.foregroundColor(data.colorConfig.nextStepTextColor)
.foregroundColor(data.colorConfig.currentServingStatusTextColor)
.padding(.horizontal, 12)
.padding(.vertical, 8)
.background(
RoundedRectangle(cornerRadius: 8)
.fill(data.colorConfig.nextStepBackground)
.fill(Color.inactiveColor.opacity(0.2))
)
.padding(.horizontal, 16)
.padding(.bottom, 16)
}
.background(Color.white) // Ensure content has a white background
.cornerRadius(20)
.padding() // Add padding to ensure it doesn't touch the edges
.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 AppWidgetLiveActivity: Widget {
struct live_notificationLiveActivity: Widget {
var body: some WidgetConfiguration {
ActivityConfiguration(for: LiveActivitiesAppAttributes.self) { context in
// Extract parameters from Flutter
print("it is being loaded")
// 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")) ?? "testes"
let contentText = sharedDefault.string(forKey: context.attributes.prefixedKey("contentText")) ?? "tested"
let currentTicket = 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 nextStep = sharedDefault.string(forKey: context.attributes.prefixedKey("currentlyServingStatus")) ??
"test111"
let nextStepBackground = sharedDefault.integer(forKey: context.attributes.prefixedKey("currentlyServingCallType"))
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")) ?? ""
// Get color configuration based on nextStepBackground
let colorConfig = WidgetColorConfig.config(for: nextStepBackground)
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(
currentTicket: currentTicket,
currentlyServingHeader: "Currently Servingsssssssss:",
queueNo: queueNo,
yourTicketHeader: yourTicketHeader,
currentlyServing: currentlyServing,
status: status,
nextStep: nextStep,
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 currentTicket = sharedDefault.string(forKey: context.attributes.prefixedKey("queueNo")) ?? "test1234"
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 nextStep = sharedDefault.string(forKey: context.attributes.prefixedKey("currentlyServingStatus")) ??
let currentServingStatus = sharedDefault.string(forKey: context.attributes.prefixedKey("currentlyServingStatus")) ??
"test111"
let nextStepBackground = sharedDefault.integer(forKey: context.attributes.prefixedKey("currentlyServingCallType"))
let currentServingStatusBackground = sharedDefault.integer(forKey: context.attributes.prefixedKey("currentlyServingCallType"))
let colorConfig = WidgetColorConfig.config(for: nextStepBackground)
let colorConfig = WidgetColorConfig.config(for: currentServingStatusBackground)
return DynamicIsland {
// Expanded UI
DynamicIslandExpandedRegion(.leading) {
VStack(alignment: .leading) {
Text(currentTicket)
Text(queueNo)
.font(.system(size: 24, weight: .bold))
.foregroundColor(.primary)
}
@ -255,7 +290,7 @@ struct AppWidgetLiveActivity: Widget {
DynamicIslandExpandedRegion(.center) {
VStack(spacing: 4) {
Text("Currently Serving:")
Text("Currently Servings:")
.font(.caption2)
.foregroundColor(.secondary)
@ -273,19 +308,19 @@ struct AppWidgetLiveActivity: Widget {
.padding(.vertical, 4)
.background(
RoundedRectangle(cornerRadius: 6)
.fill(colorConfig.nextStepBackground.opacity(0.2))
.fill(colorConfig.currentServingStatusBackground.opacity(0.2))
)
Spacer()
Text(nextStep)
Text(currentServingStatus)
.font(.caption2)
.foregroundColor(colorConfig.nextStepTextColor)
.foregroundColor(colorConfig.currentServingStatusTextColor)
.padding(.horizontal, 8)
.padding(.vertical, 4)
.background(
RoundedRectangle(cornerRadius: 6)
.fill(colorConfig.nextStepBackground)
.fill(colorConfig.currentServingStatusBackground)
)
}
.padding(.horizontal)
@ -293,7 +328,7 @@ struct AppWidgetLiveActivity: Widget {
} compactLeading: {
// Compact leading view
Text(currentTicket)
Text(queueNo)
.font(.caption2)
.fontWeight(.bold)
} compactTrailing: {
@ -306,7 +341,7 @@ struct AppWidgetLiveActivity: Widget {
} minimal: {
// Minimal view
HStack{
Text(currentTicket)
Text(queueNo)
.font(.caption2)
.fontWeight(.bold)
Spacer()
@ -326,6 +361,7 @@ struct AppWidgetLiveActivity: Widget {
extension LiveActivitiesAppAttributes {
func prefixedKey(_ key: String) -> String {
print("the id to get the element is \(id)")
return "\(id)_\(key)"
}
}
@ -333,43 +369,46 @@ extension LiveActivitiesAppAttributes {
struct NotificationWidgetView_Previews: PreviewProvider {
static var previews: some View {
Group {
// Preview with nextStepBackground = 0 (Yellow border)
// Preview with currentServingStatusBackground = 0 (Yellow border)
NotificationWidgetView(
data: NotificationWidgetData(
currentTicket: "42",
currentlyServingHeader: "Currently Serving3:",
queueNo: "42",
yourTicketHeader: "Currently Serving3:",
currentlyServing: "Customer #15",
status: "Pending",
nextStep: "Next: Prepare Order",
status: 0,
currentServingStatus: "Next: Prepare Order",
imageName: "bell.fill",
nextTicketStatus: "bell.fill",
colorConfig: .config(for: 0)
)
)
.previewDisplayName("Yellow Border (0)")
// Preview with nextStepBackground = 1 (Red border)
// Preview with currentServingStatusBackground = 1 (Red border)
NotificationWidgetView(
data: NotificationWidgetData(
currentTicket: "89",
currentlyServingHeader: "Currently Serving2:",
queueNo: "89",
yourTicketHeader: "Currently Serving2:",
currentlyServing: "Customer #67",
status: "Active",
nextStep: "Next: Quality Check",
status: 1,
currentServingStatus: "Next: Quality Check",
imageName: "bell.fill",
nextTicketStatus: "bell.fill",
colorConfig: .config(for: 1)
)
)
.previewDisplayName("Red Border (1)")
// Preview with nextStepBackground = 2 (Green border)
// Preview with currentServingStatusBackground = 2 (Green border)
NotificationWidgetView(
data: NotificationWidgetData(
currentTicket: "125",
currentlyServingHeader: "Currently Serving1:",
queueNo: "125",
yourTicketHeader: "Currently Serving1:",
currentlyServing: "Customer #98",
status: "Completed",
nextStep: "Next: Ready for Pickup",
status: 1,
currentServingStatus: "Next: Ready for Pickup",
imageName: "bell.fill",
nextTicketStatus: "bell.fill",
colorConfig: .config(for: 2)
)
)
@ -379,4 +418,3 @@ struct NotificationWidgetView_Previews: PreviewProvider {
.previewLayout(.sizeThatFits)
}
}

@ -120,9 +120,9 @@ addLiveNotification(dynamic data, {bool isBackgroundMessage = false}) async{
var liveActivity = LiveActivities();
liveActivity.init(appGroupId: "group.alhabib.patientApp");
if(Platform.isIOS){
LiveActivityHelperChannel.removeData();
}
// if(Platform.isIOS){
// LiveActivityHelperChannel.removeData();
// }
var queueNoForWhichActivityIdCreated = await Utils.getStringFromPrefs( CacheConst.patientQueueNoForLiveActivity);
var activityId = await Utils.getStringFromPrefs( data.data['queueNo'] ??"");

@ -1194,11 +1194,11 @@ class Utils {
currentlyServingToken: data.data['servingQueueNo'] ?? "IME-3",
nextTicketStatus: buttonText,
callType: int.parse(data.data['callType'] ?? "1"),
currentlyServingCallType: int.parse(data.data['servingCallType'] ?? "1"),
currentlyServingCallType: data.data['servingCallType'].isEmpty?0:int.parse(data.data['servingCallType'] ?? "1"),
yourTicketHeader: LocaleKeys.yourQueueNumber.tr(),
currentlyServingTitle: LocaleKeys.currentServing.tr());
if ((queueNoForWhichActivityIdCreated ?? "") != (_patientQueue.queueNo ?? "")) {
liveActivity.endActivity(activityId);
liveActivity.endAllActivities();
activityId = "";
}
@ -1211,16 +1211,23 @@ class Utils {
await Utils.saveStringFromPrefs(CacheConst.patientQueueNoForLiveActivity ?? "", _patientQueue.queueNo ?? "");
return;
}
if (Platform.isIOS) {
await liveActivity.createOrUpdateActivity(
activityId,
_patientQueue.toMap(),
);
} else {
// if (Platform.isIOS) {
// await liveActivity.createOrUpdateActivity(
// activityId,
// _patientQueue.toMap(),
// );
// } else {
try{
await liveActivity.updateActivity(
activityId,
_patientQueue.toMap(),
);
);}
catch(e){
await liveActivity.createOrUpdateActivity(
activityId,
_patientQueue.toMap(),
);
}
// }
}
}

@ -27,6 +27,7 @@ import 'package:hmg_patient_app_new/features/hospital/hospital_selection_view_mo
import 'package:hmg_patient_app_new/features/immediate_livecare/immediate_livecare_view_model.dart';
import 'package:hmg_patient_app_new/features/insurance/insurance_view_model.dart';
import 'package:hmg_patient_app_new/features/my_appointments/appointment_rating_view_model.dart';
import 'package:hmg_patient_app_new/features/my_appointments/models/patient_queue_live_notification_model.dart';
import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/patient_appointment_history_response_model.dart';
import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/patient_queue_details_response_model.dart';
import 'package:hmg_patient_app_new/features/my_appointments/my_appointments_view_model.dart';
@ -316,6 +317,28 @@ class _LandingPageState extends State<LandingPage> {
padding: EdgeInsets.fromLTRB(12.h, 0, 12.h, 0),
height: 40.h,
),
ElevatedButton(onPressed: (){
QueueLiveNotificationModel queueLiveNotificationModel = QueueLiveNotificationModel();
queueLiveNotificationModel.data = {
"msgID": "123",
"notfID": "123",
"isLiveActivity":"true",
"notification_foreground": "true",
"patientID": "12345",
"patientName": "John Doe",
"queueNo": "A-104",
"callType": "1",
"servingQueueNo": "",
"servingCallType": "",
"roomNo": "204",
"calledOn": "2024-05-21T14:30:00Z",
"servingNow": "true"
};
Utils.addLiveNotification(queueLiveNotificationModel, isBackgroundMessage: false);
}, child: Text("press")).paddingOnly(top: 56.h),
Consumer<TodoSectionViewModel>(builder: (context, todoSectionVM, child) {
return Row(
mainAxisSize: MainAxisSize.min,

@ -7,6 +7,7 @@ import 'package:hmg_patient_app_new/core/utils/size_utils.dart';
import 'package:hmg_patient_app_new/core/utils/utils.dart';
import 'package:hmg_patient_app_new/extensions/string_extensions.dart';
import 'package:hmg_patient_app_new/extensions/widget_extensions.dart';
import 'package:hmg_patient_app_new/features/my_appointments/models/patient_queue_live_notification_model.dart';
import 'package:hmg_patient_app_new/generated/locale_keys.g.dart';
import 'package:hmg_patient_app_new/presentation/home/navigation_screen.dart';
import 'package:hmg_patient_app_new/theme/colors.dart';
@ -64,6 +65,28 @@ class _OnboardingScreenState extends State<OnboardingScreen> {
child: Column(
spacing: 24.h,
children: [
ElevatedButton(onPressed: (){
QueueLiveNotificationModel queueLiveNotificationModel = QueueLiveNotificationModel();
queueLiveNotificationModel.data = {
"msgID": "123",
"notfID": "123",
"isLiveActivity":"true",
"notification_foreground": "true",
"patientID": "12345",
"patientName": "John Doe",
"queueNo": "A-109",
"callType": "0",
"servingQueueNo": "",
"servingCallType": "",
"roomNo": "204",
"calledOn": "2024-05-21T14:30:00Z",
"servingNow": "true"
};
Utils.addLiveNotification(queueLiveNotificationModel, isBackgroundMessage: false);
}, child: Text("press")).paddingOnly(top: 56.h),
PageView(
controller: pageController,
children: [

@ -16,6 +16,7 @@ import 'package:hmg_patient_app_new/core/dependencies.dart';
import 'package:hmg_patient_app_new/core/utils/utils.dart';
import 'package:hmg_patient_app_new/extensions/widget_extensions.dart';
import 'package:hmg_patient_app_new/features/authentication/authentication_view_model.dart';
import 'package:hmg_patient_app_new/features/my_appointments/models/patient_queue_live_notification_model.dart';
import 'package:hmg_patient_app_new/presentation/home/navigation_screen.dart';
import 'package:hmg_patient_app_new/presentation/onboarding/onboarding_screen.dart';
import 'package:hmg_patient_app_new/presentation/onboarding/splash_animation_screen.dart';

@ -117,10 +117,10 @@ packages:
dependency: transitive
description:
name: characters
sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803
sha256: faf38497bda5ead2a8c7615f4f7939df04333478bf32e4173fcb06d428b5716b
url: "https://pub.dev"
source: hosted
version: "1.4.0"
version: "1.4.1"
chewie:
dependency: transitive
description:
@ -145,6 +145,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.1.2"
cloudflare_turnstile:
dependency: "direct main"
description:
name: cloudflare_turnstile
sha256: f04191fd1f9c658e98c11175356f34aaeca42b4ed91ee66d42fb250b3346160d
url: "https://pub.dev"
source: hosted
version: "3.8.0"
collection:
dependency: transitive
description:
@ -499,6 +507,22 @@ packages:
description: flutter
source: sdk
version: "0.0.0"
flutter_amazonpaymentservices:
dependency: "direct main"
description:
name: flutter_amazonpaymentservices
sha256: "23f45fd3b1e12a0933da3704d66cebd19c4c41e28a50d4fd458d3e3e6311f332"
url: "https://pub.dev"
source: hosted
version: "0.0.13"
flutter_app_group_directory:
dependency: transitive
description:
name: flutter_app_group_directory
sha256: "680ef9b2dee84c237cd7bb7fc78bc45867b32556a8a5f0de61278078b9fefd05"
url: "https://pub.dev"
source: hosted
version: "1.1.0"
flutter_cache_manager:
dependency: transitive
description:
@ -720,6 +744,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "4.0.1"
flutter_screenshot_blocker:
dependency: "direct main"
description:
name: flutter_screenshot_blocker
sha256: "20e36b4aaca20259008dbb1403b77af6207d48cd8382a772b9c27619bc116849"
url: "https://pub.dev"
source: hosted
version: "1.0.4"
flutter_staggered_animations:
dependency: "direct main"
description:
@ -773,10 +805,10 @@ packages:
dependency: "direct main"
description:
name: flutter_zoom_videosdk
sha256: "46a4dea664b1c969099328a499c198a1755adf9ac333dea28bea5187910b3bf9"
sha256: "8f6dba6b5c910097aca7f3c582a11b10a6fb5def49fead745d837283b5f5ef52"
url: "https://pub.dev"
source: hosted
version: "2.1.10"
version: "2.4.0"
fluttertoast:
dependency: "direct main"
description:
@ -1233,6 +1265,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "5.1.1"
live_activities:
dependency: "direct main"
description:
name: live_activities
sha256: "060f4d8f57b399e5c8beb255fa8426b9b4789320414ae68c8510aec113269dbd"
url: "https://pub.dev"
source: hosted
version: "2.4.9"
local_auth:
dependency: "direct main"
description:
@ -1341,18 +1381,18 @@ packages:
dependency: transitive
description:
name: matcher
sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2
sha256: dc0b7dc7651697ea4ff3e69ef44b0407ea32c487a39fff6a4004fa585e901861
url: "https://pub.dev"
source: hosted
version: "0.12.17"
version: "0.12.19"
material_color_utilities:
dependency: transitive
description:
name: material_color_utilities
sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec
sha256: "9c337007e82b1889149c82ed242ed1cb24a66044e30979c44912381e9be4c48b"
url: "https://pub.dev"
source: hosted
version: "0.11.1"
version: "0.13.0"
meta:
dependency: transitive
description:
@ -1641,6 +1681,54 @@ packages:
url: "https://pub.dev"
source: hosted
version: "2.1.0"
screen_brightness:
dependency: "direct main"
description:
name: screen_brightness
sha256: "7d4ac84ae26b37c01d6f5db7123a72db7933e1f2a2a8c369a51e08f81b3178d8"
url: "https://pub.dev"
source: hosted
version: "1.0.1"
screen_brightness_android:
dependency: transitive
description:
name: screen_brightness_android
sha256: "8c69d3ac475e4d625e7fa682a3a51a69ff59abe5b4a9e57f6ec7d830a6c69bd6"
url: "https://pub.dev"
source: hosted
version: "1.0.1"
screen_brightness_ios:
dependency: transitive
description:
name: screen_brightness_ios
sha256: f08f70ca1ac3e30719764b5cfb8b3fe1e28163065018a41b3e6f243ab146c2f1
url: "https://pub.dev"
source: hosted
version: "1.0.1"
screen_brightness_macos:
dependency: transitive
description:
name: screen_brightness_macos
sha256: "70c2efa4534e22b927e82693488f127dd4a0f008469fccf4f0eefe9061bbdd6a"
url: "https://pub.dev"
source: hosted
version: "1.0.1"
screen_brightness_platform_interface:
dependency: transitive
description:
name: screen_brightness_platform_interface
sha256: "9f3ebf7f22d5487e7676fe9ddaf3fc55b6ff8057707cf6dc0121c7dfda346a16"
url: "https://pub.dev"
source: hosted
version: "1.0.1"
screen_brightness_windows:
dependency: transitive
description:
name: screen_brightness_windows
sha256: c8e12a91cf6dd912a48bd41fcf749282a51afa17f536c3460d8d05702fb89ffa
url: "https://pub.dev"
source: hosted
version: "1.0.1"
scrollable_positioned_list:
dependency: "direct main"
description:
@ -1890,10 +1978,10 @@ packages:
dependency: transitive
description:
name: test_api
sha256: ab2726c1a94d3176a45960b6234466ec367179b87dd74f1611adb1f3b5fb9d55
sha256: "8161c84903fd860b26bfdefb7963b3f0b68fee7adea0f59ef805ecca346f0c7a"
url: "https://pub.dev"
source: hosted
version: "0.7.7"
version: "0.7.10"
time:
dependency: transitive
description:
@ -2175,5 +2263,5 @@ packages:
source: hosted
version: "1.2.0"
sdks:
dart: ">=3.9.0 <4.0.0"
flutter: ">=3.35.0"
dart: ">=3.11.0 <4.0.0"
flutter: ">=3.41.0"

Loading…
Cancel
Save