Skip to content

Commit 5fd1eb2

Browse files
authored
[MLModelDownloader] Migrate to GoogleUtilities's storage container (#12762)
1 parent a58216a commit 5fd1eb2

9 files changed

+67
-38
lines changed

FirebaseMLModelDownloader.podspec

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,8 @@ Pod::Spec.new do |s|
4040
s.dependency 'FirebaseInstallations', '~> 10.0'
4141
s.dependency 'GoogleDataTransport', '~> 9.2'
4242
# TODO: Revisit this dependency
43-
s.dependency 'GoogleUtilities/Logger', '~> 7.8'
43+
s.dependency 'GoogleUtilities/Logger', '~> 7.13'
44+
s.dependency 'GoogleUtilities/UserDefaults', '~> 7.13'
4445
s.dependency 'SwiftProtobuf', '~> 1.19'
4546

4647
s.pod_target_xcconfig = {

FirebaseMLModelDownloader/Sources/DeviceLogger.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,9 @@
1414

1515
import Foundation
1616
#if SWIFT_PACKAGE
17-
import GoogleUtilities_Logger
17+
@_implementationOnly import GoogleUtilities_Logger
1818
#else
19-
import GoogleUtilities
19+
@_implementationOnly import GoogleUtilities
2020
#endif
2121

2222
/// Enum of log messages.

FirebaseMLModelDownloader/Sources/DownloaderUserDefaults.swift

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,14 @@
1313
// limitations under the License.
1414

1515
import Foundation
16+
#if SWIFT_PACKAGE
17+
@_implementationOnly import GoogleUtilities_UserDefaults
18+
#else
19+
@_implementationOnly import GoogleUtilities
20+
#endif // SWIFT_PACKAGE
1621

1722
/// Protocol to save or delete model info in user defaults.
1823
protocol DownloaderUserDefaultsWriteable {
19-
func writeToDefaults(_ defaults: UserDefaults, appName: String)
20-
func removeFromDefaults(_ defaults: UserDefaults, appName: String)
24+
func writeToDefaults(_ defaults: GULUserDefaults, appName: String)
25+
func removeFromDefaults(_ defaults: GULUserDefaults, appName: String)
2126
}

FirebaseMLModelDownloader/Sources/LocalModelInfo.swift

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,11 @@
1313
// limitations under the License.
1414

1515
import Foundation
16+
#if SWIFT_PACKAGE
17+
@_implementationOnly import GoogleUtilities_UserDefaults
18+
#else
19+
@_implementationOnly import GoogleUtilities
20+
#endif // SWIFT_PACKAGE
1621

1722
/// Model info object with details about downloaded and locally available model.
1823
class LocalModelInfo {
@@ -41,7 +46,7 @@ class LocalModelInfo {
4146
}
4247

4348
/// Convenience init to create local model info from stored info in user defaults.
44-
convenience init?(fromDefaults defaults: UserDefaults, name: String, appName: String) {
49+
convenience init?(fromDefaults defaults: GULUserDefaults, name: String, appName: String) {
4550
let defaultsPrefix = LocalModelInfo.getUserDefaultsKeyPrefix(appName: appName, modelName: name)
4651
guard let modelHash = defaults.string(forKey: "\(defaultsPrefix).model-hash") else {
4752
return nil
@@ -60,26 +65,22 @@ extension LocalModelInfo: DownloaderUserDefaultsWriteable {
6065
}
6166

6267
/// Write local model info to user defaults.
63-
func writeToDefaults(_ defaults: UserDefaults, appName: String) {
68+
func writeToDefaults(_ defaults: GULUserDefaults, appName: String) {
6469
let defaultsPrefix = LocalModelInfo.getUserDefaultsKeyPrefix(appName: appName, modelName: name)
65-
defaults.setValue(modelHash, forKey: "\(defaultsPrefix).model-hash")
66-
defaults.setValue(size, forKey: "\(defaultsPrefix).model-size")
70+
defaults.setObject(modelHash, forKey: "\(defaultsPrefix).model-hash")
71+
defaults.setObject(size, forKey: "\(defaultsPrefix).model-size")
6772
}
6873

69-
func removeFromDefaults(_ defaults: UserDefaults, appName: String) {
74+
func removeFromDefaults(_ defaults: GULUserDefaults, appName: String) {
7075
let defaultsPrefix = LocalModelInfo.getUserDefaultsKeyPrefix(appName: appName, modelName: name)
7176
defaults.removeObject(forKey: "\(defaultsPrefix).model-hash")
7277
defaults.removeObject(forKey: "\(defaultsPrefix).model-size")
7378
}
7479
}
7580

7681
/// Named user defaults for FirebaseML.
77-
extension UserDefaults {
78-
static var firebaseMLDefaults: UserDefaults {
79-
let suiteName = "com.google.firebase.ml"
80-
guard let defaults = UserDefaults(suiteName: suiteName) else {
81-
return UserDefaults.standard
82-
}
83-
return defaults
82+
extension GULUserDefaults {
83+
static var firebaseMLDefaults: GULUserDefaults {
84+
return GULUserDefaults(suiteName: "com.google.firebase.ml")
8485
}
8586
}

FirebaseMLModelDownloader/Sources/ModelDownloadTask.swift

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,11 @@
1313
// limitations under the License.
1414

1515
import Foundation
16+
#if SWIFT_PACKAGE
17+
@_implementationOnly import GoogleUtilities_UserDefaults
18+
#else
19+
@_implementationOnly import GoogleUtilities
20+
#endif // SWIFT_PACKAGE
1621

1722
/// Task to download model file to device.
1823
class ModelDownloadTask {
@@ -23,7 +28,7 @@ class ModelDownloadTask {
2328
private(set) var remoteModelInfo: RemoteModelInfo
2429

2530
/// User defaults to which local model info should ultimately be written.
26-
private let defaults: UserDefaults
31+
private let defaults: GULUserDefaults
2732

2833
/// Keeps track of download associated with this model download task.
2934
private(set) var downloadStatus: ModelDownloadStatus = .ready
@@ -44,7 +49,7 @@ class ModelDownloadTask {
4449

4550
init(remoteModelInfo: RemoteModelInfo,
4651
appName: String,
47-
defaults: UserDefaults,
52+
defaults: GULUserDefaults,
4853
downloader: FileDownloader,
4954
progressHandler: ProgressHandler? = nil,
5055
completion: @escaping Completion,

FirebaseMLModelDownloader/Sources/ModelDownloader.swift

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,11 @@
1515
import FirebaseCore
1616
import FirebaseInstallations
1717
import Foundation
18+
#if SWIFT_PACKAGE
19+
@_implementationOnly import GoogleUtilities_UserDefaults
20+
#else
21+
@_implementationOnly import GoogleUtilities
22+
#endif // SWIFT_PACKAGE
1823

1924
/// Possible ways to get a custom model.
2025
public enum ModelDownloadType {
@@ -41,7 +46,7 @@ public class ModelDownloader {
4146
private let installations: Installations
4247

4348
/// User defaults for model info.
44-
private let userDefaults: UserDefaults
49+
private let userDefaults: GULUserDefaults
4550

4651
/// Telemetry logger tied to this instance of model downloader.
4752
let telemetryLogger: TelemetryLogger?
@@ -67,7 +72,7 @@ public class ModelDownloader {
6772
}
6873

6974
/// Private init for model downloader.
70-
private init(app: FirebaseApp, defaults: UserDefaults = .firebaseMLDefaults) {
75+
private init(app: FirebaseApp, defaults: GULUserDefaults = .firebaseMLDefaults) {
7176
appName = app.name
7277
options = app.options
7378
installations = Installations.installations(app: app)
@@ -641,7 +646,7 @@ extension ModelDownloader {
641646
/// Model downloader extension for testing.
642647
extension ModelDownloader {
643648
/// Model downloader instance for testing.
644-
static func modelDownloaderWithDefaults(_ defaults: UserDefaults,
649+
static func modelDownloaderWithDefaults(_ defaults: GULUserDefaults,
645650
app: FirebaseApp) -> ModelDownloader {
646651
let downloader = ModelDownloader(app: app, defaults: defaults)
647652
return downloader

FirebaseMLModelDownloader/Tests/Integration/ModelDownloaderIntegrationTests.swift

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -22,20 +22,26 @@
2222
@testable import FirebaseInstallations
2323
@testable import FirebaseMLModelDownloader
2424
import XCTest
25-
26-
extension UserDefaults {
27-
/// Returns a new cleared instance of user defaults.
28-
static func createTestInstance(testName: String) -> UserDefaults {
25+
#if SWIFT_PACKAGE
26+
@_implementationOnly import GoogleUtilities_UserDefaults
27+
#else
28+
@_implementationOnly import GoogleUtilities
29+
#endif // SWIFT_PACKAGE
30+
31+
extension GULUserDefaults {
32+
/// Returns an instance of user defaults.
33+
static func createTestInstance(testName: String) -> GULUserDefaults {
2934
let suiteName = "com.google.firebase.ml.test.\(testName)"
30-
let defaults = UserDefaults(suiteName: suiteName)!
31-
defaults.removePersistentDomain(forName: suiteName)
32-
return defaults
35+
// Clear the suite (`UserDefaults` and `GULUserDefaults` map to the same
36+
// storage space and `GULUserDefaults` doesn't offer API to do this.)
37+
UserDefaults(suiteName: suiteName)!.removePersistentDomain(forName: suiteName)
38+
return GULUserDefaults(suiteName: suiteName)
3339
}
3440

3541
/// Returns the existing user defaults instance.
36-
static func getTestInstance(testName: String) -> UserDefaults {
42+
static func getTestInstance(testName: String) -> GULUserDefaults {
3743
let suiteName = "com.google.firebase.ml.test.\(testName)"
38-
return UserDefaults(suiteName: suiteName)!
44+
return GULUserDefaults(suiteName: suiteName)
3945
}
4046
}
4147

FirebaseMLModelDownloader/Tests/Unit/ModelDownloaderUnitTests.swift

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,12 @@
2222
@testable import FirebaseInstallations
2323
@testable import FirebaseMLModelDownloader
2424
import XCTest
25+
#if SWIFT_PACKAGE
26+
@_implementationOnly import GoogleUtilities_Logger
27+
@_implementationOnly import GoogleUtilities_UserDefaults
28+
#else
29+
@_implementationOnly import GoogleUtilities
30+
#endif // SWIFT_PACKAGE
2531

2632
/// Mock options to configure default Firebase app.
2733
private enum MockOptions {
@@ -1325,19 +1331,18 @@
13251331
}
13261332
}
13271333

1328-
extension UserDefaults {
1329-
/// Returns a new cleared instance of user defaults.
1330-
static func createUnitTestInstance(testName: String) -> UserDefaults {
1334+
extension GULUserDefaults {
1335+
/// Returns a new instance of user defaults.
1336+
static func createUnitTestInstance(testName: String) -> GULUserDefaults {
13311337
let suiteName = "com.google.firebase.ml.test.\(testName)"
1332-
let defaults = UserDefaults(suiteName: suiteName)!
1333-
defaults.removePersistentDomain(forName: suiteName)
1338+
let defaults = GULUserDefaults(suiteName: suiteName)
13341339
return defaults
13351340
}
13361341

13371342
/// Returns the existing user defaults instance.
1338-
static func getUnitTestInstance(testName: String) -> UserDefaults {
1343+
static func getUnitTestInstance(testName: String) -> GULUserDefaults {
13391344
let suiteName = "com.google.firebase.ml.test.\(testName)"
1340-
return UserDefaults(suiteName: suiteName)!
1345+
return GULUserDefaults(suiteName: suiteName)
13411346
}
13421347
}
13431348

Package.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -839,6 +839,7 @@ let package = Package(
839839
"FirebaseInstallations",
840840
.product(name: "GoogleDataTransport", package: "GoogleDataTransport"),
841841
.product(name: "GULLogger", package: "GoogleUtilities"),
842+
.product(name: "GULUserDefaults", package: "GoogleUtilities"),
842843
.product(name: "SwiftProtobuf", package: "swift-protobuf"),
843844
],
844845
path: "FirebaseMLModelDownloader/Sources",

0 commit comments

Comments
 (0)