diff --git a/android/.gradle/8.12/checksums/checksums.lock b/android/.gradle/8.12/checksums/checksums.lock index 0713cfa7..38a36098 100644 Binary files a/android/.gradle/8.12/checksums/checksums.lock and b/android/.gradle/8.12/checksums/checksums.lock differ diff --git a/android/.gradle/8.12/executionHistory/executionHistory.bin b/android/.gradle/8.12/executionHistory/executionHistory.bin index ba37806b..c2722df1 100644 Binary files a/android/.gradle/8.12/executionHistory/executionHistory.bin and b/android/.gradle/8.12/executionHistory/executionHistory.bin differ diff --git a/android/.gradle/8.12/executionHistory/executionHistory.lock b/android/.gradle/8.12/executionHistory/executionHistory.lock index 7517916b..e5643ff8 100644 Binary files a/android/.gradle/8.12/executionHistory/executionHistory.lock and b/android/.gradle/8.12/executionHistory/executionHistory.lock differ diff --git a/android/.gradle/8.12/expanded/expanded.lock b/android/.gradle/8.12/expanded/expanded.lock index 698af08f..716cc523 100644 Binary files a/android/.gradle/8.12/expanded/expanded.lock and b/android/.gradle/8.12/expanded/expanded.lock differ diff --git a/android/.gradle/8.12/fileHashes/fileHashes.bin b/android/.gradle/8.12/fileHashes/fileHashes.bin index e9b6e1d1..9af24af5 100644 Binary files a/android/.gradle/8.12/fileHashes/fileHashes.bin and b/android/.gradle/8.12/fileHashes/fileHashes.bin differ diff --git a/android/.gradle/8.12/fileHashes/fileHashes.lock b/android/.gradle/8.12/fileHashes/fileHashes.lock index e8fb2e32..6ca877ce 100644 Binary files a/android/.gradle/8.12/fileHashes/fileHashes.lock and b/android/.gradle/8.12/fileHashes/fileHashes.lock differ diff --git a/android/.gradle/8.12/fileHashes/resourceHashesCache.bin b/android/.gradle/8.12/fileHashes/resourceHashesCache.bin index 16f94652..3bdf6fe1 100644 Binary files a/android/.gradle/8.12/fileHashes/resourceHashesCache.bin and b/android/.gradle/8.12/fileHashes/resourceHashesCache.bin differ diff --git a/android/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/android/.gradle/buildOutputCleanup/buildOutputCleanup.lock index 1e881cb1..fec79e6e 100644 Binary files a/android/.gradle/buildOutputCleanup/buildOutputCleanup.lock and b/android/.gradle/buildOutputCleanup/buildOutputCleanup.lock differ diff --git a/android/.gradle/buildOutputCleanup/outputFiles.bin b/android/.gradle/buildOutputCleanup/outputFiles.bin index 8a9e3f90..269312cd 100644 Binary files a/android/.gradle/buildOutputCleanup/outputFiles.bin and b/android/.gradle/buildOutputCleanup/outputFiles.bin differ diff --git a/android/app/src/main/java/io/flutter/plugins/GeneratedPluginRegistrant.java b/android/app/src/main/java/io/flutter/plugins/GeneratedPluginRegistrant.java index 59ce5107..bfa6e960 100644 --- a/android/app/src/main/java/io/flutter/plugins/GeneratedPluginRegistrant.java +++ b/android/app/src/main/java/io/flutter/plugins/GeneratedPluginRegistrant.java @@ -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()); diff --git a/android/app/src/main/kotlin/com/ejada/hmg/live_activity/CustomActiviy.kt b/android/app/src/main/kotlin/com/ejada/hmg/live_activity/CustomActiviy.kt index 3f677ae8..fe1e564c 100644 --- a/android/app/src/main/kotlin/com/ejada/hmg/live_activity/CustomActiviy.kt +++ b/android/app/src/main/kotlin/com/ejada/hmg/live_activity/CustomActiviy.kt @@ -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) { 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 ?: "") diff --git a/android/local.properties b/android/local.properties index ae10dcd1..6316c058 100644 --- a/android/local.properties +++ b/android/local.properties @@ -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 \ No newline at end of file +sdk.dir=/Users/cloud/Library/Android/sdk \ No newline at end of file diff --git a/ios/AppWidget/AppWidgetBundle.swift b/ios/AppWidget/AppWidgetBundle.swift deleted file mode 100644 index 19e1f5e5..00000000 --- a/ios/AppWidget/AppWidgetBundle.swift +++ /dev/null @@ -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() - } -} diff --git a/ios/AppWidget/Assets.xcassets/hmg.imageset/Contents.json b/ios/AppWidget/Assets.xcassets/hmg.imageset/Contents.json deleted file mode 100644 index 3b5c69ac..00000000 --- a/ios/AppWidget/Assets.xcassets/hmg.imageset/Contents.json +++ /dev/null @@ -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 - } -} diff --git a/ios/AppWidget/Info.plist b/ios/AppWidget/Info.plist deleted file mode 100644 index 235ca0b6..00000000 --- a/ios/AppWidget/Info.plist +++ /dev/null @@ -1,17 +0,0 @@ - - - - - UIAppFonts - - Poppins-Medium.ttf - - NSSupportsLiveActivities - - NSExtension - - NSExtensionPointIdentifier - com.apple.widgetkit-extension - - - diff --git a/ios/AppWidget/Poppins-Medium.ttf b/ios/AppWidget/Poppins-Medium.ttf deleted file mode 100644 index e90e87ed..00000000 Binary files a/ios/AppWidget/Poppins-Medium.ttf and /dev/null differ diff --git a/ios/AppWidgetLiveActivity/AppWidgetLiveActivityBundle.swift b/ios/AppWidgetLiveActivity/AppWidgetLiveActivityBundle.swift deleted file mode 100644 index f1e9842c..00000000 --- a/ios/AppWidgetLiveActivity/AppWidgetLiveActivityBundle.swift +++ /dev/null @@ -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() - } -} diff --git a/ios/AppWidgetLiveActivity/AppWidgetLiveActivityLiveActivity.swift b/ios/AppWidgetLiveActivity/AppWidgetLiveActivityLiveActivity.swift deleted file mode 100644 index 18e1abe3..00000000 --- a/ios/AppWidgetLiveActivity/AppWidgetLiveActivityLiveActivity.swift +++ /dev/null @@ -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" -} diff --git a/ios/AppWidgetLiveActivity/Assets.xcassets/AccentColor.colorset/Contents.json b/ios/AppWidgetLiveActivity/Assets.xcassets/AccentColor.colorset/Contents.json deleted file mode 100644 index eb878970..00000000 --- a/ios/AppWidgetLiveActivity/Assets.xcassets/AccentColor.colorset/Contents.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "colors" : [ - { - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/ios/AppWidgetLiveActivity/Assets.xcassets/AppIcon.appiconset/Contents.json b/ios/AppWidgetLiveActivity/Assets.xcassets/AppIcon.appiconset/Contents.json deleted file mode 100644 index 23058801..00000000 --- a/ios/AppWidgetLiveActivity/Assets.xcassets/AppIcon.appiconset/Contents.json +++ /dev/null @@ -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 - } -} diff --git a/ios/AppWidgetLiveActivity/Assets.xcassets/Contents.json b/ios/AppWidgetLiveActivity/Assets.xcassets/Contents.json deleted file mode 100644 index 73c00596..00000000 --- a/ios/AppWidgetLiveActivity/Assets.xcassets/Contents.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/ios/AppWidgetLiveActivity/Assets.xcassets/WidgetBackground.colorset/Contents.json b/ios/AppWidgetLiveActivity/Assets.xcassets/WidgetBackground.colorset/Contents.json deleted file mode 100644 index eb878970..00000000 --- a/ios/AppWidgetLiveActivity/Assets.xcassets/WidgetBackground.colorset/Contents.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "colors" : [ - { - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/ios/AppWidgetLiveActivity/Assets.xcassets/clock.imageset/Contents.json b/ios/AppWidgetLiveActivity/Assets.xcassets/clock.imageset/Contents.json deleted file mode 100644 index f2e282ff..00000000 --- a/ios/AppWidgetLiveActivity/Assets.xcassets/clock.imageset/Contents.json +++ /dev/null @@ -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 - } -} diff --git a/ios/AppWidgetLiveActivity/Assets.xcassets/clock.imageset/icon.svg b/ios/AppWidgetLiveActivity/Assets.xcassets/clock.imageset/icon.svg deleted file mode 100644 index d2e84a39..00000000 --- a/ios/AppWidgetLiveActivity/Assets.xcassets/clock.imageset/icon.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/ios/AppWidgetLiveActivity/Assets.xcassets/hmg.imageset/hmg 1.svg b/ios/AppWidgetLiveActivity/Assets.xcassets/hmg.imageset/hmg 1.svg deleted file mode 100644 index ccaed0c3..00000000 --- a/ios/AppWidgetLiveActivity/Assets.xcassets/hmg.imageset/hmg 1.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/ios/AppWidgetLiveActivity/Assets.xcassets/hmg.imageset/hmg 2.svg b/ios/AppWidgetLiveActivity/Assets.xcassets/hmg.imageset/hmg 2.svg deleted file mode 100644 index ccaed0c3..00000000 --- a/ios/AppWidgetLiveActivity/Assets.xcassets/hmg.imageset/hmg 2.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/ios/AppWidgetLiveActivity/Assets.xcassets/hmg.imageset/hmg.svg b/ios/AppWidgetLiveActivity/Assets.xcassets/hmg.imageset/hmg.svg deleted file mode 100644 index ccaed0c3..00000000 --- a/ios/AppWidgetLiveActivity/Assets.xcassets/hmg.imageset/hmg.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/ios/AppWidgetLiveActivity/Assets.xcassets/profession.imageset/Contents.json b/ios/AppWidgetLiveActivity/Assets.xcassets/profession.imageset/Contents.json deleted file mode 100644 index f36884c0..00000000 --- a/ios/AppWidgetLiveActivity/Assets.xcassets/profession.imageset/Contents.json +++ /dev/null @@ -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 - } -} diff --git a/ios/AppWidgetLiveActivity/Assets.xcassets/profession.imageset/doctor-02.svg b/ios/AppWidgetLiveActivity/Assets.xcassets/profession.imageset/doctor-02.svg deleted file mode 100644 index 9c44db83..00000000 --- a/ios/AppWidgetLiveActivity/Assets.xcassets/profession.imageset/doctor-02.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/ios/Flutter/AppFrameworkInfo.plist b/ios/Flutter/AppFrameworkInfo.plist index 1dc6cf76..391a902b 100644 --- a/ios/Flutter/AppFrameworkInfo.plist +++ b/ios/Flutter/AppFrameworkInfo.plist @@ -20,7 +20,5 @@ ???? CFBundleVersion 1.0 - MinimumOSVersion - 13.0 diff --git a/ios/Podfile.lock b/ios/Podfile.lock index f10a0930..b858ea36 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -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 diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index fdc3bdfa..d4f26a7e 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -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 = ""; }; 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; + 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 = ""; }; 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 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 = ""; }; - 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 = ""; }; 478CFA932E638C8E0064F3D7 /* GoogleService-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; }; 478CFA952E6E20A60064F3D7 /* Runner.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Runner.entitlements; sourceTree = ""; }; - 61243B3D2EC5FA3700D46FA0 /* HMGPenguinInPlatformBridge.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HMGPenguinInPlatformBridge.swift; sourceTree = ""; }; - 61243B422EC5FA3700D46FA0 /* PenguinModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PenguinModel.swift; sourceTree = ""; }; - 61243B432EC5FA3700D46FA0 /* PenguinNavigator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PenguinNavigator.swift; sourceTree = ""; }; - 61243B442EC5FA3700D46FA0 /* PenguinPlugin.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PenguinPlugin.swift; sourceTree = ""; }; - 61243B452EC5FA3700D46FA0 /* PenguinView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PenguinView.swift; sourceTree = ""; }; - 61243B462EC5FA3700D46FA0 /* PenguinViewFactory.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PenguinViewFactory.swift; sourceTree = ""; }; + 612BC91D3011009600FF6F5B /* live_notificationExtensionDebug.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = live_notificationExtensionDebug.entitlements; sourceTree = ""; }; + 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 = ""; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 769C9BF82E6F106D009F68A9 /* RunnerDebug.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = RunnerDebug.entitlements; sourceTree = ""; }; 76AA18AC2F3B2A4D00DC8DFC /* ring_30Sec.caf */ = {isa = PBXFileReference; lastKnownFileType = file; path = ring_30Sec.caf; sourceTree = ""; }; - 76B1D24E2F91BF8000DBBD1B /* Penguin.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = Penguin.xcframework; path = Frameworks/Penguin.xcframework; sourceTree = ""; }; - 76B1D24F2F91BF8000DBBD1B /* PenguinINRenderer.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = PenguinINRenderer.xcframework; path = Frameworks/PenguinINRenderer.xcframework; sourceTree = ""; }; - 76B1D2502F91BF8000DBBD1B /* PenNavUI.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = PenNavUI.xcframework; path = Frameworks/PenNavUI.xcframework; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; - 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 = ""; }; + 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 = ""; }; + 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 = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; 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 = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 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 = ""; + }; +/* 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 = ""; }; - 61243B412EC5FA3700D46FA0 /* Helper */ = { - isa = PBXGroup; - children = ( - 61243B3D2EC5FA3700D46FA0 /* HMGPenguinInPlatformBridge.swift */, - ); - path = Helper; - sourceTree = ""; - }; - 61243B472EC5FA3700D46FA0 /* Penguin */ = { - isa = PBXGroup; - children = ( - 61243B422EC5FA3700D46FA0 /* PenguinModel.swift */, - 61243B432EC5FA3700D46FA0 /* PenguinNavigator.swift */, - 61243B442EC5FA3700D46FA0 /* PenguinPlugin.swift */, - 61243B452EC5FA3700D46FA0 /* PenguinView.swift */, - 61243B462EC5FA3700D46FA0 /* PenguinViewFactory.swift */, - ); - path = Penguin; - sourceTree = ""; - }; 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 = ""; @@ -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 = ""; @@ -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 = ""; @@ -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 = ( diff --git a/ios/Runner/AppDelegate.swift b/ios/Runner/AppDelegate.swift index ef543280..a1a793d9 100644 --- a/ios/Runner/AppDelegate.swift +++ b/ios/Runner/AppDelegate.swift @@ -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){ diff --git a/ios/Runner/Helper/LiveActivityHelper.swift b/ios/Runner/Helper/LiveActivityHelper.swift index ffab96da..4ebde7fd 100644 --- a/ios/Runner/Helper/LiveActivityHelper.swift +++ b/ios/Runner/Helper/LiveActivityHelper.swift @@ -6,7 +6,7 @@ // import Foundation -import FLAnimatedImage + class LiveActivityHelper{ diff --git a/ios/Runner/RunnerDebug.entitlements b/ios/Runner/RunnerDebug.entitlements index 319178a4..2b950d14 100644 --- a/ios/Runner/RunnerDebug.entitlements +++ b/ios/Runner/RunnerDebug.entitlements @@ -4,6 +4,14 @@ aps-environment development + com.apple.developer.healthkit + + com.apple.developer.healthkit.access + + health-records + + com.apple.developer.healthkit.background-delivery + com.apple.developer.in-app-payments merchant.com.hmgwebservices @@ -13,5 +21,9 @@ TAG + com.apple.security.application-groups + + group.alhabib.patientApp + diff --git a/ios/live_notification/live_notificationBundle.swift b/ios/live_notification/live_notificationBundle.swift index 56d9f70c..51dfc678 100644 --- a/ios/live_notification/live_notificationBundle.swift +++ b/ios/live_notification/live_notificationBundle.swift @@ -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 diff --git a/ios/live_notification/live_notificationLiveActivity.swift b/ios/live_notification/live_notificationLiveActivity.swift index 1f52f70e..37f8cf07 100644 --- a/ios/live_notification/live_notificationLiveActivity.swift +++ b/ios/live_notification/live_notificationLiveActivity.swift @@ -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 "" } diff --git a/ios/live_notificationExtensionDebug.entitlements b/ios/live_notificationExtensionDebug.entitlements new file mode 100644 index 00000000..a1ca053c --- /dev/null +++ b/ios/live_notificationExtensionDebug.entitlements @@ -0,0 +1,10 @@ + + + + + com.apple.security.application-groups + + group.alhabib.patientApp + + + diff --git a/ios/live_notification/AppIntent.swift b/ios/live_notifications/AppIntent.swift similarity index 95% rename from ios/live_notification/AppIntent.swift rename to ios/live_notifications/AppIntent.swift index e27be965..cca69d59 100644 --- a/ios/live_notification/AppIntent.swift +++ b/ios/live_notifications/AppIntent.swift @@ -1,6 +1,6 @@ // // AppIntent.swift -// live_notification +// live_notifications // // Created by Haroon Amjad on 20/07/2026. // diff --git a/ios/AppWidget/Assets.xcassets/AccentColor.colorset/Contents.json b/ios/live_notifications/Assets.xcassets/AccentColor.colorset/Contents.json similarity index 100% rename from ios/AppWidget/Assets.xcassets/AccentColor.colorset/Contents.json rename to ios/live_notifications/Assets.xcassets/AccentColor.colorset/Contents.json diff --git a/ios/AppWidget/Assets.xcassets/AppIcon.appiconset/Contents.json b/ios/live_notifications/Assets.xcassets/AppIcon.appiconset/Contents.json similarity index 100% rename from ios/AppWidget/Assets.xcassets/AppIcon.appiconset/Contents.json rename to ios/live_notifications/Assets.xcassets/AppIcon.appiconset/Contents.json diff --git a/ios/AppWidget/Assets.xcassets/Contents.json b/ios/live_notifications/Assets.xcassets/Contents.json similarity index 100% rename from ios/AppWidget/Assets.xcassets/Contents.json rename to ios/live_notifications/Assets.xcassets/Contents.json diff --git a/ios/AppWidget/Assets.xcassets/WidgetBackground.colorset/Contents.json b/ios/live_notifications/Assets.xcassets/WidgetBackground.colorset/Contents.json similarity index 100% rename from ios/AppWidget/Assets.xcassets/WidgetBackground.colorset/Contents.json rename to ios/live_notifications/Assets.xcassets/WidgetBackground.colorset/Contents.json diff --git a/ios/AppWidgetLiveActivity/Assets.xcassets/hmg.imageset/Contents.json b/ios/live_notifications/Assets.xcassets/hmg.imageset/Contents.json similarity index 100% rename from ios/AppWidgetLiveActivity/Assets.xcassets/hmg.imageset/Contents.json rename to ios/live_notifications/Assets.xcassets/hmg.imageset/Contents.json diff --git a/ios/AppWidget/Assets.xcassets/hmg.imageset/hmg 1.svg b/ios/live_notifications/Assets.xcassets/hmg.imageset/hmg 1.svg similarity index 100% rename from ios/AppWidget/Assets.xcassets/hmg.imageset/hmg 1.svg rename to ios/live_notifications/Assets.xcassets/hmg.imageset/hmg 1.svg diff --git a/ios/AppWidget/Assets.xcassets/hmg.imageset/hmg 2.svg b/ios/live_notifications/Assets.xcassets/hmg.imageset/hmg 2.svg similarity index 100% rename from ios/AppWidget/Assets.xcassets/hmg.imageset/hmg 2.svg rename to ios/live_notifications/Assets.xcassets/hmg.imageset/hmg 2.svg diff --git a/ios/AppWidget/Assets.xcassets/hmg.imageset/hmg.svg b/ios/live_notifications/Assets.xcassets/hmg.imageset/hmg.svg similarity index 100% rename from ios/AppWidget/Assets.xcassets/hmg.imageset/hmg.svg rename to ios/live_notifications/Assets.xcassets/hmg.imageset/hmg.svg diff --git a/ios/AppWidgetLiveActivity/Info.plist b/ios/live_notifications/Info.plist similarity index 100% rename from ios/AppWidgetLiveActivity/Info.plist rename to ios/live_notifications/Info.plist diff --git a/ios/live_notifications/live_notification.swift b/ios/live_notifications/live_notification.swift new file mode 100644 index 00000000..9eec9203 --- /dev/null +++ b/ios/live_notifications/live_notification.swift @@ -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) -> ()) { + 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 { +// // 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: "🤩") +} diff --git a/ios/live_notifications/live_notificationBundle.swift b/ios/live_notifications/live_notificationBundle.swift new file mode 100644 index 00000000..2a55111c --- /dev/null +++ b/ios/live_notifications/live_notificationBundle.swift @@ -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() + } +} diff --git a/ios/AppWidget/AppWidgetLiveActivity.swift b/ios/live_notifications/live_notificationLiveActivity.swift similarity index 53% rename from ios/AppWidget/AppWidgetLiveActivity.swift rename to ios/live_notifications/live_notificationLiveActivity.swift index 51a41224..ec976f41 100644 --- a/ios/AppWidget/AppWidgetLiveActivity.swift +++ b/ios/live_notifications/live_notificationLiveActivity.swift @@ -29,7 +29,7 @@ extension Color { 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) @@ -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")) - - // Get color configuration based on nextStepBackground - let colorConfig = WidgetColorConfig.config(for: nextStepBackground) + let title = sharedDefault.string(forKey: context.attributes.prefixedKey("title")) ?? "" + let yourTicketHeader = sharedDefault.string(forKey: context.attributes.prefixedKey("currentlyServingHeader")) ?? "" + let nextTicketStatus = sharedDefault.string(forKey: context.attributes.prefixedKey("nextTicketStatus")) ?? "" + + let queueNo = sharedDefault.string(forKey: context.attributes.prefixedKey("queueNo")) ?? "" + let currentlyServingToken = sharedDefault.string(forKey: context.attributes.prefixedKey("currentlyServingToken")) ?? "" + let currentlyServing = sharedDefault.string(forKey: context.attributes.prefixedKey("currentlyServingTitle")) ?? "" + let currentServingStatus = sharedDefault.string(forKey: context.attributes.prefixedKey("currentlyServingStatus")) ?? + "" + let currentServingStatusBackground = sharedDefault.integer(forKey: context.attributes.prefixedKey("currentlyServingCallType")) + + let status = sharedDefault.integer(forKey: context.attributes.prefixedKey("callType")) ?? 0 + + + // Get color configuration based on currentServingStatusBackground + let colorConfig = WidgetColorConfig.config(for: status) // Create widget data let widgetData = NotificationWidgetData( - 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) } } - diff --git a/lib/core/utils/push_notification_handler.dart b/lib/core/utils/push_notification_handler.dart index e687f30f..559c936c 100644 --- a/lib/core/utils/push_notification_handler.dart +++ b/lib/core/utils/push_notification_handler.dart @@ -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'] ??""); diff --git a/lib/core/utils/utils.dart b/lib/core/utils/utils.dart index e53b1fc4..1e4a0a03 100644 --- a/lib/core/utils/utils.dart +++ b/lib/core/utils/utils.dart @@ -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(), + ); } + // } } } diff --git a/lib/presentation/home/landing_page.dart b/lib/presentation/home/landing_page.dart index 85f1e972..b292347d 100644 --- a/lib/presentation/home/landing_page.dart +++ b/lib/presentation/home/landing_page.dart @@ -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 { 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(builder: (context, todoSectionVM, child) { return Row( mainAxisSize: MainAxisSize.min, diff --git a/lib/presentation/onboarding/onboarding_screen.dart b/lib/presentation/onboarding/onboarding_screen.dart index 0af63b40..3cc1747e 100644 --- a/lib/presentation/onboarding/onboarding_screen.dart +++ b/lib/presentation/onboarding/onboarding_screen.dart @@ -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 { 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: [ diff --git a/lib/splashPage.dart b/lib/splashPage.dart index dc49428a..881f9895 100644 --- a/lib/splashPage.dart +++ b/lib/splashPage.dart @@ -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'; diff --git a/pubspec.lock b/pubspec.lock index 4f2c35ac..e4df9f82 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -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"