Next generation of Twidere for Android

Overview

Twidere X

Build Status Crowdin Version Issues License Activity Contributors

Get it on Google Play Get it on F-Droid

Next generation of Twidere for Android 5.0+. Still in early stage.

Features

  • Modern Material Design
  • Dark mode
  • Tweet with photos
  • Multiple account support
  • Free, open source, NO ads, forever!

What's Happening

What's new in 1.5.0 - Aug 2021 Update

  • Proxy support, you can set a proxy for all the network request in settings.
  • Tabs column editing support, you can now modify the order and count of the home tab.
  • "Tweet sent" notification will be dismissed after showing once.
  • Screen will keep on when playing media in media scene.
  • Better RTL support for tweets.
  • Fix certain crashes when requesting network.
  • [Mastodon] Add support for gif avatar support and custom emoji in user name.
  • [Mastodon] Add federated timeline and local timeline

What is being planned for 1.6.0 - Aug 2021 Update

For 1.6.0, we're planning to build an experimatal desktop version, this is a big step, you can check out our milestore for detail. Here is a shortlist:

  • Experimatal desktop version.
  • Mute and block support.
  • Optimizing video play for timeline.
  • Bug fixes.
  • UI/UX tweaking.
  • Stability.

Roadmap for 2.0 - Jun 2021 Update

For 2.0, we're considering these options, but it is still an early thought and might change over time.

  • Desktop (Linux/Windows) support (by compose-jb).
  • Tablet mode.
  • Javascript extension support.
  • View-Only mode (aka Anonymous Browse).

Contributing

This project welcomes contributions of all types. Help spec'ing, design, documentation, finding bugs are ways everyone can help on top of coding features / bug fixes.

Before you start work on a feature that you would like to contribute, please read the Contributor's Guide.

State of code

Twidere X is still in an early stage and will be periodically re-structuring/refactoring the code to make it easier to comprehend, navigate, build, test, and contribute to, so DO expect significant changes to code layout on a regular basis.

License

                       Twidere X

     Copyright (C) 2020-2021 Tlaster <[email protected]>

Twidere X is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

Twidere X is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with Twidere X. If not, see <http://www.gnu.org/licenses/>.
Comments
  • Attempting to like tweets results in CtH

    Attempting to like tweets results in CtH

    As of this morning on 1.0.0-alpha5, attempting to like any tweet results in the app crashing to homescreen. I have submitted the error report via Google play.

    opened by AMoonRabbit 9
  • [Feature Request] Offline/Anonymous Browse

    [Feature Request] Offline/Anonymous Browse

    Describe the feature

    It would be amazing if an option to browse anonymously (without having to login) through Twitter (and other Twindere supported services) was added. Obviously only the basic options would be available (like viewing and searching for posts and users, viewing trending topics, etc.), but that's what is expected from anonymous browsing. An option to bookmark users, hashtags, etc. would be very useful as well. This is not a very important feature (since who uses this app must have an account), but it would be very useful for those who just want to give a quick overview on social networks supported by Twindere.

    Additional info

    • Note: It's not possible at moment due to API limitations.

    • Alternatives: Some possible alternatives to work around API limitations.

      • Use webview based tech
      • Use nitter instances to circumvent twitter's API limitations
    opened by RickyM7 8
  • [Bug] Crash when trying to login with Custom Twitter Key

    [Bug] Crash when trying to login with Custom Twitter Key

    Bug Report

    Environment

    Network type:

    • [ ] Cellular
    • [X] Wi-Fi

    Build Variant

    • [ ] Google Play
    • [X] FDroid

    App version: 1.0.6

    Bug Info

    Steps to reproduce

    Try to login using the Custom Twitter Key flow, app crashes

    Actual Behavior

    After copy pasting my API key & API secret key in the appropriate fields the app crashes. Here's the relevant logcat:

    05-05 09:34:09.729  1832  6412 I okhttp.OkHttpClient: --> POST https://api.twitter.com/oauth/request_token
    05-05 09:34:09.730  1832  6412 I okhttp.OkHttpClient: Content-Type: application/x-www-form-urlencoded
    05-05 09:34:09.730  1832  6412 I okhttp.OkHttpClient: Content-Length: 18
    05-05 09:34:09.730  1832  6412 I okhttp.OkHttpClient: Authorization: OAuth oauth_consumer_key="Hc9oqrD76pdXXXXXXXXXXXXX", oauth_nonce="2kHPqklPHHTaNF5TtFNHISaw09lXXXXXXXXXXXXXXX", oauth_signature="4XXXXXXXXXXXX%2BXXXXXXXXXXXX4%3D", oauth_signature_method="HMAC-SHA1", oauth_timestamp="1620200049",  oauth_version="1.0"
    05-05 09:34:09.731  1832  6412 I okhttp.OkHttpClient: oauth_callback=oob
    05-05 09:34:09.731  1832  6412 I okhttp.OkHttpClient: --> END POST (18-byte body)
    05-05 09:34:09.817  1832  1832 E AndroidRuntime: FATAL EXCEPTION: main
    05-05 09:34:09.817  1832  1832 E AndroidRuntime: Process: com.twidere.twiderex, PID: 1832
    05-05 09:34:09.817  1832  1832 E AndroidRuntime: java.lang.ArrayIndexOutOfBoundsException: length=10240; index=-2
    05-05 09:34:09.817  1832  1832 E AndroidRuntime:        at androidx.compose.runtime.SlotTableKt.groupSize(SlotTable.kt:2558)
    05-05 09:34:09.817  1832  1832 E AndroidRuntime:        at androidx.compose.runtime.SlotTableKt.access$groupSize(SlotTable.kt:1)
    05-05 09:34:09.817  1832  1832 E AndroidRuntime:        at androidx.compose.runtime.SlotReader.groupSize(SlotTable.kt:596)
    05-05 09:34:09.817  1832  1832 E AndroidRuntime:        at androidx.compose.runtime.ComposerImpl.recomposeToGroupEnd(Composer.kt:2215)
    05-05 09:34:09.817  1832  1832 E AndroidRuntime:        at androidx.compose.runtime.ComposerImpl.skipCurrentGroup(Composer.kt:2499)
    05-05 09:34:09.817  1832  1832 E AndroidRuntime:        at androidx.compose.runtime.ComposerImpl.recompose$runtime_release(Composer.kt:2625)
    05-05 09:34:09.817  1832  1832 E AndroidRuntime:        at androidx.compose.runtime.CompositionImpl.recompose(Composition.kt:406)
    05-05 09:34:09.817  1832  1832 E AndroidRuntime:        at androidx.compose.runtime.Recomposer.performRecompose(Recomposer.kt:724)
    05-05 09:34:09.817  1832  1832 E AndroidRuntime:        at androidx.compose.runtime.Recomposer.access$performRecompose(Recomposer.kt:100)
    05-05 09:34:09.817  1832  1832 E AndroidRuntime:        at androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2$2.invoke(Recomposer.kt:437)
    05-05 09:34:09.817  1832  1832 E AndroidRuntime:        at androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2$2.invoke(Recomposer.kt:411)
    05-05 09:34:09.817  1832  1832 E AndroidRuntime:        at androidx.compose.ui.platform.AndroidUiFrameClock$withFrameNanos$2$callback$1.doFrame(AndroidUiFrameClock.android.kt:34)
    05-05 09:34:09.817  1832  1832 E AndroidRuntime:        at androidx.compose.ui.platform.AndroidUiDispatcher.performFrameDispatch(AndroidUiDispatcher.android.kt:112)
    05-05 09:34:09.817  1832  1832 E AndroidRuntime:        at androidx.compose.ui.platform.AndroidUiDispatcher.access$performFrameDispatch(AndroidUiDispatcher.android.kt:43)
    05-05 09:34:09.817  1832  1832 E AndroidRuntime:        at androidx.compose.ui.platform.AndroidUiDispatcher$dispatchCallback$1.doFrame(AndroidUiDispatcher.android.kt:72)
    05-05 09:34:09.817  1832  1832 E AndroidRuntime:        at android.view.Choreographer$CallbackRecord.run(Choreographer.java:970)
    05-05 09:34:09.817  1832  1832 E AndroidRuntime:        at android.view.Choreographer.doCallbacks(Choreographer.java:796)
    05-05 09:34:09.817  1832  1832 E AndroidRuntime:        at android.view.Choreographer.doFrame(Choreographer.java:727)
    05-05 09:34:09.817  1832  1832 E AndroidRuntime:        at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:957)
    05-05 09:34:09.817  1832  1832 E AndroidRuntime:        at android.os.Handler.handleCallback(Handler.java:938)
    05-05 09:34:09.817  1832  1832 E AndroidRuntime:        at android.os.Handler.dispatchMessage(Handler.java:99)
    05-05 09:34:09.817  1832  1832 E AndroidRuntime:        at android.os.Looper.loop(Looper.java:223)
    05-05 09:34:09.817  1832  1832 E AndroidRuntime:        at android.app.ActivityThread.main(ActivityThread.java:7660)
    05-05 09:34:09.817  1832  1832 E AndroidRuntime:        at java.lang.reflect.Method.invoke(Native Method)
    05-05 09:34:09.817  1832  1832 E AndroidRuntime:        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
    05-05 09:34:09.817  1832  1832 E AndroidRuntime:        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
    05-05 09:34:09.820  1095  6414 I DropBoxManagerService: add tag=data_app_crash isTagEnabled=true flags=0x2
    05-05 09:34:09.820  1095  6333 W ActivityTaskManager:   Force finishing activity com.twidere.twiderex/.TwidereXActivity
    05-05 09:34:09.844  1832  1832 I Process : Sending signal. PID: 1832 SIG: 9
    05-05 09:34:09.863  1095  2334 I WindowManager: WIN DEATH: Window{4097029 u0 com.twidere.twiderex/com.twidere.twiderex.TwidereXActivity EXITING}
    

    Expected behavior

    The app doesn't crash and logs in to Twitter

    opened by Furikuda 7
  • Please support threads

    Please support threads

    Please support threads.

    Threads have become very common on Twitter. So common that Twitter provides a help page: How to create a thread on Twitter

    However, when I open the first tweet of a thread in Twidere X (or Twidere) the view is very different from the view on Twitter. Twidere shows all the replies to the thread's first tweet, EXCEPT the next tweet of the thread by the original poster (to be fair, the next tweet might be hidden somewhere in the replies :shrug:). In order to get a thread view in Twidere I have to open the last tweet of a thread, but that is not how threads get shared / retweeted on Twitter.

    Example:

    Start of a thread: https://twitter.com/vanteficient/status/1343925279039893504

    How it looks on Twitter (Web):

    image

    How it looks in Twidere X:

    image

    opened by elchenberg 6
  • [Feature Request] Add Load Item Limit Slider

    [Feature Request] Add Load Item Limit Slider

    Is your feature request related to a problem? Please describe. It is annoying to click Load More so often because it currently only allows you to load 20 tweets at a time.

    Describe the solution you'd like Add a slider like in Twidere (Settings -> Content -> Load item limit) that allows you to load 10-200 items depending on choice.

    enhancement 
    opened by realmain 5
  • [Bug] Crash when trying to log into Twitter

    [Bug] Crash when trying to log into Twitter

    Bug Report

    Environment

    Network type:

    • [ ] Cellular
    • [x] Wi-Fi

    Build Variant

    • [ ] Google Play
    • [x] FDroid

    App version: 1.1.0

    Bug Info

    The app crashes when trying to log into Twitter via the normal login (not the API login, basically)

    Steps to reproduce

    Open the app, tap on "Sign in with Twitter"

    Actual Behavior

    The app shows the loading animation and then crashes, logs below

    FATAL EXCEPTION: main
    Process: com.twidere.twiderex, PID: 9988
    java.lang.IllegalStateException: LayoutCoordinates androidx.compose.ui.node.InnerPlaceable@54eb3c5 is not attached!
    	at androidx.compose.ui.node.LayoutNodeWrapper.localBoundingBoxOf(LayoutNodeWrapper.kt:365)
    	at androidx.compose.ui.layout.LayoutCoordinates$DefaultImpls.localBoundingBoxOf$default(LayoutCoordinates.kt:91)
    	at androidx.compose.ui.semantics.NodeLocationHolder.<init>(SemanticsSort.kt:70)
    	at androidx.compose.ui.semantics.SemanticsSortKt.findOneLayerOfSemanticsWrappersSortedByBounds(SemanticsSort.kt:45)
    	at androidx.compose.ui.semantics.SemanticsSortKt.findOneLayerOfSemanticsWrappersSortedByBounds(SemanticsSort.kt:53)
    	at androidx.compose.ui.semantics.SemanticsSortKt.findOneLayerOfSemanticsWrappersSortedByBounds(SemanticsSort.kt:53)
    	at androidx.compose.ui.semantics.SemanticsSortKt.findOneLayerOfSemanticsWrappersSortedByBounds(SemanticsSort.kt:53)
    	at androidx.compose.ui.semantics.SemanticsSortKt.findOneLayerOfSemanticsWrappersSortedByBounds(SemanticsSort.kt:53)
    	at androidx.compose.ui.semantics.SemanticsSortKt.findOneLayerOfSemanticsWrappersSortedByBounds(SemanticsSort.kt:53)
    	at androidx.compose.ui.semantics.SemanticsSortKt.findOneLayerOfSemanticsWrappersSortedByBounds(SemanticsSort.kt:53)
    	at androidx.compose.ui.semantics.SemanticsSortKt.findOneLayerOfSemanticsWrappersSortedByBounds(SemanticsSort.kt:53)
    	at androidx.compose.ui.semantics.SemanticsSortKt.findOneLayerOfSemanticsWrappersSortedByBounds(SemanticsSort.kt:53)
    	at androidx.compose.ui.semantics.SemanticsSortKt.findOneLayerOfSemanticsWrappersSortedByBounds$default(SemanticsSort.kt:27)
    	at androidx.compose.ui.semantics.SemanticsNode.unmergedChildren$ui_release(SemanticsNode.kt:178)
    	at androidx.compose.ui.semantics.SemanticsNode.getChildren(SemanticsNode.kt:225)
    	at androidx.compose.ui.semantics.SemanticsNode.getChildrenSortedByBounds$ui_release(SemanticsNode.kt:210)
    	at androidx.compose.ui.platform.AndroidComposeViewAccessibilityDelegateCompat.populateAccessibilityNodeInfoProperties(AndroidComposeViewAccessibilityDelegateCompat.android.kt:298)
    	at androidx.compose.ui.platform.AndroidComposeViewAccessibilityDelegateCompat.createNodeInfo(AndroidComposeViewAccessibilityDelegateCompat.android.kt:273)
    	at androidx.compose.ui.platform.AndroidComposeViewAccessibilityDelegateCompat.access$createNodeInfo(AndroidComposeViewAccessibilityDelegateCompat.android.kt:96)
    	at androidx.compose.ui.platform.AndroidComposeViewAccessibilityDelegateCompat$MyNodeProvider.createAccessibilityNodeInfo(AndroidComposeViewAccessibilityDelegateCompat.android.kt:2141)
    	at android.view.View.createAccessibilityNodeInfoInternal(View.java:6565)
    	at android.view.View$AccessibilityDelegate.createAccessibilityNodeInfo(View.java:23642)
    	at android.view.View.createAccessibilityNodeInfo(View.java:6551)
    	at android.view.accessibility.AccessibilityRecord.setSource(AccessibilityRecord.java:145)
    	at android.view.accessibility.AccessibilityRecord.setSource(AccessibilityRecord.java:119)
    	at android.view.View.onInitializeAccessibilityEventInternal(View.java:6505)
    	at android.view.View$AccessibilityDelegate.onInitializeAccessibilityEvent(View.java:23554)
    	at androidx.core.view.AccessibilityDelegateCompat.onInitializeAccessibilityEvent(AccessibilityDelegateCompat.java:257)
    	at androidx.core.view.AccessibilityDelegateCompat$AccessibilityDelegateAdapter.onInitializeAccessibilityEvent(AccessibilityDelegateCompat.java:76)
    	at android.view.View.onInitializeAccessibilityEvent(View.java:6491)
    	at android.view.View.sendAccessibilityEventUncheckedInternal(View.java:6358)
    	at android.view.View$AccessibilityDelegate.sendAccessibilityEventUnchecked(View.java:23493)
    	at androidx.core.view.AccessibilityDelegateCompat.sendAccessibilityEventUnchecked(AccessibilityDelegateCompat.java:196)
    	at androidx.core.view.AccessibilityDelegateCompat$AccessibilityDelegateAdapter.sendAccessibilityEventUnchecked(AccessibilityDelegateCompat.java:113)
    	at android.view.View.sendAccessibilityEventUnchecked(View.java:6341)
    	at android.view.ViewRootImpl$SendWindowContentChangedAccessibilityEvent.run(ViewRootImpl.java:7493)
    	at android.view.ViewRootImpl$SendWindowContentChangedAccessibilityEvent.runOrPost(ViewRootImpl.java:7519)
    	at android.view.ViewRootImpl.postSendWindowContentChangedCallback(ViewRootImpl.java:6631)
    	at android.view.ViewRootImpl.notifySubtreeAccessibilityStateChanged(ViewRootImpl.java:6815)
    	at android.view.ViewGroup.notifySubtreeAccessibilityStateChanged(ViewGroup.java:3099)
    	at android.view.ViewGroup.notifySubtreeAccessibilityStateChanged(ViewGroup.java:3099)
    	at android.view.ViewGroup.notifySubtreeAccessibilityStateChanged(ViewGroup.java:3099)
    	at android.view.ViewGroup.notifySubtreeAccessibilityStateChanged(ViewGroup.java:3099)
    	at android.view.View.notifySubtreeAccessibilityStateChangedIfNeeded(View.java:9497)
    	at android.view.ViewGroup.addViewInner(ViewGroup.java:4478)
    	at android.view.ViewGroup.addView(ViewGroup.java:4258)
    	at android.view.ViewGroup.addView(ViewGroup.java:4198)
    	at android.view.ViewGroup.addView(ViewGroup.java:4171)
    	at androidx.compose.ui.platform.AndroidComposeView.getAndroidViewsHandler$ui_release(AndroidComposeView.android.kt:253)
    	at androidx.compose.ui.platform.AndroidComposeView.addAndroidView(AndroidComposeView.android.kt:429)
    	at androidx.compose.ui.viewinterop.AndroidViewHolder$layoutNode$1$3.invoke(AndroidViewHolder.android.kt:211)
    	at androidx.compose.ui.viewinterop.AndroidViewHolder$layoutNode$1$3.invoke(AndroidViewHolder.android.kt:210)
    	at androidx.compose.ui.node.LayoutNode.attach$ui_release(LayoutNode.kt:329)
    	at androidx.compose.ui.node.LayoutNode.attach$ui_release(LayoutNode.kt:322)
    	at androidx.compose.ui.node.LayoutNode.insertAt$ui_release(LayoutNode.kt:217)
    	at androidx.compose.ui.node.UiApplier.insertBottomUp(UiApplier.android.kt:32)
    	at androidx.compose.ui.node.UiApplier.insertBottomUp(UiApplier.android.kt:22)
    	at androidx.compose.runtime.ComposerImpl$createNode$3.invoke(Composer.kt:1368)
    	at androidx.compose.runtime.ComposerImpl$createNode$3.invoke(Composer.kt:1363)
    	at androidx.compose.runtime.ComposerImpl$recordInsert$2.invoke(Composer.kt:2697)
    	at androidx.compose.runtime.ComposerImpl$recordInsert$2.invoke(Composer.kt:2694)
    	at androidx.compose.runtime.CompositionImpl.applyChanges(Composition.kt:562)
    	at androidx.compose.runtime.Recomposer.composeInitial$runtime_release(Recomposer.kt:708)
    	at androidx.compose.runtime.ComposerImpl$CompositionContextImpl.composeInitial$runtime_release(Composer.kt:2914)
    	at androidx.compose.runtime.ComposerImpl$CompositionContextImpl.composeInitial$runtime_release(Composer.kt:2914)
    	at androidx.compose.runtime.CompositionImpl.setContent(Composition.kt:409)
    	at androidx.compose.ui.layout.SubcomposeLayoutState.subcomposeInto(SubcomposeLayout.kt:184)
    	at androidx.compose.ui.layout.SubcomposeLayoutState.access$subcomposeInto(SubcomposeLayout.kt:100)
    	at androidx.compose.ui.layout.SubcomposeLayoutState$subcompose$2.invoke(SubcomposeLayout.kt:160)
    	at androidx.compose.ui.layout.SubcomposeLayoutState$subcompose$2.invoke(SubcomposeLayout.kt:158)
    	at androidx.compose.runtime.snapshots.SnapshotStateObserver.withNoObservations(SnapshotStateObserver.kt:137)
    	at androidx.compose.ui.node.OwnerSnapshotObserver.withNoSnapshotReadObservation$ui_release(OwnerSnapshotObserver.kt:49)
    	at androidx.compose.ui.node.LayoutNode.withNoSnapshotReadObservation$ui_release(LayoutNode.kt:1054)
    	at androidx.compose.ui.layout.SubcomposeLayoutState.subcompose(SubcomposeLayout.kt:158)
    	at androidx.compose.ui.layout.SubcomposeLayoutState.subcompose(SubcomposeLayout.kt:152)
    	at androidx.compose.material.ScaffoldKt$ScaffoldLayout$1$1$1.invoke(Scaffold.kt:303)
    	at androidx.compose.material.ScaffoldKt$ScaffoldLayout$1$1$1.invoke(Scaffold.kt:230)
    	at androidx.compose.ui.layout.MeasureScope$layout$1.placeChildren(MeasureScope.kt:68)
    	at androidx.compose.ui.layout.SubcomposeLayoutState$createMeasurePolicy$1$measure$1.placeChildren(SubcomposeLayout.kt:224)
    	at androidx.compose.ui.node.LayoutNode$layoutChildren$1.invoke(LayoutNode.kt:902)
    	at androidx.compose.ui.node.LayoutNode$layoutChildren$1.invoke(LayoutNode.kt:886)
    	at androidx.compose.runtime.snapshots.SnapshotStateObserver.observeReads(SnapshotStateObserver.kt:121)
    	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(LayoutNode.kt:886)
    	at androidx.compose.ui.node.LayoutNode.onNodePlaced$ui_release(LayoutNode.kt:874)
    	at androidx.compose.ui.node.InnerPlaceable.placeAt-f8xVGno(InnerPlaceable.kt:108)
    	at androidx.compose.ui.layout.Placeable.access$placeAt-f8xVGno(Placeable.kt:31)
    	at androidx.compose.ui.layout.Placeable$PlacementScope.place-70tqf50(Placeable.kt:358)
    	at androidx.compose.ui.node.OuterMeasurablePlaceable.placeAt-f8xVGno(OuterMeasurablePlaceable.kt:149)
    	at androidx.compose.ui.layout.Placeable.access$placeAt-f8xVGno(Placeable.kt:31)
    	at androidx.compose.ui.layout.Placeable$PlacementScope.place-70tqf50(Placeable.kt:358)
    	at androidx.compose.ui.layout.Placeable$PlacementScope.place-70tqf50$default(Placeable.kt:191)
    	at androidx.compose.foundation.layout.BoxKt.placeInBox(Box.kt:182)
    	at androidx.compose.foundation.layout.BoxKt.access$placeInBox(Box.kt:1)
    	at androidx.compose.foundation.layout.BoxKt$boxMeasurePolicy$1$measure$2.invoke(Box.kt:122)
    	at androidx.compose.foundation.layout.BoxKt$boxMeasurePolicy$1$measure$2.invoke(Box.kt:121)
    	at androidx.compose.ui.layout.MeasureScope$layout$1.placeChildren(MeasureScope.kt:68)
    	at androidx.compose.ui.node.LayoutNode$layoutChildren$1.invoke(LayoutNode.kt:902)
    	at androidx.compose.ui.node.LayoutNode$layoutChildren$1.invoke(LayoutNode.kt:886)
    	at androidx.compose.runtime.snapshots.SnapshotStateObserver.observeReads(SnapshotStateObserver.kt:121)
    	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(LayoutNode.kt:886)
    	at androidx.compose.ui.node.LayoutNode.onNodePlaced$ui_release(LayoutNode.kt:874)
    	at androidx.compose.ui.node.InnerPlaceable.placeAt-f8xVGno(InnerPlaceable.kt:108)
    	at androidx.compose.ui.layout.Placeable.access$placeAt-f8xVGno(Placeable.kt:31)
    	at androidx.compose.ui.layout.Placeable$PlacementScope.placeWithLayer(Placeable.kt:381)
    	at androidx.compose.ui.layout.Placeable$PlacementScope.placeWithLayer$default(Placeable.kt:254)
    	at androidx.compose.ui.graphics.SimpleGraphicsLayerModifier$measure$1.invoke(GraphicsLayerModifier.kt:215)
    	at androidx.compose.ui.graphics.SimpleGraphicsLayerModifier$measure$1.invoke(GraphicsLayerModifier.kt:214)
    	at androidx.compose.ui.layout.MeasureScope$layout$1.placeChildren(MeasureScope.kt:68)
    	at androidx.compose.ui.node.DelegatingLayoutNodeWrapper.placeAt-f8xVGno(DelegatingLayoutNodeWrapper.kt:103)
    	at androidx.compose.ui.layout.Placeable.access$placeAt-f8xVGno(Placeable.kt:31)
    	at androidx.compose.ui.layout.Placeable$PlacementScope.place-70tqf50(Placeable.kt:358)
    	at androidx.compose.ui.layout.Placeable$PlacementScope.place-70tqf50$default(Placeable.kt:191)
    	at androidx.compose.ui.node.DelegatingLayoutNodeWrapper$measure$1$1.placeChildren(DelegatingLayoutNodeWrapper.kt:115)
    	at androidx.compose.ui.node.DelegatingLayoutNodeWrapper.placeAt-f8xVGno(DelegatingLayoutNodeWrapper.kt:103)
    	at androidx.compose.ui.layout.Placeable.access$placeAt-f8xVGno(Placeable.kt:31)
    	at androidx.compose.ui.layout.Placeable$PlacementScope.placeWithLayer(Placeable.kt:381)
    	at androidx.compose.ui.layout.Placeable$PlacementScope.placeWithLayer$default(Placeable.kt:254)
    	at androidx.compose.ui.graphics.SimpleGraphicsLayerModifier$measure$1.invoke(GraphicsLayerModifier.kt:215)
    	at androidx.compose.ui.graphics.SimpleGraphicsLayerModifier$measure$1.invoke(GraphicsLayerModifier.kt:214)
    	at androidx.compose.ui.layout.MeasureScope$layout$1.placeChildren(MeasureScope.kt:68)
    	at androidx.compose.ui.node.DelegatingLayoutNodeWrapper.placeAt-f8xVGno(DelegatingLayoutNodeWrapper.kt:103)
    	at androidx.compose.ui.layout.Placeable.access$placeAt-f8xVGno(Placeable.kt:31)
    	at androidx.compose.ui.layout.Placeable$PlacementScope.place-70tqf50(Placeable.kt:358)
    	at androidx.compose.ui.node.OuterMeasurablePlaceable.placeAt-f8xVGno(OuterMeasurablePlaceable.kt:149)
    	at androidx.compose.ui.layout.Placeable.access$placeAt-f8xVGno(Placeable.kt:31)
    	at androidx.compose.ui.layout.Placeable$PlacementScope.place-70tqf50(Placeable.kt:358)
    	at androidx.compose.ui.layout.Placeable$PlacementScope.place-70tqf50$default(Placeable.kt:191)
    	at androidx.compose.foundation.layout.BoxKt.placeInBox(Box.kt:182)
    	at androidx.compose.foundation.layout.BoxKt.access$placeInBox(Box.kt:1)
    	at androidx.compose.foundation.layout.BoxKt$boxMeasurePolicy$1$measure$2.invoke(Box.kt:122)
    	at androidx.compose.foundation.layout.BoxKt$boxMeasurePolicy$1$measure$2.invoke(Box.kt:121)
    	at androidx.compose.ui.layout.MeasureScope$layout$1.placeChildren(MeasureScope.kt:68)
    	at androidx.compose.ui.node.LayoutNode$layoutChildren$1.invoke(LayoutNode.kt:902)
    	at androidx.compose.ui.node.LayoutNode$layoutChildren$1.invoke(LayoutNode.kt:886)
    	at androidx.compose.runtime.snapshots.SnapshotStateObserver.observeReads(SnapshotStateObserver.kt:121)
    	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(LayoutNode.kt:886)
    	at androidx.compose.ui.node.LayoutNode.onNodePlaced$ui_release(LayoutNode.kt:874)
    	at androidx.compose.ui.node.InnerPlaceable.placeAt-f8xVGno(InnerPlaceable.kt:108)
    	at androidx.compose.ui.layout.Placeable.access$placeAt-f8xVGno(Placeable.kt:31)
    	at androidx.compose.ui.layout.Placeable$PlacementScope.place-70tqf50(Placeable.kt:358)
    	at androidx.compose.ui.layout.Placeable$PlacementScope.place-70tqf50$default(Placeable.kt:191)
    	at androidx.compose.ui.node.DelegatingLayoutNodeWrapper$measure$1$1.placeChildren(DelegatingLayoutNodeWrapper.kt:115)
    	at androidx.compose.ui.node.DelegatingLayoutNodeWrapper.placeAt-f8xVGno(DelegatingLayoutNodeWrapper.kt:103)
    	at androidx.compose.ui.layout.Placeable.access$placeAt-f8xVGno(Placeable.kt:31)
    	at androidx.compose.ui.layout.Placeable$PlacementScope.place(Placeable.kt:355)
    	at androidx.compose.ui.layout.Placeable$PlacementScope.place$default(Placeable.kt:179)
    	at androidx.compose.foundation.layout.PaddingValuesModifier$measure$2.invoke(Padding.kt:420)
    	at androidx.compose.foundation.layout.PaddingValuesModifier$measure$2.invoke(Padding.kt:419)
    	at androidx.compose.ui.layout.MeasureScope$layout$1.placeChildren(MeasureScope.kt:68)
    	at androidx.compose.ui.node.DelegatingLayoutNodeWrapper.placeAt-f8xVGno(DelegatingLayoutNodeWrapper.kt:103)
    	at androidx.compose.ui.layout.Placeable.access$placeAt-f8xVGno(Placeable.kt:31)
    	at androidx.compose.ui.layout.Placeable$PlacementScope.place-70tqf50(Placeable.kt:358)
    	at androidx.compose.ui.node.OuterMeasurablePlaceable.placeAt-f8xVGno(OuterMeasurablePlaceable.kt:149)
    	at androidx.compose.ui.layout.Placeable.access$placeAt-f8xVGno(Placeable.kt:31)
    	at androidx.compose.ui.layout.Placeable$PlacementScope.place-70tqf50(Placeable.kt:358)
    	at androidx.compose.ui.layout.Placeable$PlacementScope.place-70tqf50$default(Placeable.kt:191)
    	at androidx.compose.foundation.layout.BoxKt.placeInBox(Box.kt:182)
    	at androidx.compose.foundation.layout.BoxKt.access$placeInBox(Box.kt:1)
    	at androidx.compose.foundation.layout.BoxKt$boxMeasurePolicy$1$measure$5.invoke(Box.kt:163)
    	at androidx.compose.foundation.layout.BoxKt$boxMeasurePolicy$1$measure$5.invoke(Box.kt:159)
    	at androidx.compose.ui.layout.MeasureScope$layout$1.placeChildren(MeasureScope.kt:68)
    	at androidx.compose.ui.node.LayoutNode$layoutChildren$1.invoke(LayoutNode.kt:902)
    	at androidx.compose.ui.node.LayoutNode$layoutChildren$1.invoke(LayoutNode.kt:886)
    	at androidx.compose.runtime.snapshots.SnapshotStateObserver.observeReads(SnapshotStateObserver.kt:121)
    	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(LayoutNode.kt:886)
    	at androidx.compose.ui.node.LayoutNode.onNodePlaced$ui_release(LayoutNode.kt:874)
    	at androidx.compose.ui.node.InnerPlaceable.placeAt-f8xVGno(InnerPlaceable.kt:108)
    	at androidx.compose.ui.layout.Placeable.access$placeAt-f8xVGno(Placeable.kt:31)
    	at androidx.compose.ui.layout.Placeable$PlacementScope.place-70tqf50(Placeable.kt:358)
    	at androidx.compose.ui.node.OuterMeasurablePlaceable.placeAt-f8xVGno(OuterMeasurablePlaceable.kt:149)
    	at androidx.compose.ui.layout.Placeable.access$placeAt-f8xVGno(Placeable.kt:31)
    	at androidx.compose.ui.layout.Placeable$PlacementScope.place-70tqf50(Placeable.kt:358)
    	at androidx.compose.ui.layout.Placeable$PlacementScope.place-70tqf50$default(Placeable.kt:191)
    	at androidx.compose.foundation.layout.BoxKt.placeInBox(Box.kt:182)
    	at androidx.compose.foundation.layout.BoxKt.access$placeInBox(Box.kt:1)
    	at androidx.compose.foundation.layout.BoxKt$boxMeasurePolicy$1$measure$5.invoke(Box.kt:163)
    	at androidx.compose.foundation.layout.BoxKt$boxMeasurePolicy$1$measure$5.invoke(Box.kt:159)
    	at androidx.compose.ui.layout.MeasureScope$layout$1.placeChildren(MeasureScope.kt:68)
    	at androidx.compose.ui.node.LayoutNode$layoutChildren$1.invoke(LayoutNode.kt:902)
    	at androidx.compose.ui.node.LayoutNode$layoutChildren$1.invoke(LayoutNode.kt:886)
    	at androidx.compose.runtime.snapshots.SnapshotStateObserver.observeReads(SnapshotStateObserver.kt:121)
    	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(LayoutNode.kt:886)
    	at androidx.compose.ui.node.LayoutNode.onNodePlaced$ui_release(LayoutNode.kt:874)
    	at androidx.compose.ui.node.InnerPlaceable.placeAt-f8xVGno(InnerPlaceable.kt:108)
    	at androidx.compose.ui.layout.Placeable.access$placeAt-f8xVGno(Placeable.kt:31)
    	at androidx.compose.ui.layout.Placeable$PlacementScope.placeWithLayer(Placeable.kt:381)
    	at androidx.compose.ui.layout.Placeable$PlacementScope.placeWithLayer$default(Placeable.kt:254)
    	at androidx.compose.ui.graphics.BlockGraphicsLayerModifier$measure$1.invoke(GraphicsLayerModifier.kt:158)
    	at androidx.compose.ui.graphics.BlockGraphicsLayerModifier$measure$1.invoke(GraphicsLayerModifier.kt:157)
    	at androidx.compose.ui.layout.MeasureScope$layout$1.placeChildren(MeasureScope.kt:68)
    	at androidx.compose.ui.node.DelegatingLayoutNodeWrapper.placeAt-f8xVGno(DelegatingLayoutNodeWrapper.kt:103)
    	at androidx.compose.ui.layout.Placeable.access$placeAt-f8xVGno(Placeable.kt:31)
    	at androidx.compose.ui.layout.Placeable$PlacementScope.place-70tqf50(Placeable.kt:358)
    	at androidx.compose.ui.node.OuterMeasurablePlaceable.placeAt-f8xVGno(OuterMeasurablePlaceable.kt:149)
    	at androidx.compose.ui.layout.Placeable.access$placeAt-f8xVGno(Placeable.kt:31)
    	at androidx.compose.ui.layout.Placeable$PlacementScope.place-70tqf50(Placeable.kt:358)
    	at androidx.compose.ui.layout.Placeable$PlacementScope.place-70tqf50$default(Placeable.kt:191)
    	at androidx.compose.foundation.layout.BoxKt.placeInBox(Box.kt:182)
    	at androidx.compose.foundation.layout.BoxKt.access$placeInBox(Box.kt:1)
    	at androidx.compose.foundation.layout.BoxKt$boxMeasurePolicy$1$measure$2.invoke(Box.kt:122)
    	at androidx.compose.foundation.layout.BoxKt$boxMeasurePolicy$1$measure$2.invoke(Box.kt:121)
    	at androidx.compose.ui.layout.MeasureScope$layout$1.placeChildren(MeasureScope.kt:68)
    	at androidx.compose.ui.node.LayoutNode$layoutChildren$1.invoke(LayoutNode.kt:902)
    	at androidx.compose.ui.node.LayoutNode$layoutChildren$1.invoke(LayoutNode.kt:886)
    	at androidx.compose.runtime.snapshots.SnapshotStateObserver.observeReads(SnapshotStateObserver.kt:121)
    	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(LayoutNode.kt:886)
    	at androidx.compose.ui.node.LayoutNode.onNodePlaced$ui_release(LayoutNode.kt:874)
    	at androidx.compose.ui.node.InnerPlaceable.placeAt-f8xVGno(InnerPlaceable.kt:108)
    	at androidx.compose.ui.layout.Placeable.access$placeAt-f8xVGno(Placeable.kt:31)
    	at androidx.compose.ui.layout.Placeable$PlacementScope.placeRelative(Placeable.kt:347)
    	at androidx.compose.ui.layout.Placeable$PlacementScope.placeRelative$default(Placeable.kt:167)
    	at androidx.compose.foundation.layout.FillModifier$measure$1.invoke(Size.kt:655)
    	at androidx.compose.foundation.layout.FillModifier$measure$1.invoke(Size.kt:654)
    	at androidx.compose.ui.layout.MeasureScope$layout$1.placeChildren(MeasureScope.kt:68)
    	at androidx.compose.ui.node.DelegatingLayoutNodeWrapper.placeAt-f8xVGno(DelegatingLayoutNodeWrapper.kt:103)
    	at androidx.compose.ui.layout.Placeable.access$placeAt-f8xVGno(Placeable.kt:31)
    	at androidx.compose.ui.layout.Placeable$PlacementScope.place-70tqf50(Placeable.kt:358)
    	at androidx.compose.ui.node.OuterMeasurablePlaceable.placeAt-f8xVGno(OuterMeasurablePlaceable.kt:149)
    	at androidx.compose.ui.layout.Placeable.access$placeAt-f8xVGno(Placeable.kt:31)
    	at androidx.compose.ui.layout.Placeable$PlacementScope.place-70tqf50(Placeable.kt:358)
    	at androidx.compose.ui.layout.Placeable$PlacementScope.place-70tqf50$default(Placeable.kt:191)
    	at androidx.compose.foundation.layout.BoxKt.placeInBox(Box.kt:182)
    	at androidx.compose.foundation.layout.BoxKt.access$placeInBox(Box.kt:1)
    	at androidx.compose.foundation.layout.BoxKt$boxMeasurePolicy$1$measure$5.invoke(Box.kt:163)
    	at androidx.compose.foundation.layout.BoxKt$boxMeasurePolicy$1$measure$5.invoke(Box.kt:159)
    	at androidx.compose.ui.layout.MeasureScope$layout$1.placeChildren(MeasureScope.kt:68)
    	at androidx.compose.ui.node.LayoutNode$layoutChildren$1.invoke(LayoutNode.kt:902)
    	at androidx.compose.ui.node.LayoutNode$layoutChildren$1.invoke(LayoutNode.kt:886)
    	at androidx.compose.runtime.snapshots.Snapshot$Companion.observe(Snapshot.kt:1787)
    	at androidx.compose.runtime.snapshots.SnapshotStateObserver.observeReads(SnapshotStateObserver.kt:116)
    	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(LayoutNode.kt:886)
    	at androidx.compose.ui.node.LayoutNode.onNodePlaced$ui_release(LayoutNode.kt:874)
    	at androidx.compose.ui.node.InnerPlaceable.placeAt-f8xVGno(InnerPlaceable.kt:108)
    	at androidx.compose.ui.layout.Placeable.access$placeAt-f8xVGno(Placeable.kt:31)
    	at androidx.compose.ui.layout.Placeable$PlacementScope.place-70tqf50(Placeable.kt:358)
    	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:791)
    	at androidx.compose.ui.node.MeasureAndLayoutDelegate.measureAndLayout(MeasureAndLayoutDelegate.kt:220)
    	at androidx.compose.ui.platform.AndroidComposeView.measureAndLayout(AndroidComposeView.android.kt:506)
    	at androidx.compose.ui.platform.AndroidComposeView.dispatchDraw(AndroidComposeView.android.kt:655)
    	at android.view.View.draw(View.java:17192)
    	at android.view.View.updateDisplayListIfDirty(View.java:16171)
    	at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3711)
    	at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3691)
    	at android.view.View.updateDisplayListIfDirty(View.java:16134)
    	at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3711)
    	at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3691)
    	at android.view.View.updateDisplayListIfDirty(View.java:16134)
    	at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3711)
    	at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3691)
    	at android.view.View.updateDisplayListIfDirty(View.java:16134)
    	at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3711)
    	at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3691)
    	at android.view.View.updateDisplayListIfDirty(View.java:16134)
    	at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:648)
    	at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:654)
    	at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:762)
    	at android.view.ViewRootImpl.draw(ViewRootImpl.java:2800)
    	at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2608)
    	at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2215)
    	at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1254)
    	at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6344)
    	at android.view.Choreographer$CallbackRecord.run(Choreographer.java:874)
    	at android.view.Choreographer.doCallbacks(Choreographer.java:686)
    	at android.view.Choreographer.doFrame(Choreographer.java:621)
    	at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:860)
    	at android.os.Handler.handleCallback(Handler.java:751)
    	at android.os.Handler.dispatchMessage(Handler.java:95)
    	at android.os.Looper.loop(Looper.java:154)
    	at android.app.ActivityThread.main(ActivityThread.java:6186)
    	at java.lang.reflect.Method.invoke(Native Method)
    	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:889)
    	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:779)
    

    Expected behavior

    The login web page should appear

    opened by joseph-20 5
  • [BUG]

    [BUG] "Unparseable date" error

    Describe the bug For a few days now, the "Unparseable date" error (visible in the first attached screenshot) has been appearing whenever TwidereX is started after clicking on a Twitter URL, making it impossible to view any posts you try to open. If, on the other hand, the tweet is opened directly from the TwidereX timeline, the post is loaded correctly, but the error is still displayed below in place of the various replies.

    To Reproduce Steps to reproduce the behavior:

    Case 1:

    1. Set TwidereX as the default app to oper Twitter links
    2. Click on a tweet URL (like https://twitter.com/Linux/status/936877536780283905)
    3. Notice the "Unparseable date" error

    Case 2:

    1. Open a post in your timeline
    2. Notice the "Unparseable date" error under the tweet, in place of the replies

    Expected behavior The error should not occour

    Screenshots Case 1: Screenshot_20220128-201037

    Case 2: Screenshot_20220128-201136

    Smartphone (please complete the following information):

    • Device: Huawei BAH2-W19
    • OS: Android 8.0.0
    • Variant: F-Droid
    • Version: 1.5.1
    bug 
    opened by Occhioverde 4
  • [BUG] Not all URL previews.

    [BUG] Not all URL previews.

    Describe the bug On the timeline with url previews on not all urls are previewed. Some do preview if you click on the tweet first then go back to your timeline.

    To Reproduce Steps to reproduce the behavior:

    1. Go to timeline
    2. Look for tweets with a url that isnt previewed
    3. Enter into the tweet and it will sometimes preview.
    4. Go back to the timeline and it will stay previewed.

    Expected behavior With the setting url preview on all links should preview.

    Screenshots If applicable, add screenshots to help explain your problem.

    Smartphone (please complete the following information):

    • Device: [e.g. Oneplus 5]
    • OS: [e.g. Android 10]
    • Variant [FDroid]
    • Version [e.g. 1.4.0]

    Additional context Add any other context about the problem here.

    bug 
    opened by justinesmithies 4
  • Twitter Polls are Missing

    Twitter Polls are Missing

    Bug Report

    Twitter polls are missing entirely.

    Environment

    Network type:

    • [ ] Cellular
    • [x] Wi-Fi

    Build Variant

    • [x] Google Play
    • [ ] FDroid

    App version: 1.1.0

    Bug Info

    I get the sense that Twitter may not provide poll data via the API, but if it is possible to at least know that a poll exists somehow so that I may check the web version of the post, that would be a reasonable workaround

    Steps to reproduce

    Find a Tweet with a poll. Look at it on Twidere X

    Actual Behavior

    Polls are missing, tweets missing context for polls become confusing.

    Expected behavior

    Ideally, a fully working poll feature where you may create and consume polls. If possible, at least be able to know a poll is supposed to be there.

    opened by trev-dev 4
  • Error : Too Many Requests?

    Error : Too Many Requests?

    Is TwidereX using the same "license" as regular Twidere? Sorry if this isn't the right word for it - I know that 3rd party twitter developers are often forced to close an app to new users because they hit their token limit, would the multiple requests error be associated with this? I can't post or interact with any tweets due to this issue (I understand it might be time gated, just trying to understand how a beta app is already hitting these limits unless it's connected to a previous application or development license)

    opened by sh0nuff 4
  • Bitwarden doesn't prompt password autofill at twitter login/twidere authentication.

    Bitwarden doesn't prompt password autofill at twitter login/twidere authentication.

    Issue description.

    I'm using bitwarden on mobile, which emulates a screen reader to prompt autofilling of passwords.

    There's something you did with the login dialogue so that it doesn't work with bitwarden. This could be considered an issue for bitwarden, but I'm opening it here anyways. (I'll open it on the bitwarden repo later.)

    Also, the non-X app worked fine with bitwarden, so idk.

    Reproducing:

    • Install bitwarden
    • log in to bitwarden.
    • enable the autofill service and the autofill accessibility service in bitwarden's settings.
    • install twedereX.
    • go to the login page for twedereX and tap the login box.

    Expected:

    When tapping the login box, it should prompt to autofill from bitwarden (even if you have no passwords associated with twitter/twedere.)

    Actual:

    Nothing appears when tapping the box. You must go into bitwarden & copy it manually.

    (I wrote this on my phone, so if the formatting is dogshit, then I apologize for that. I'll fix it later.)

    opened by solonovamax 4
  • Alt attribute on uploaded images

    Alt attribute on uploaded images

    When I add images to a tweet, I have no way to add an alt attribute on them. To tell the truth, even if it's not strictly speaking a bug, it is for me, in a way, a bug. Users with screen readers should be able to access information in the images, in my humble opinion.

    It would be interesting to have, for example, a small insert to add text for the description of the image. If I interpret the following article correctly, the API allows this: https://blog.twitter.com/developer/en_us/a/2016/alt-text-support-for-twitter-cards-and-the-rest-api

    Having said that, I don't know if there are any other reasonable ways to solve this case.

    Thanks in advance

    enhancement 
    opened by KevinGIRAULT 0
  • [BUG] Using Asterisks for Emphasis Causes Tweet to Fail to Send

    [BUG] Using Asterisks for Emphasis Causes Tweet to Fail to Send

    Describe the bug If you put an asterisk on both sides of a word, the tweet will fail to send and an error notification will confirm this. Remove the asterisk and replace it with a dash (minus sign -) on either side of a word or phrase, instead, and the tweet will go through with no issue.

    To Reproduce Described above.

    Smartphone (please complete the following information):

    • Device: Moto G 7 Supra (Power rebrand)
    • OS: Android 9
    • Variant F-Droid
    • Version 1.6.0

    Additional context I have not tested all combinations to confirm how many/few asterisks are deemed acceptable, or in what combination(s).

    bug 
    opened by OkyDooky 0
  • [BUG] Can't Send Video

    [BUG] Can't Send Video

    Describe the bug There are two errors prevebring me from posting videos: the first is that sometimes the media picker will grey out the options record video and pick video files from the file manager (sometimes making a fresh tweet will clear this). If I do manage to add a video file to my message, then I will get a notification with the error "Failed to Tweet" with no more clarification.

    To Reproduce Steps to reproduce the behavior: Described above.

    Expected behavior Pick a video file freely and post it.

    Screenshots I'll post only if my written description is deemed not clear enough.

    Smartphone (please complete the following information):

    • Device: Moto G 7 Supra (Power rebrand)
    • OS: Android 9
    • Variant F-Droid
    • Version 1.6.0
    bug 
    opened by OkyDooky 0
  • Polls

    Polls

    Twitter API v2 has endpoints for polls. Both GET and POST. So I don't see a reason for polls not included. Users should create a poll and vote for polls.

    I think it's forgotten. I also found an issue (#93) that mentions the same issue but it's old and inactive.

    Here's the poll object model: Poll Object Model - Twitter API Data Dictionary

    And all documentation for polls [GET, POST (in tweet object) etc.]: Twitter API - Search Results for Poll

    opened by demirdegerli 0
Releases(1.6.0)
Owner
Twidere Project
Twidere Project
Learn Jetpack Compose for Android by Examples. Learn how to use Jetpack Compose for Android App Development. Android’s modern toolkit for building native UI.

Learn Jetpack Compose for Android by Examples. Learn how to use Jetpack Compose for Android App Development. Android’s modern toolkit for building native UI.

MindOrks 382 Jan 5, 2023
JetFlix - A clone of Android NetFlix app in Android built using Jetpack compose.

JetFlix A clone of Android NetFlix app in Android built using Jetpack compose. This sample app showcases the following: MVVM Architecture (ViewModel +

Pushpal Roy 40 Dec 6, 2022
Android Jetpack is a set of components, tools and guidance to make great Android apps.

Android Jetpack is a set of components, tools and guidance to make great Android apps. They bring together the existing Support Library and Architecture Components and arrange them into four categories.

Atik Faysal 0 Dec 8, 2021
🗺 Android Developer Roadmap 2022 suggests learning paths to understanding Android development.

Android Developer Roadmap 2022 English | 한국어 Android Developer Roadmap 2022 suggests learning paths to understanding Android development. You can read

Jaewoong Eum 5.2k Jan 8, 2023
Split Food Bill is an android application where user can split the expenses based on the number of people joined the trip. This application is developed using Android's Jetpack Compose

SplitFoodBill-Compose Split Food Bill is an android application where user can split the expenses based on the number of people joined the trip. This

Shivaprasad Bhat 1 Jan 17, 2022
Android.compose.squircle - Android LightWeight Squircle Library for JetPack Compose

Android LightWeight Squircle Library for JetPack Compose Usage Based on Compose

Quang Nguyen 9 Jul 5, 2022
Foldable-chat-android - Foldable chat Android demonstrates adaptive and responsive UIs with Jetpack WindowManager API

Foldable Chat Android A foldable chat Android demonstrates adaptive and responsi

Stream 31 Oct 29, 2022
Sunflower - A gardening app illustrating Android development best practices with Android Jetpack

Sunflower - A gardening app illustrating Android development best practices with Android Jetpack

Vinicius Amaral 1 Apr 17, 2022
Fast android task that finished in only 3 hours, it gets the information from national number without database. I just wanna refine my skills in android basics so I try to make this simple project.

RaqmQawmy it is a fast android task that finished in only 3 hours, it gets the information from national number without database. I just wanna refine

Mahmoud Abdelazim 3 May 15, 2022
A LibrePhotos android client written using Jetpack Compose and all the latest Android technologies

UhuruPhotos. A LibrePhotos client UhuruPhotos is an Android client for LibrePhotos written using the latest Android technologies, like Jetpack Compose

Savvas Dalkitsis 190 Jan 3, 2023
🎺 Orchestra is a collection of Android custom view compatible libraries for Jetpack Compose.

Orchestra ?? Jetpack Compose compatible libraries using Balloon, ColorPickerView, PowerSpinner. Balloon Add below codes to your root build.gradle file

Jaewoong Eum 408 Jan 4, 2023
Neumorphism UI on Android with Jetpack Compose.

Neumorphism UI with Jetpack Compose This library is an experimentation with Neumorphism UI (New + Skeuomorphism) on Android with Jetpack Compose. How

Nikhil Chaudhari 260 Jan 5, 2023
Lightweight library to tweak the fling behaviour in Android. This library is only compatible with Jetpack-Compose.

Flinger (Only compatible with compose) What is Flinger? Flinger is a plugin that is made on top of jetpack compose that will help the developer to twe

Joseph James 73 Dec 24, 2022
Jetpack Compose 版本的「玩 Android」

wanandroid-compose Jetpack Compose 版本的「玩 Android」 环境 AndroidStudio: Gradle: 7.0.0-beta02 Kotlin: 1.4.30 Compose: 1.0.0-beta07 功能 登录、注册 等级、排名、积分、收藏 首页、

Chay 32 Dec 26, 2022
A simple 'Slide to Unlock' Material widget for Android, written in Jetpack Compose

SlideTodo A simple 'Slide to Unlock' Material widget for Android, written in Jetpack Compose you can find source code here Getting Started allprojects

Nthily 7 Aug 8, 2022
A Sudoku game for Android & Desktop written with Jetpack Compose Multiplatform

?? Compose Arcade A sample Kotlin Multiplatform Compose Sudoku app for Android & Desktop. Most code is shared between Android & Desktop using Kotlin M

Aaron Oertel 42 Dec 30, 2022
Android browser written by jetpack compose

TS Browser Top secret Browser! Download Features ■ Secret Mode Secret mode is a unique mode in TS browser. The secret mode is designed for browsing se

hinnka 28 Dec 31, 2022
Forget about bunch of XML files for maintaining UIs. Jetpack Compose is Android’s modern toolkit for building native UI. Here is a small example to get started.

Jetpack Compose Sample Description This repository is to get started with new Jetpack Compose Toolkit for Android. By using Jetpack Compose you no nee

Simform Solutions 39 Nov 10, 2022
🚀 Android project template with Compose, MVVM, Hilt and Navigation

compose-android-template An Android project template with MVVM, Hilt, Navigation and Compose ✍️ Author ?? theapache64 Twitter: @theapache64 Email: the

theapache64 55 Jan 3, 2023