diff --git a/android/Omnivore/app/build.gradle b/android/Omnivore/app/build.gradle index e525d3c63..1041a5ec9 100644 --- a/android/Omnivore/app/build.gradle +++ b/android/Omnivore/app/build.gradle @@ -17,8 +17,8 @@ android { applicationId "app.omnivore.omnivore" minSdk 26 targetSdk 33 - versionCode 110 - versionName "0.0.110" + versionCode 118 + versionName "0.0.118" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" vectorDrawables { diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/networking/SavedItemLabelMutations.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/networking/SavedItemLabelMutations.kt index e7120536f..e4dd3561f 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/networking/SavedItemLabelMutations.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/networking/SavedItemLabelMutations.kt @@ -5,12 +5,12 @@ import app.omnivore.omnivore.graphql.generated.SetLabelsMutation import app.omnivore.omnivore.graphql.generated.type.CreateLabelInput import app.omnivore.omnivore.graphql.generated.type.SetLabelsInput -suspend fun Networker.updateLabelsForSavedItem(input: SetLabelsInput): Boolean { +suspend fun Networker.updateLabelsForSavedItem(input: SetLabelsInput): List? { return try { val result = authenticatedApolloClient().mutation(SetLabelsMutation(input)).execute() - return result.data?.setLabels?.onSetLabelsSuccess?.labels != null + return result.data?.setLabels?.onSetLabelsSuccess?.labels } catch (e: java.lang.Exception) { - false + return null } } diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/components/LabelsViewModel.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/components/LabelsViewModel.kt index ddcdaf07b..c9dab6773 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/components/LabelsViewModel.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/components/LabelsViewModel.kt @@ -56,21 +56,6 @@ class LabelsViewModel @Inject constructor( serverSyncStatus = ServerSyncStatus.NEEDS_CREATION.rawValue ) - viewModelScope.launch { - withContext(Dispatchers.IO) { - dataService.db.savedItemLabelDao().insertAll(listOf(res)) - - val newLabel = networker.createNewLabel(CreateLabelInput(color = presentIfNotNull(res.color), name = res.name)) - if (newLabel != null) { - try { - dataService.db.savedItemLabelDao().updateTempLabel(tempId, newLabel.id) - } catch (e: Exception) { - Log.d("EXCEPTION: ", e.toString()) - } - } - } - } - return res } } diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/library/LibraryViewModel.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/library/LibraryViewModel.kt index 632b32950..86dfab019 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/library/LibraryViewModel.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/library/LibraryViewModel.kt @@ -304,55 +304,44 @@ class LibraryViewModel @Inject constructor( fun updateSavedItemLabels(savedItemID: String, labels: List) { viewModelScope.launch { withContext(Dispatchers.IO) { - val syncedLabels = labels.filter { it.serverSyncStatus == ServerSyncStatus.IS_SYNCED.rawValue } - val unsyncedLabels = labels.filter { it.serverSyncStatus != ServerSyncStatus.IS_SYNCED.rawValue } + val input = SetLabelsInput( + pageId = savedItemID, + labels = Optional.presentIfNotNull(labels.map { CreateLabelInput(color = Optional.presentIfNotNull(it.color), name = it.name) }), + ) - var labelCreationError = false - val createdLabels = unsyncedLabels.mapNotNull { label -> - val result = networker.createNewLabel(CreateLabelInput( - name = label.name, - color = presentIfNotNull(label.color), - description = presentIfNotNull(label.labelDescription), - )) - result?.let { + val updatedLabels = networker.updateLabelsForSavedItem(input) + + // Figure out which of the labels are new + updatedLabels?.let { updatedLabels -> + val existingNamedLabels = dataService.db.savedItemLabelDao() + .namedLabels(updatedLabels.map { it.labelFields.name }) + val existingNames = existingNamedLabels.map { it.name } + val newNamedLabels = updatedLabels.filter { !existingNames.contains(it.labelFields.name) } + + dataService.db.savedItemLabelDao().insertAll(newNamedLabels.map { SavedItemLabel( - savedItemLabelId = result.id, - name = result.name, - color = result.color, - createdAt = result.createdAt.toString(), - labelDescription = result.description, - serverSyncStatus = ServerSyncStatus.IS_SYNCED.rawValue + savedItemLabelId = it.labelFields.id, + name = it.labelFields.name, + color = it.labelFields.color, + createdAt = null, + labelDescription = null + ) + }) + + val allNamedLabels = dataService.db.savedItemLabelDao() + .namedLabels(updatedLabels.map { it.labelFields.name }) + val crossRefs = allNamedLabels.map { + SavedItemAndSavedItemLabelCrossRef( + savedItemLabelId = it.savedItemLabelId, + savedItemId = savedItemID ) - } ?: run { - labelCreationError = true - null } - } + dataService.db.savedItemAndSavedItemLabelCrossRefDao().deleteRefsBySavedItemId(savedItemID) + dataService.db.savedItemAndSavedItemLabelCrossRefDao().insertAll(crossRefs) - dataService.db.savedItemLabelDao().insertAll(createdLabels) - - val allLabels = syncedLabels + createdLabels - - val input = SetLabelsInput(labelIds = Optional.presentIfNotNull(allLabels.map { it.savedItemLabelId }), pageId = savedItemID) - val networkResult = networker.updateLabelsForSavedItem(input) - - val crossRefs = allLabels.map { - SavedItemAndSavedItemLabelCrossRef( - savedItemLabelId = it.savedItemLabelId, - savedItemId = savedItemID - ) - } - - // Remove all labels first - dataService.db.savedItemAndSavedItemLabelCrossRefDao().deleteRefsBySavedItemId(savedItemID) - - // Add back the current labels - dataService.db.savedItemAndSavedItemLabelCrossRefDao().insertAll(crossRefs) - - if (!networkResult || labelCreationError) { - snackbarMessage = resourceProvider.getString(R.string.library_view_model_snackbar_error) - } else { snackbarMessage = resourceProvider.getString(R.string.library_view_model_snackbar_success) + } ?: run { + snackbarMessage = resourceProvider.getString(R.string.library_view_model_snackbar_error) } CoroutineScope(Dispatchers.Main).launch { diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/savedItemViews/SavedItemCard.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/savedItemViews/SavedItemCard.kt index 654fcd22c..be0de7ba5 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/savedItemViews/SavedItemCard.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/savedItemViews/SavedItemCard.kt @@ -20,16 +20,20 @@ import androidx.compose.ui.focus.onFocusChanged import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.colorResource +import androidx.compose.ui.res.painterResource import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.intl.Locale import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.text.toLowerCase +import androidx.compose.ui.text.toUpperCase import androidx.compose.ui.unit.* import app.omnivore.omnivore.R +import app.omnivore.omnivore.persistence.entities.SavedItemLabel import app.omnivore.omnivore.persistence.entities.SavedItemWithLabelsAndHighlights import app.omnivore.omnivore.ui.components.LabelChipColors import app.omnivore.omnivore.ui.library.SavedItemAction +import app.omnivore.omnivore.ui.library.SavedItemFilter import app.omnivore.omnivore.ui.library.SavedItemViewModel import coil.compose.rememberAsyncImagePainter @@ -45,14 +49,14 @@ fun SavedItemCard( Column( modifier = Modifier - .combinedClickable( - onClick = onClickHandler, - onLongClick = { - savedItemViewModel.actionsMenuItemLiveData.postValue(savedItem) - } - ) - .background(if (selected) MaterialTheme.colorScheme.surfaceVariant else MaterialTheme.colorScheme.background) - .fillMaxWidth() + .combinedClickable( + onClick = onClickHandler, + onLongClick = { + savedItemViewModel.actionsMenuItemLiveData.postValue(savedItem) + } + ) + .background(if (selected) MaterialTheme.colorScheme.surfaceVariant else MaterialTheme.colorScheme.background) + .fillMaxWidth() ) { Row( horizontalArrangement = Arrangement.SpaceBetween, @@ -108,8 +112,10 @@ fun SavedItemCard( ) } - FlowRow(modifier = Modifier.fillMaxWidth().padding(10.dp)) { - savedItem.labels.sortedWith(compareBy { it.name.toLowerCase(Locale.current) }).forEach { label -> + FlowRow(modifier = Modifier + .fillMaxWidth() + .padding(10.dp)) { + savedItem.labels.filter { !isFlairLabel(it) }.sortedWith(compareBy { it.name.toLowerCase(Locale.current) }).forEach { label -> val chipColors = LabelChipColors.fromHex(label.color) LabelChip( @@ -196,6 +202,82 @@ fun readingProgress(item: SavedItemWithLabelsAndHighlights): String { // return "" //} + +public enum class FlairIcon( + public val rawValue: String, + public val sortOrder: Int +) { + FEED("feed", 0), + RSS("rss", 0), + FAVORITE("favorite", 1), + NEWSLETTER("newsletter", 2), + RECOMMENDED("recommended", 3), + PINNED("pinned", 4) +} + +val FLAIR_ICON_NAMES = listOf("feed", "rss", "favorite", "newsletter", "recommended", "pinned") + +fun isFlairLabel(label: SavedItemLabel): Boolean { + return FLAIR_ICON_NAMES.contains(label.name.toLowerCase(Locale.current)) +} + +@Composable +fun flairIcons(item: SavedItemWithLabelsAndHighlights) { + val labels = item.labels.filter { isFlairLabel(it) }.map { + FlairIcon.valueOf(it.name.toUpperCase(Locale.current)) + } + labels.forEach { + when (it) { + FlairIcon.RSS, + FlairIcon.FEED -> { + Image( + painter = painterResource(id = R.drawable.flair_feed), + contentDescription = "Feed flair Icon", + modifier = Modifier + .padding(end = 5.0.dp) + ) + } + + FlairIcon.FAVORITE -> { + Image( + painter = painterResource(id = R.drawable.flaire_favorite), + contentDescription = "Favorite flair Icon", + modifier = Modifier + .padding(end = 5.0.dp) + ) + } + + FlairIcon.NEWSLETTER -> { + Image( + painter = painterResource(id = R.drawable.flair_newsletter), + contentDescription = "Newsletter flair Icon", + modifier = Modifier + .padding(end = 5.0.dp) + ) + } + + FlairIcon.RECOMMENDED -> { + Image( + painter = painterResource(id = R.drawable.flair_recommended), + contentDescription = "Recommended flair Icon", + modifier = Modifier + .padding(end = 5.0.dp) + ) + } + + FlairIcon.PINNED -> { + Image( + painter = painterResource(id = R.drawable.flair_pinned), + contentDescription = "Pinned flair Icon", + modifier = Modifier + .padding(end = 5.0.dp) + ) + } + + } + } +} + @Composable fun readInfo(item: SavedItemWithLabelsAndHighlights) { Row( @@ -203,6 +285,9 @@ fun readInfo(item: SavedItemWithLabelsAndHighlights) { .fillMaxWidth() .defaultMinSize(minHeight = 15.dp) ) { + // Show flair here + flairIcons(item) + Text( text = estimatedReadingTime(item), style = TextStyle( diff --git a/android/Omnivore/app/src/main/res/drawable/flair_feed.xml b/android/Omnivore/app/src/main/res/drawable/flair_feed.xml new file mode 100644 index 000000000..aca102b59 --- /dev/null +++ b/android/Omnivore/app/src/main/res/drawable/flair_feed.xml @@ -0,0 +1,31 @@ + + + + + + + + diff --git a/android/Omnivore/app/src/main/res/drawable/flair_newsletter.xml b/android/Omnivore/app/src/main/res/drawable/flair_newsletter.xml new file mode 100644 index 000000000..5c70af531 --- /dev/null +++ b/android/Omnivore/app/src/main/res/drawable/flair_newsletter.xml @@ -0,0 +1,16 @@ + + + + + + + diff --git a/android/Omnivore/app/src/main/res/drawable/flair_pinned.xml b/android/Omnivore/app/src/main/res/drawable/flair_pinned.xml new file mode 100644 index 000000000..25b42df77 --- /dev/null +++ b/android/Omnivore/app/src/main/res/drawable/flair_pinned.xml @@ -0,0 +1,13 @@ + + + + + + diff --git a/android/Omnivore/app/src/main/res/drawable/flair_recommended.xml b/android/Omnivore/app/src/main/res/drawable/flair_recommended.xml new file mode 100644 index 000000000..88a5ea8d3 --- /dev/null +++ b/android/Omnivore/app/src/main/res/drawable/flair_recommended.xml @@ -0,0 +1,16 @@ + + + + + + + diff --git a/android/Omnivore/app/src/main/res/drawable/flaire_favorite.xml b/android/Omnivore/app/src/main/res/drawable/flaire_favorite.xml new file mode 100644 index 000000000..820704635 --- /dev/null +++ b/android/Omnivore/app/src/main/res/drawable/flaire_favorite.xml @@ -0,0 +1,13 @@ + + + + + + diff --git a/apple/Omnivore.xcodeproj/project.pbxproj b/apple/Omnivore.xcodeproj/project.pbxproj index 32ee2a7a5..805222b68 100644 --- a/apple/Omnivore.xcodeproj/project.pbxproj +++ b/apple/Omnivore.xcodeproj/project.pbxproj @@ -1400,7 +1400,7 @@ "@executable_path/../Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 12.0; - MARKETING_VERSION = 1.34.0; + MARKETING_VERSION = 1.35.0; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = app.omnivore.app; @@ -1435,7 +1435,7 @@ "@executable_path/../Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 12.0; - MARKETING_VERSION = 1.34.0; + MARKETING_VERSION = 1.35.0; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = app.omnivore.app; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -1490,7 +1490,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.34.0; + MARKETING_VERSION = 1.35.0; PRODUCT_BUNDLE_IDENTIFIER = app.omnivore.app; PRODUCT_NAME = Omnivore; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -1831,7 +1831,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.34.0; + MARKETING_VERSION = 1.35.0; PRODUCT_BUNDLE_IDENTIFIER = app.omnivore.app; PRODUCT_NAME = Omnivore; PROVISIONING_PROFILE_SPECIFIER = ""; diff --git a/apple/OmnivoreKit/Sources/Views/FeedItem/LibraryItemCard.swift b/apple/OmnivoreKit/Sources/Views/FeedItem/LibraryItemCard.swift index fff8f9b71..83350cd70 100644 --- a/apple/OmnivoreKit/Sources/Views/FeedItem/LibraryItemCard.swift +++ b/apple/OmnivoreKit/Sources/Views/FeedItem/LibraryItemCard.swift @@ -2,6 +2,35 @@ import Models import SwiftUI import Utils +enum FlairLabels: String { + case pinned + case favorite + case recommended + case newsletter + case rss + case feed + + var icon: Image { + switch self { + case .pinned: return Image.flairPinned + case .favorite: return Image.flairFavorite + case .recommended: return Image.flairRecommended + case .newsletter: return Image.flairNewsletter + case .feed, .rss: return Image.flairFeed + } + } + + var sortOrder: Int { + switch self { + case .feed, .rss: return 0 + case .favorite: return 1 + case .newsletter: return 2 + case .recommended: return 3 + case .pinned: return 4 + } + } +} + public extension View { func draggableItem(item: LinkedItem) -> some View { #if os(iOS) @@ -124,8 +153,30 @@ public struct LibraryItemCard: View { return "" } + var flairLabels: [FlairLabels] { + item.sortedLabels.compactMap { label in + if let name = label.name { + return FlairLabels(rawValue: name.lowercased()) + } + return nil + }.sorted { $0.sortOrder < $1.sortOrder } + } + + var nonFlairLabels: [LinkedItemLabel] { + item.sortedLabels.filter { label in + if let name = label.name, FlairLabels(rawValue: name.lowercased()) != nil { + return false + } + return true + } + } + var readInfo: some View { - AnyView(HStack { + HStack(alignment: .center, spacing: 5.0) { + ForEach(flairLabels, id: \.self) { + $0.icon + } + let fgcolor = Color.isDarkMode ? Color.themeDarkWhiteGray : Color.themeMiddleGray Text("\(estimatedReadingTime)") .font(.caption2).fontWeight(.medium) @@ -146,7 +197,7 @@ public struct LibraryItemCard: View { .font(.caption2).fontWeight(.medium) .foregroundColor(fgcolor) } - .frame(maxWidth: .infinity, alignment: .leading)) + .frame(maxWidth: .infinity, alignment: .leading) } var imageBox: some View { @@ -227,6 +278,6 @@ public struct LibraryItemCard: View { } var labels: some View { - LabelsFlowLayout(labels: item.sortedLabels) + LabelsFlowLayout(labels: nonFlairLabels) } } diff --git a/apple/OmnivoreKit/Sources/Views/Images/Images.swift b/apple/OmnivoreKit/Sources/Views/Images/Images.swift index d32ef814d..ce00165cb 100644 --- a/apple/OmnivoreKit/Sources/Views/Images/Images.swift +++ b/apple/OmnivoreKit/Sources/Views/Images/Images.swift @@ -28,4 +28,11 @@ public extension Image { static var unarchive: Image { Image("unarchive", bundle: .module) } static var remove: Image { Image("remove", bundle: .module) } static var label: Image { Image("label", bundle: .module) } + + static var flairFeed: Image { Image("flair-feed", bundle: .module) } + static var flairFavorite: Image { Image("flair-favorite", bundle: .module) } + + static var flairNewsletter: Image { Image("flair-newsletter", bundle: .module) } + static var flairPinned: Image { Image("flair-pinned", bundle: .module) } + static var flairRecommended: Image { Image("flair-recommended", bundle: .module) } } diff --git a/apple/OmnivoreKit/Sources/Views/Images/Images.xcassets/flair-favorite.imageset/Contents.json b/apple/OmnivoreKit/Sources/Views/Images/Images.xcassets/flair-favorite.imageset/Contents.json new file mode 100644 index 000000000..6738e3537 --- /dev/null +++ b/apple/OmnivoreKit/Sources/Views/Images/Images.xcassets/flair-favorite.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "Frame-2.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Frame-2 1.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Frame-2 2.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/apple/OmnivoreKit/Sources/Views/Images/Images.xcassets/flair-favorite.imageset/Frame-2 1.png b/apple/OmnivoreKit/Sources/Views/Images/Images.xcassets/flair-favorite.imageset/Frame-2 1.png new file mode 100644 index 000000000..84b84ba31 Binary files /dev/null and b/apple/OmnivoreKit/Sources/Views/Images/Images.xcassets/flair-favorite.imageset/Frame-2 1.png differ diff --git a/apple/OmnivoreKit/Sources/Views/Images/Images.xcassets/flair-favorite.imageset/Frame-2 2.png b/apple/OmnivoreKit/Sources/Views/Images/Images.xcassets/flair-favorite.imageset/Frame-2 2.png new file mode 100644 index 000000000..049bd5920 Binary files /dev/null and b/apple/OmnivoreKit/Sources/Views/Images/Images.xcassets/flair-favorite.imageset/Frame-2 2.png differ diff --git a/apple/OmnivoreKit/Sources/Views/Images/Images.xcassets/flair-favorite.imageset/Frame-2.png b/apple/OmnivoreKit/Sources/Views/Images/Images.xcassets/flair-favorite.imageset/Frame-2.png new file mode 100644 index 000000000..5e93251c3 Binary files /dev/null and b/apple/OmnivoreKit/Sources/Views/Images/Images.xcassets/flair-favorite.imageset/Frame-2.png differ diff --git a/apple/OmnivoreKit/Sources/Views/Images/Images.xcassets/flair-feed.imageset/Contents.json b/apple/OmnivoreKit/Sources/Views/Images/Images.xcassets/flair-feed.imageset/Contents.json new file mode 100644 index 000000000..04677ea52 --- /dev/null +++ b/apple/OmnivoreKit/Sources/Views/Images/Images.xcassets/flair-feed.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "Frame.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Frame 1.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Frame 2.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/apple/OmnivoreKit/Sources/Views/Images/Images.xcassets/flair-feed.imageset/Frame 1.png b/apple/OmnivoreKit/Sources/Views/Images/Images.xcassets/flair-feed.imageset/Frame 1.png new file mode 100644 index 000000000..5eae617d5 Binary files /dev/null and b/apple/OmnivoreKit/Sources/Views/Images/Images.xcassets/flair-feed.imageset/Frame 1.png differ diff --git a/apple/OmnivoreKit/Sources/Views/Images/Images.xcassets/flair-feed.imageset/Frame 2.png b/apple/OmnivoreKit/Sources/Views/Images/Images.xcassets/flair-feed.imageset/Frame 2.png new file mode 100644 index 000000000..358758a7e Binary files /dev/null and b/apple/OmnivoreKit/Sources/Views/Images/Images.xcassets/flair-feed.imageset/Frame 2.png differ diff --git a/apple/OmnivoreKit/Sources/Views/Images/Images.xcassets/flair-feed.imageset/Frame.png b/apple/OmnivoreKit/Sources/Views/Images/Images.xcassets/flair-feed.imageset/Frame.png new file mode 100644 index 000000000..3005f3c60 Binary files /dev/null and b/apple/OmnivoreKit/Sources/Views/Images/Images.xcassets/flair-feed.imageset/Frame.png differ diff --git a/apple/OmnivoreKit/Sources/Views/Images/Images.xcassets/flair-newsletter.imageset/Contents.json b/apple/OmnivoreKit/Sources/Views/Images/Images.xcassets/flair-newsletter.imageset/Contents.json new file mode 100644 index 000000000..8de04bec6 --- /dev/null +++ b/apple/OmnivoreKit/Sources/Views/Images/Images.xcassets/flair-newsletter.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "Frame-1.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Frame-1 1.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Frame-1 2.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/apple/OmnivoreKit/Sources/Views/Images/Images.xcassets/flair-newsletter.imageset/Frame-1 1.png b/apple/OmnivoreKit/Sources/Views/Images/Images.xcassets/flair-newsletter.imageset/Frame-1 1.png new file mode 100644 index 000000000..dd169cb55 Binary files /dev/null and b/apple/OmnivoreKit/Sources/Views/Images/Images.xcassets/flair-newsletter.imageset/Frame-1 1.png differ diff --git a/apple/OmnivoreKit/Sources/Views/Images/Images.xcassets/flair-newsletter.imageset/Frame-1 2.png b/apple/OmnivoreKit/Sources/Views/Images/Images.xcassets/flair-newsletter.imageset/Frame-1 2.png new file mode 100644 index 000000000..b6d39f40c Binary files /dev/null and b/apple/OmnivoreKit/Sources/Views/Images/Images.xcassets/flair-newsletter.imageset/Frame-1 2.png differ diff --git a/apple/OmnivoreKit/Sources/Views/Images/Images.xcassets/flair-newsletter.imageset/Frame-1.png b/apple/OmnivoreKit/Sources/Views/Images/Images.xcassets/flair-newsletter.imageset/Frame-1.png new file mode 100644 index 000000000..f5e9b10f9 Binary files /dev/null and b/apple/OmnivoreKit/Sources/Views/Images/Images.xcassets/flair-newsletter.imageset/Frame-1.png differ diff --git a/apple/OmnivoreKit/Sources/Views/Images/Images.xcassets/flair-pinned.imageset/Contents.json b/apple/OmnivoreKit/Sources/Views/Images/Images.xcassets/flair-pinned.imageset/Contents.json new file mode 100644 index 000000000..a55c67c87 --- /dev/null +++ b/apple/OmnivoreKit/Sources/Views/Images/Images.xcassets/flair-pinned.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "Frame-3.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Frame-3 1.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Frame-3 2.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/apple/OmnivoreKit/Sources/Views/Images/Images.xcassets/flair-pinned.imageset/Frame-3 1.png b/apple/OmnivoreKit/Sources/Views/Images/Images.xcassets/flair-pinned.imageset/Frame-3 1.png new file mode 100644 index 000000000..dba4109e8 Binary files /dev/null and b/apple/OmnivoreKit/Sources/Views/Images/Images.xcassets/flair-pinned.imageset/Frame-3 1.png differ diff --git a/apple/OmnivoreKit/Sources/Views/Images/Images.xcassets/flair-pinned.imageset/Frame-3 2.png b/apple/OmnivoreKit/Sources/Views/Images/Images.xcassets/flair-pinned.imageset/Frame-3 2.png new file mode 100644 index 000000000..487a9b273 Binary files /dev/null and b/apple/OmnivoreKit/Sources/Views/Images/Images.xcassets/flair-pinned.imageset/Frame-3 2.png differ diff --git a/apple/OmnivoreKit/Sources/Views/Images/Images.xcassets/flair-pinned.imageset/Frame-3.png b/apple/OmnivoreKit/Sources/Views/Images/Images.xcassets/flair-pinned.imageset/Frame-3.png new file mode 100644 index 000000000..1d0df2685 Binary files /dev/null and b/apple/OmnivoreKit/Sources/Views/Images/Images.xcassets/flair-pinned.imageset/Frame-3.png differ diff --git a/apple/OmnivoreKit/Sources/Views/Images/Images.xcassets/flair-recommended.imageset/Contents.json b/apple/OmnivoreKit/Sources/Views/Images/Images.xcassets/flair-recommended.imageset/Contents.json new file mode 100644 index 000000000..239db47c1 --- /dev/null +++ b/apple/OmnivoreKit/Sources/Views/Images/Images.xcassets/flair-recommended.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "Frame-4.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Frame-4 1.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Frame-4 2.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/apple/OmnivoreKit/Sources/Views/Images/Images.xcassets/flair-recommended.imageset/Frame-4 1.png b/apple/OmnivoreKit/Sources/Views/Images/Images.xcassets/flair-recommended.imageset/Frame-4 1.png new file mode 100644 index 000000000..a1ffdd088 Binary files /dev/null and b/apple/OmnivoreKit/Sources/Views/Images/Images.xcassets/flair-recommended.imageset/Frame-4 1.png differ diff --git a/apple/OmnivoreKit/Sources/Views/Images/Images.xcassets/flair-recommended.imageset/Frame-4 2.png b/apple/OmnivoreKit/Sources/Views/Images/Images.xcassets/flair-recommended.imageset/Frame-4 2.png new file mode 100644 index 000000000..3892567f1 Binary files /dev/null and b/apple/OmnivoreKit/Sources/Views/Images/Images.xcassets/flair-recommended.imageset/Frame-4 2.png differ diff --git a/apple/OmnivoreKit/Sources/Views/Images/Images.xcassets/flair-recommended.imageset/Frame-4.png b/apple/OmnivoreKit/Sources/Views/Images/Images.xcassets/flair-recommended.imageset/Frame-4.png new file mode 100644 index 000000000..c2f5d96f3 Binary files /dev/null and b/apple/OmnivoreKit/Sources/Views/Images/Images.xcassets/flair-recommended.imageset/Frame-4.png differ