Skip to content

Commit d3594ab

Browse files
committed
[MLModelDownloader] Migrate to GoogleUtilities's storage container
1 parent 16f64bf commit d3594ab

File tree

8 files changed

+64
-36
lines changed

8 files changed

+64
-36
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/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: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,11 @@
2222
@testable import FirebaseInstallations
2323
@testable import FirebaseMLModelDownloader
2424
import XCTest
25+
#if SWIFT_PACKAGE
26+
@_implementationOnly import GoogleUtilities_UserDefaults
27+
#else
28+
@_implementationOnly import GoogleUtilities
29+
#endif // SWIFT_PACKAGE
2530

2631
/// Mock options to configure default Firebase app.
2732
private enum MockOptions {
@@ -1325,19 +1330,18 @@
13251330
}
13261331
}
13271332

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

13371341
/// Returns the existing user defaults instance.
1338-
static func getUnitTestInstance(testName: String) -> UserDefaults {
1342+
static func getUnitTestInstance(testName: String) -> GULUserDefaults {
13391343
let suiteName = "com.google.firebase.ml.test.\(testName)"
1340-
return UserDefaults(suiteName: suiteName)!
1344+
return GULUserDefaults(suiteName: suiteName)
13411345
}
13421346
}
13431347

Package.swift

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

0 commit comments

Comments
 (0)