diff --git a/BrowserKit/Sources/SiteImageView/BundledTopSitesFavicons.xcassets/firefox-jp.imageset/Contents.json b/BrowserKit/Sources/SiteImageView/BundledTopSitesFavicons.xcassets/firefox-jp.imageset/Contents.json new file mode 100644 index 0000000000000..bd8763a4b8d7b --- /dev/null +++ b/BrowserKit/Sources/SiteImageView/BundledTopSitesFavicons.xcassets/firefox-jp.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "firefox-jp.png", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/BrowserKit/Sources/SiteImageView/BundledTopSitesFavicons.xcassets/firefox-jp.imageset/firefox-jp.png b/BrowserKit/Sources/SiteImageView/BundledTopSitesFavicons.xcassets/firefox-jp.imageset/firefox-jp.png new file mode 100644 index 0000000000000..eced0ef5c7f95 Binary files /dev/null and b/BrowserKit/Sources/SiteImageView/BundledTopSitesFavicons.xcassets/firefox-jp.imageset/firefox-jp.png differ diff --git a/firefox-ios/Client/FeatureFlags/NimbusFlaggableFeature.swift b/firefox-ios/Client/FeatureFlags/NimbusFlaggableFeature.swift index 695f6131e09de..4528889ba4c8c 100644 --- a/firefox-ios/Client/FeatureFlags/NimbusFlaggableFeature.swift +++ b/firefox-ios/Client/FeatureFlags/NimbusFlaggableFeature.swift @@ -19,6 +19,7 @@ enum NimbusFeatureFlagID: String, CaseIterable { case downloadLiveActivities case feltPrivacyFeltDeletion case feltPrivacySimplifiedUI + case firefoxJpGuideDefaultSite case firefoxSuggestFeature case hntSponsoredShortcuts case hntTopSitesVisualRefresh @@ -150,6 +151,7 @@ struct NimbusFlaggableFeature: HasNimbusSearchBar { .downloadLiveActivities, .feltPrivacyFeltDeletion, .feltPrivacySimplifiedUI, + .firefoxJpGuideDefaultSite, .hntTopSitesVisualRefresh, .homepageRebuild, .homepageRedesign, diff --git a/firefox-ios/Client/Nimbus/NimbusFeatureFlagLayer.swift b/firefox-ios/Client/Nimbus/NimbusFeatureFlagLayer.swift index a595febab1b39..8d864cb77bf01 100644 --- a/firefox-ios/Client/Nimbus/NimbusFeatureFlagLayer.swift +++ b/firefox-ios/Client/Nimbus/NimbusFeatureFlagLayer.swift @@ -32,6 +32,9 @@ final class NimbusFeatureFlagLayer: Sendable { case .downloadLiveActivities: return checkDownloadLiveActivitiesFeature(from: nimbus) + case .firefoxJpGuideDefaultSite: + return checkFirefoxJpGuideDefaultSiteFeature(from: nimbus) + case .firefoxSuggestFeature: return checkFirefoxSuggestFeature(from: nimbus) @@ -433,6 +436,10 @@ final class NimbusFeatureFlagLayer: Sendable { return nimbus.features.downloadLiveActivitiesFeature.value().enabled } + private func checkFirefoxJpGuideDefaultSiteFeature(from nimbus: FxNimbus) -> Bool { + return nimbus.features.firefoxJpGuideDefaultSite.value().enabled + } + private func checkFirefoxSuggestFeature(from nimbus: FxNimbus) -> Bool { let config = nimbus.features.firefoxSuggestFeature.value() diff --git a/firefox-ios/Providers/TopSitesProvider.swift b/firefox-ios/Providers/TopSitesProvider.swift index 0786173bb65ad..1f569f53d510f 100644 --- a/firefox-ios/Providers/TopSitesProvider.swift +++ b/firefox-ios/Providers/TopSitesProvider.swift @@ -38,7 +38,7 @@ extension TopSitesProvider { } // TODO: FXIOS-13706 TopSitesProviderImplementation should be concurrency safe -class TopSitesProviderImplementation: @MainActor TopSitesProvider, @unchecked Sendable { +class TopSitesProviderImplementation: @MainActor TopSitesProvider, FeatureFlaggable, @unchecked Sendable { private let pinnedSiteFetcher: PinnedSites private let placesFetcher: RustPlaces private let prefs: Prefs @@ -73,10 +73,24 @@ class TopSitesProviderImplementation: @MainActor TopSitesProvider, @unchecked Se } func defaultTopSites(_ prefs: Prefs) -> [Site] { - let suggested = DefaultSuggestedSites.defaultSites() + var suggested = DefaultSuggestedSites.defaultSites() + + if shouldExcludeFirefoxJpGuide() { + /// Assumes the Firefox Japanese Guide is the first default site in the list in the `ja_JP` locale in + /// `DefaultSuggestedSites.swift` + suggested.remove(at: 0) + } + let deleted = prefs.arrayForKey(defaultSuggestedSitesKey) as? [String] ?? [] return suggested.filter({ deleted.firstIndex(of: $0.url) == .none }) } + + private func shouldExcludeFirefoxJpGuide() -> Bool { + let isFirefoxJpGuideDefaultSiteEnabled = featureFlags.isFeatureEnabled(.firefoxJpGuideDefaultSite, + checking: .buildOnly) + let locale = Locale.current + return locale.identifier == "ja_JP" && !isFirefoxJpGuideDefaultSiteEnabled + } } // MARK: Private diff --git a/firefox-ios/Storage/DefaultSuggestedSites.swift b/firefox-ios/Storage/DefaultSuggestedSites.swift index 16a1f4c8b9422..62e16f0c85f5e 100644 --- a/firefox-ios/Storage/DefaultSuggestedSites.swift +++ b/firefox-ios/Storage/DefaultSuggestedSites.swift @@ -130,6 +130,15 @@ open class DefaultSuggestedSites { ) ], "ja_JP": [ + Site.createSuggestedSite( + url: "https://mzl.la/4nJ5E8m", + title: "Firefoxガイド", + trackingId: 804, + faviconResource: .bundleAsset( + name: "firefox-jp", + forRemoteResource: URL(string: "https://www.firefox.com/media/img/favicons/firefox/browser/apple-touch-icon.79c2abeb4e35.png")! + ) + ), Site.createSuggestedSite( url: "https://tenki.jp/", title: "tenki.jp", @@ -139,15 +148,6 @@ open class DefaultSuggestedSites { forRemoteResource: URL(string: "https://static.tenki.jp/images/icon/bookmark/tenkijp_bookmark_icon_114_114.png")! ) ), - Site.createSuggestedSite( - url: "https://ameblo.jp/", - title: "Amebaブログ", - trackingId: 801, - faviconResource: .bundleAsset( - name: "ameblo", - forRemoteResource: URL(string: "https://stat100.ameba.jp/common_style/img/sp/apple-touch-icon.png")! - ) - ), Site.createSuggestedSite( url: "https://m.yahoo.co.jp/", title: "Yahoo! JAPAN", @@ -157,6 +157,15 @@ open class DefaultSuggestedSites { forRemoteResource: URL(string: "https://s.yimg.jp/c/icon/s/bsc/2.0/y120.png")! ) ), + Site.createSuggestedSite( + url: "https://ameblo.jp/", + title: "Amebaブログ", + trackingId: 801, + faviconResource: .bundleAsset( + name: "ameblo", + forRemoteResource: URL(string: "https://stat100.ameba.jp/common_style/img/sp/apple-touch-icon.png")! + ) + ), Site.createSuggestedSite( url: "https://ja.wikipedia.org/wiki/%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8", title: "ウィキペディア", diff --git a/firefox-ios/nimbus-features/firefoxJpGuideDefaultSite.yaml b/firefox-ios/nimbus-features/firefoxJpGuideDefaultSite.yaml new file mode 100644 index 0000000000000..d0dc9742e00fb --- /dev/null +++ b/firefox-ios/nimbus-features/firefoxJpGuideDefaultSite.yaml @@ -0,0 +1,20 @@ +# The configuration for the firefoxJpGuideDefaultSite feature +features: + firefox-jp-guide-default-site: + description: > + This feature is for managing the visibility of the Firefox Japanese Guide default suggested site shortcut + variables: + enabled: + description: > + Enables the feature. + type: Boolean + default: false + + defaults: + - channel: beta + value: + enabled: false + + - channel: developer + value: + enabled: true diff --git a/firefox-ios/nimbus.fml.yaml b/firefox-ios/nimbus.fml.yaml index 4e60e52e9f128..b5f97d7a41945 100644 --- a/firefox-ios/nimbus.fml.yaml +++ b/firefox-ios/nimbus.fml.yaml @@ -29,6 +29,7 @@ include: - nimbus-features/menuRefactorFeature.yaml - nimbus-features/messagingFeature.yaml - nimbus-features/microsurveyFeature.yaml + - nimbus-features/firefoxJpGuideDefaultSite.yaml - nimbus-features/nativeErrorPageFeature.yaml - nimbus-features/newAddressBarMenu.yaml - nimbus-features/newAppearanceMenu.yaml