Skip to content
GitLab
  • Menu
Projects Groups Snippets
  • /
  • Help
    • Help
    • Support
    • Community forum
    • Submit feedback
    • Contribute to GitLab
    • Switch to GitLab Next
  • Sign in / Register
  • Feeder Feeder
  • Project information
    • Project information
    • Activity
    • Labels
    • Members
  • Repository
    • Repository
    • Files
    • Commits
    • Branches
    • Tags
    • Contributors
    • Graph
    • Compare
    • Locked Files
  • Issues 228
    • Issues 228
    • List
    • Boards
    • Service Desk
    • Milestones
    • Requirements
  • Merge requests 1
    • Merge requests 1
  • CI/CD
    • CI/CD
    • Pipelines
    • Jobs
    • Schedules
    • Test Cases
  • Deployments
    • Deployments
    • Environments
    • Releases
  • Packages & Registries
    • Packages & Registries
    • Container Registry
  • Monitor
    • Monitor
    • Incidents
  • Analytics
    • Analytics
    • Value stream
    • CI/CD
    • Code review
    • Insights
    • Issue
    • Repository
  • Wiki
    • Wiki
  • Activity
  • Graph
  • Create a new issue
  • Jobs
  • Commits
  • Issue Boards
Collapse sidebar
  • Space Cowboy
  • FeederFeeder
  • Merge requests
  • !318

Version 2.0 Rewriting UI in Jetpack Compose

  • Review changes

  • Download
  • Email patches
  • Plain diff
Merged Space Cowboy requested to merge compose into master Jun 13, 2021
  • Overview 37
  • Commits 164
  • Pipelines 98
  • Changes 280

This PR is now in Beta!

Join the beta test if you want to test it.

Join the Beta on Google Play

on your phone: https://play.google.com/store/apps/details?id=com.nononsenseapps.feeder.play

on the web: https://play.google.com/apps/testing/com.nononsenseapps.feeder.play

Join the Beta on F-Droid

on F-Droid https://f-droid.org/en/packages/com.nononsenseapps.feeder/

Choose Versions and manually install the latest available Beta version.

Note that F-Droid builds apps with significant delay so it will probably not be the latest beta version available.

Description

It will enable cool things such as

Animated images in reader

TODO

Alpha

  • Feed List: Menu items clickable
  • Feed list: items properly update when backing data updates (try @Immutable items)
  • Reader: Menu items clickable (except read aloud)
  • Reader: clickable links
  • Reader: Clickable enclosure
  • Reader: Display link to enclosures
  • Reader: Dynamic number of items, depending on full text view or not
  • EditFeed: Initiate Sync on new save
  • EditFeed: Focus order
  • EditFeed: Close keyboard when done
  • EditFeed: Leaving title blank uses default title - and actually sets title!
  • EditFeed: Minimum size of switches
  • EditFeed: Clears back stack when navigating to Feed
  • EditFeed: Autosuggestion in tag
  • Settings: Sync is scheduled on settings changes

Beta

  • All strings with HTML formatting in them are updated to annotations instead
  • All screens: Can select text where applicable
  • Feed List: have images match height of rest of item (learn to use preferrable height??)
  • Feed list: Swipe to dismiss read/unread (https://developer.android.com/reference/kotlin/androidx/compose/material/package-summary#swipetodismiss)
  • Feed list: [mark above as read, mark below as read]
  • Feed list: Unread status indicated by alpha channel on text
  • Feed list: FAB
  • Reader: Bare minimum table rendering
  • Reader: Respect fetch image settings
  • Reader: Marks as read when opened
  • Reader: Respects option for opening in custom tab or reader
  • Reader: Read aloud
  • Intent support for sharing to feeder etc
  • Drawer counters update dynamically (try @Immutable?)
  • General: Notifications and app shortcuts use intents constructed via Navgraph DeepLink builder
  • Fix GitLab pipeline
  • Verify F-Droid build

Release

  • Jetpack Compose v1.0 has been released and dependencies updated.
  • No more compose related TODOs
  • All screens: Verify RTL behavior
  • Feed list: Swipe to refresh possible in empty view
  • General: Alpha channel of certain texts, like captions, have been set
  • Reader: Sizes of H1-6 tags finalized
  • Reader: Code block style finalized
  • Reader: Block quot style finalized
  • Reader: Youtube thumbnails
  • Reader: Feed title clickable in title section
  • CustomTab: Toolbar matches rest of app in dark mode
  • Sync on start if setting enabled
  • Dropdown menus: menu should close after external actions (like share)
  • Feed list: Scroll state should be retained when flow updates (like switching between read/unread)
  • Settings: Remove preload custom tab option
  • General: Dark theme has dark bottom bar (with home button, back, etc): https://google.github.io/accompanist/systemuicontroller/
  • Crash: When opening TheRegister article, full text by default. Worked second time
  • Verify app shortcuts
  • Feed list: Should long press dropdown menu item be added? [share, open feed, edit feed]
  • SwipeToDismiss should not prevent navigation drawer from being dragged out from edge]
  • Selecting text in reader - should then be possible to tap outside selection to cancel it but ClickableText prevents this
  • The system top bar should not be green in dark mode.
  • Ensure performance is top notch
  • Should dropdown menu items have icons or not?
  • Notification: Mark to read should be a broadcast and not a startActivity intent

This stack trace needs investigating (opened from feed, configured full text by default, it fetched article):

2021-08-29 08:28:37.074 9365-9365/? E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.nononsenseapps.feeder.debug, PID: 9365
    java.lang.IllegalStateException: pending composition has not been applied
        at androidx.compose.runtime.CompositionImpl.drainPendingModificationsForCompositionLocked(Composition.kt:443)
        at androidx.compose.runtime.CompositionImpl.composeContent(Composition.kt:475)
        at androidx.compose.runtime.Recomposer.composeInitial$runtime_release(Recomposer.kt:727)
        at androidx.compose.runtime.ComposerImpl$CompositionContextImpl.composeInitial$runtime_release(Composer.kt:2980)
        at androidx.compose.runtime.CompositionImpl.setContent(Composition.kt:432)
        at androidx.compose.ui.layout.SubcomposeLayoutState.subcomposeInto(SubcomposeLayout.kt:259)
        at androidx.compose.ui.layout.SubcomposeLayoutState.access$subcomposeInto(SubcomposeLayout.kt:145)
        at androidx.compose.ui.layout.SubcomposeLayoutState$subcompose$2.invoke(SubcomposeLayout.kt:234)
        at androidx.compose.ui.layout.SubcomposeLayoutState$subcompose$2.invoke(SubcomposeLayout.kt:231)
        at androidx.compose.runtime.snapshots.SnapshotStateObserver.withNoObservations(SnapshotStateObserver.kt:144)
        at androidx.compose.ui.node.OwnerSnapshotObserver.withNoSnapshotReadObservation$ui_release(OwnerSnapshotObserver.kt:49)
        at androidx.compose.ui.node.LayoutNode.withNoSnapshotReadObservation$ui_release(LayoutNode.kt:1107)
        at androidx.compose.ui.layout.SubcomposeLayoutState.subcompose(SubcomposeLayout.kt:231)
        at androidx.compose.ui.layout.SubcomposeLayoutState.subcompose(SubcomposeLayout.kt:226)
        at androidx.compose.ui.layout.SubcomposeLayoutState.subcompose$ui_release(SubcomposeLayout.kt:215)
        at androidx.compose.ui.layout.SubcomposeLayoutState$Scope.subcompose(SubcomposeLayout.kt:466)
        at com.google.accompanist.insets.ui.ScaffoldKt$ScaffoldLayout$1$1.invoke(Scaffold.kt:275)
        at com.google.accompanist.insets.ui.ScaffoldKt$ScaffoldLayout$1$1.invoke(Scaffold.kt:194)
        at androidx.compose.ui.layout.MeasureScope$layout$1.placeChildren(MeasureScope.kt:333)
        at androidx.compose.ui.layout.SubcomposeLayoutState$createMeasurePolicy$1$measure$1.placeChildren(SubcomposeLayout.kt:357)
        at androidx.compose.ui.node.LayoutNode$layoutChildren$1.invoke(LayoutNode.kt:925)
        at androidx.compose.ui.node.LayoutNode$layoutChildren$1.invoke(LayoutNode.kt:915)
        at androidx.compose.runtime.snapshots.Snapshot$Companion.observe(Snapshot.kt:115)
        at androidx.compose.runtime.snapshots.SnapshotStateObserver.observeReads(SnapshotStateObserver.kt:123)
        at androidx.compose.ui.node.OwnerSnapshotObserver.observeReads$ui_release(OwnerSnapshotObserver.kt:75)
        at androidx.compose.ui.node.OwnerSnapshotObserver.observeLayoutSnapshotReads$ui_release(OwnerSnapshotObserver.kt:56)
        at androidx.compose.ui.node.LayoutNode.layoutChildren$ui_release(LayoutNode.kt:915)
        at androidx.compose.ui.node.LayoutNode.onNodePlaced$ui_release(LayoutNode.kt:901)
        at androidx.compose.ui.node.InnerPlaceable.placeAt-f8xVGno(InnerPlaceable.kt:94)
        at androidx.compose.ui.layout.Placeable.access$placeAt-f8xVGno(Placeable.kt:31)
        at androidx.compose.ui.layout.Placeable$PlacementScope.place-70tqf50(Placeable.kt:315)
        at androidx.compose.ui.node.OuterMeasurablePlaceable.placeAt-f8xVGno(OuterMeasurablePlaceable.kt:149)
        at androidx.compose.ui.node.OuterMeasurablePlaceable.replace(OuterMeasurablePlaceable.kt:161)
        at androidx.compose.ui.node.LayoutNode.replace$ui_release(LayoutNode.kt:811)
        at androidx.compose.ui.node.MeasureAndLayoutDelegate.measureAndLayout(MeasureAndLayoutDelegate.kt:215)
        at androidx.compose.ui.platform.AndroidComposeView.measureAndLayout(AndroidComposeView.android.kt:510)
        at androidx.compose.ui.platform.AndroidComposeView.dispatchDraw(AndroidComposeView.android.kt:666)
        at android.view.View.draw(View.java:21597)
        at android.view.View.updateDisplayListIfDirty(View.java:20471)
        at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4397)
        at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4370)
        at android.view.View.updateDisplayListIfDirty(View.java:20431)

Nice to haves

  • HtmlToPlainText: Ruby handling: ignore RT tags
  • General: AMOLED toggle for dark mode
  • Reader: Some kind of Ruby handling
  • Reader: Actual table rendering, with horizontal scroll if wide
  • Reader: Youtube video player
  • Reader: General video player for html5 video
  • General: View models correspond to screens
  • All screens: Toolbar dropdown menu width adjusted
  • Can feed items have clearer separation? Maybe padding?
Edited Sep 10, 2021 by Space Cowboy
Assignee
Assign to
Reviewer
Request review from
Time tracking
Source branch: compose