From d5833dfb81d9c612280592f786466513660c6de8 Mon Sep 17 00:00:00 2001 From: leminlimez Date: Mon, 23 Jun 2025 14:25:54 -0400 Subject: [PATCH] save changed images --- Pocket Poster.xcodeproj/project.pbxproj | 8 ++--- .../Controllers/CarPlayWallpaper.swift | 1 - .../Controllers/PosterBoardManager.swift | 35 ++++++++++++------- .../Views/NavigatorViews/CarPlayView.swift | 10 +++++- Pocket Poster/Views/SettingsView.swift | 1 + 5 files changed, 36 insertions(+), 19 deletions(-) diff --git a/Pocket Poster.xcodeproj/project.pbxproj b/Pocket Poster.xcodeproj/project.pbxproj index 3af708c..37ccaeb 100644 --- a/Pocket Poster.xcodeproj/project.pbxproj +++ b/Pocket Poster.xcodeproj/project.pbxproj @@ -268,7 +268,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 0; + CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_ASSET_PATHS = "\"Pocket Poster/Preview Content\""; DEVELOPMENT_TEAM = 2P4CP47H76; ENABLE_PREVIEWS = YES; @@ -285,7 +285,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 2.0; + MARKETING_VERSION = 3.0; PRODUCT_BUNDLE_IDENTIFIER = "com.lemin.Pocket-Poster"; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_EMIT_LOC_STRINGS = YES; @@ -300,7 +300,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 0; + CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_ASSET_PATHS = "\"Pocket Poster/Preview Content\""; DEVELOPMENT_TEAM = 2P4CP47H76; ENABLE_PREVIEWS = YES; @@ -317,7 +317,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 2.0; + MARKETING_VERSION = 3.0; PRODUCT_BUNDLE_IDENTIFIER = "com.lemin.Pocket-Poster"; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_EMIT_LOC_STRINGS = YES; diff --git a/Pocket Poster/Controllers/CarPlayWallpaper.swift b/Pocket Poster/Controllers/CarPlayWallpaper.swift index c1d90de..c636249 100644 --- a/Pocket Poster/Controllers/CarPlayWallpaper.swift +++ b/Pocket Poster/Controllers/CarPlayWallpaper.swift @@ -14,7 +14,6 @@ struct CarPlayWallpaper: Identifiable { var darkImage: UIImage var selectedImageDataLight: Data? var selectedImageDataDark: Data? - var changed: Bool } extension CarPlayWallpaper: Reorderable { diff --git a/Pocket Poster/Controllers/PosterBoardManager.swift b/Pocket Poster/Controllers/PosterBoardManager.swift index 2daf7d1..9752f32 100644 --- a/Pocket Poster/Controllers/PosterBoardManager.swift +++ b/Pocket Poster/Controllers/PosterBoardManager.swift @@ -278,15 +278,26 @@ class PosterBoardManager: ObservableObject { return nil } + func getCarPlayPhotosURL() -> URL { + let cppURL = SymHandler.getDocumentsDirectory().appendingPathComponent("CarPlayPhotos", conformingTo: .directory) + // create it if it doesn't exist + if !FileManager.default.fileExists(atPath: cppURL.path()) { + try? FileManager.default.createDirectory(at: cppURL, withIntermediateDirectories: true) + } + return cppURL + } + func applyCarPlay(appHash: String, wallpapers: [CarPlayWallpaper]) throws { // write the image var toRemove: [URL] = [] var activeWP: [String] = UserDefaults.standard.array(forKey: "ActiveCarPlayWallpapers") as? [String] ?? [] + let cppURL = getCarPlayPhotosURL() let cacheVer = getCarPlayCacheVersion() for wallpaper in wallpapers { if let data = wallpaper.selectedImageDataLight, let img = UIImage(data: data) { let imgURL = SymHandler.getDocumentsDirectory().appendingPathComponent("CAR\(wallpaper.name)Dynamic-Light\(cacheVer).cpbitmap") img.writeToCPBitmapFile(to: imgURL.path() as NSString) + try? data.write(to: cppURL.appendingPathComponent("\(wallpaper.name)-Light")) toRemove.append(imgURL) if !activeWP.contains(wallpaper.name) { activeWP.append(wallpaper.name) @@ -295,6 +306,7 @@ class PosterBoardManager: ObservableObject { if let data = wallpaper.selectedImageDataDark, let img = UIImage(data: data) { let imgURL = SymHandler.getDocumentsDirectory().appendingPathComponent("CAR\(wallpaper.name)Dynamic-Dark\(cacheVer).cpbitmap") img.writeToCPBitmapFile(to: imgURL.path() as NSString) + try? data.write(to: cppURL.appendingPathComponent("\(wallpaper.name)-Dark")) toRemove.append(imgURL) if !activeWP.contains(wallpaper.name) { activeWP.append(wallpaper.name) @@ -303,28 +315,25 @@ class PosterBoardManager: ObservableObject { } // symlink and apply -// let _ = try SymHandler.createAppSymlink(for: "\(appHash)/Library/Caches/MappedImageCache/com.apple.CarPlayApp.wallpaper-images") -// defer { -// SymHandler.cleanup() -// } -// for imgURL in toRemove { -// try FileManager.default.trashItem(at: imgURL, resultingItemURL: nil) -// } -// UserDefaults.standard.set(activeWP, forKey: "ActiveCarPlayWallpapers") -// let test = SymHandler.getDocumentsDirectory().appendingPathComponent("Caches") -// try Data(count: 0).write(to: test) - let hmm = try SymHandler.createAppSymlink(for: "\(appHash)/Library") + let _ = try SymHandler.createAppSymlink(for: "\(appHash)/Library/Caches/MappedImageCache/com.apple.CarPlayApp.wallpaper-images") defer { SymHandler.cleanup() } - try FileManager.default.removeItem(at: hmm.appendingPathComponent("Caches")) + for imgURL in toRemove { + try FileManager.default.trashItem(at: imgURL, resultingItemURL: nil) + } + UserDefaults.standard.set(activeWP, forKey: "ActiveCarPlayWallpapers") + let test = SymHandler.getDocumentsDirectory().appendingPathComponent("Caches") + try Data(count: 0).write(to: test) } static func clearCache() throws { SymHandler.cleanup() let docDir = SymHandler.getDocumentsDirectory() for file in try FileManager.default.contentsOfDirectory(at: docDir, includingPropertiesForKeys: nil) { - try FileManager.default.removeItem(at: file) + if file.lastPathComponent != "CarPlayPhotos" { + try FileManager.default.removeItem(at: file) + } } } } diff --git a/Pocket Poster/Views/NavigatorViews/CarPlayView.swift b/Pocket Poster/Views/NavigatorViews/CarPlayView.swift index 16b2d51..952a97f 100644 --- a/Pocket Poster/Views/NavigatorViews/CarPlayView.swift +++ b/Pocket Poster/Views/NavigatorViews/CarPlayView.swift @@ -103,6 +103,7 @@ struct CarPlayView: View { // load active wallpapers from user defaults activeWallpapers = UserDefaults.standard.array(forKey: "ActiveCarPlayWallpapers") as? [String] ?? [] // load the wallpapers + let cppURL = PosterBoardManager.shared.getCarPlayPhotosURL() let frameworkPath = "/System/Library/PrivateFrameworks/CarPlayUIServices.framework" do { for file in try FileManager.default.contentsOfDirectory(at: URL(fileURLWithPath: frameworkPath), includingPropertiesForKeys: nil, options: .skipsHiddenFiles) { @@ -114,7 +115,14 @@ struct CarPlayView: View { darkImg = UIImage(data: darkData) ?? wpImg } let name = file.lastPathComponent.replacingOccurrences(of: "-Light.heic", with: "") - wallpapers.append(.init(name: name, lightImage: wpImg, darkImage: darkImg, changed: false)) + // fetch the selected image if they exist + let selectedLight: Data? = try? Data(contentsOf: cppURL.appendingPathComponent("\(name)-Light")) + let selectedDark: Data? = try? Data(contentsOf: cppURL.appendingPathComponent("\(name)-Dark")) + wallpapers.append(.init( + name: name, + lightImage: wpImg, darkImage: darkImg, + selectedImageDataLight: selectedLight, selectedImageDataDark: selectedDark + )) } } } diff --git a/Pocket Poster/Views/SettingsView.swift b/Pocket Poster/Views/SettingsView.swift index 66ccce4..fd6e9ea 100644 --- a/Pocket Poster/Views/SettingsView.swift +++ b/Pocket Poster/Views/SettingsView.swift @@ -84,6 +84,7 @@ struct SettingsView: View { Button(action: { UIImpactFeedbackGenerator(style: .soft).impactOccurred() UserDefaults.standard.set(nil, forKey: "ActiveCarPlayWallpapers") + try? FileManager.default.removeItem(at: PosterBoardManager.shared.getCarPlayPhotosURL()) Haptic.shared.notify(.success) UIApplication.shared.alert(title: NSLocalizedString("CarPlay Applied Wallpapers Successfully Cleared!", comment: ""), body: "") }) {