{"payload":{"feedbackUrl":"https://github.com/orgs/community/discussions/53140","repo":{"id":77868163,"defaultBranch":"develop","name":"Tusky","ownerLogin":"tuskyapp","currentUserCanPush":false,"isFork":false,"isEmpty":false,"createdAt":"2017-01-02T23:20:55.000Z","ownerAvatar":"https://avatars.githubusercontent.com/u/36388208?v=4","public":true,"private":false,"isOrgOwned":true},"refInfo":{"name":"","listCacheKey":"v0:1717347599.0","currentOid":""},"activityList":{"items":[{"before":"5d96cf5850688460cbddb8d0e834fecbae276fa3","after":"731dd101a8f833336aa9312ef24936286a2a8e78","ref":"refs/heads/remove-fab-hide","pushedAt":"2024-06-02T17:02:47.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"connyduck","name":"Konrad Pozniak","path":"/connyduck","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/10157047?s=80&v=4"},"commit":{"message":"remove string","shortMessageHtmlLink":"remove string"}},{"before":null,"after":"5d96cf5850688460cbddb8d0e834fecbae276fa3","ref":"refs/heads/remove-fab-hide","pushedAt":"2024-06-02T16:59:59.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"connyduck","name":"Konrad Pozniak","path":"/connyduck","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/10157047?s=80&v=4"},"commit":{"message":"add bottom padding to recyclerviews","shortMessageHtmlLink":"add bottom padding to recyclerviews"}},{"before":"ebcee8e13a911d50040f425e00fd262d586652a8","after":null,"ref":"refs/heads/new-span-highlighting","pushedAt":"2024-06-02T14:32:58.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"connyduck","name":"Konrad Pozniak","path":"/connyduck","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/10157047?s=80&v=4"}},{"before":"e05ded2e326b5dace93f799ba3abacebb6c8c0ac","after":"8aaca3bb2c0c7656ccfcd74d4805f8b4f1d214f1","ref":"refs/heads/develop","pushedAt":"2024-06-02T14:32:58.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"connyduck","name":"Konrad Pozniak","path":"/connyduck","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/10157047?s=80&v=4"},"commit":{"message":"improve span highlighting (#4480)\n\nAt first I thought simply changing the regex might help, but then I\r\nfound more and more differences between Mastodon and Tusky, so I decided\r\nto reimplement the thing. I added 74 testcases that I all compared to\r\nMastodon to make sure they are correct.\r\n\r\nOn an Fairphone 4 the new implementation is faster, on an Samsung Galaxy\r\nTab S3 slower.\r\n\r\nTestcases for the benchmark:\r\n```\r\ntest of a status with #one hashtag http\r\n```\r\n```\r\ntest\r\nhttp:// #hashtag https://connyduck.at/\r\nhttp://example.org\r\nthis is a #test\r\nand this is a @mention@test.com @test @test@test456@test.com\r\n```\r\n```\r\n@mention@test.social Just your ordinary mention with a hashtag\r\n#test\r\n```\r\n```\r\n@mention@test.social Just your ordinary mention with a url\r\nhttps://riot.im/app/#/room/#Tusky:matrix.org\r\n```\r\n\r\n\r\n\r\nFP4:\r\n```\r\n 11.159 ns 15 allocs Benchmark.new_1\r\n 119.701 ns 43 allocs Benchmark.new_2\r\n 21.895 ns 24 allocs Benchmark.new_3\r\n 87.512 ns 32 allocs Benchmark.new_4\r\n\r\n 16.592 ns 46 allocs Benchmark.old_1\r\n 134.381 ns 169 allocs Benchmark.old_2\r\n 28.355 ns 68 allocs Benchmark.old_3\r\n 45.221 ns 77 allocs Benchmark.old_4\r\n```\r\n\r\nSGT3:\r\n```\r\n 43,785 ns 18 allocs Benchmark.new_1\r\n 446,074 ns 43 allocs Benchmark.new_2\r\n 78,802 ns 26 allocs Benchmark.new_3\r\n 315,478 ns 32 allocs Benchmark.new_4\r\n\r\n 42,186 ns 45 allocs Benchmark.old_1\r\n 353,570 ns 157 allocs Benchmark.old_2\r\n 72,376 ns 66 allocs Benchmark.old_3\r\n 122,985 ns 74 allocs Benchmark.old_4\r\n```\r\n\r\n\r\nbenchmark code is here: https://github.com/tuskyapp/tusky-span-benchmark\r\n\r\ncloses https://github.com/tuskyapp/Tusky/issues/4425","shortMessageHtmlLink":"improve span highlighting (#4480)"}},{"before":"6b32e72e196826720a9e4cd9d8dc6d41a7f4f911","after":"e05ded2e326b5dace93f799ba3abacebb6c8c0ac","ref":"refs/heads/develop","pushedAt":"2024-06-02T13:00:41.000Z","pushType":"pr_merge","commitsCount":4,"pusher":{"login":"connyduck","name":"Konrad Pozniak","path":"/connyduck","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/10157047?s=80&v=4"},"commit":{"message":"Translations update from Weblate (#4473)\n\nTranslations update from [Weblate](https://weblate.tusky.app) for\r\n[Tusky/Tusky](https://weblate.tusky.app/projects/tusky/tusky/).\r\n\r\n\r\n\r\nCurrent translation status:\r\n\r\n![Weblate translation\r\nstatus](https://weblate.tusky.app/widget/tusky/tusky/horizontal-auto.svg)","shortMessageHtmlLink":"Translations update from Weblate (#4473)"}},{"before":null,"after":"43dde486b811a508368d6fef7ab04682545006d0","ref":"refs/heads/fix-compose-close-dialog","pushedAt":"2024-06-02T11:14:29.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"connyduck","name":"Konrad Pozniak","path":"/connyduck","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/10157047?s=80&v=4"},"commit":{"message":"correctly set currentContent in ComposeViewModel.setup","shortMessageHtmlLink":"correctly set currentContent in ComposeViewModel.setup"}},{"before":"5fc130dc61b1c28f8485e911fcaa5d461bb8c120","after":null,"ref":"refs/heads/renovate/gradle-8.x","pushedAt":"2024-06-01T11:53:29.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"connyduck","name":"Konrad Pozniak","path":"/connyduck","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/10157047?s=80&v=4"}},{"before":"b262b6cb9b2da3fa204ac9b837e42e4fd6015c21","after":"6b32e72e196826720a9e4cd9d8dc6d41a7f4f911","ref":"refs/heads/develop","pushedAt":"2024-06-01T11:53:28.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"connyduck","name":"Konrad Pozniak","path":"/connyduck","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/10157047?s=80&v=4"},"commit":{"message":"Update dependency gradle to v8.8 (#4483)\n\n[![Mend\r\nRenovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)\r\n\r\nThis PR contains the following updates:\r\n\r\n| Package | Update | Change |\r\n|---|---|---|\r\n| [gradle](https://gradle.org)\r\n([source](https://togithub.com/gradle/gradle)) | minor | `8.7` -> `8.8`\r\n|\r\n\r\n---\r\n\r\n### Release Notes\r\n\r\n
\r\ngradle/gradle (gradle)\r\n\r\n### [`v8.8`](https://togithub.com/gradle/gradle/compare/v8.7.0...v8.8.0)\r\n\r\n[Compare\r\nSource](https://togithub.com/gradle/gradle/compare/v8.7.0...v8.8.0)\r\n\r\n
\r\n\r\n---\r\n\r\n### Configuration\r\n\r\n📅 **Schedule**: Branch creation - At any time (no schedule defined),\r\nAutomerge - At any time (no schedule defined).\r\n\r\n🚦 **Automerge**: Disabled by config. Please merge this manually once you\r\nare satisfied.\r\n\r\n♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the\r\nrebase/retry checkbox.\r\n\r\n🔕 **Ignore**: Close this PR and you won't be reminded about this update\r\nagain.\r\n\r\n---\r\n\r\n- [ ] If you want to rebase/retry this PR, check\r\nthis box\r\n\r\n---\r\n\r\nThis PR has been generated by [Mend\r\nRenovate](https://www.mend.io/free-developer-tools/renovate/). View\r\nrepository job log\r\n[here](https://developer.mend.io/github/tuskyapp/Tusky).\r\n\r\n\r\n\r\nCo-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>","shortMessageHtmlLink":"Update dependency gradle to v8.8 (#4483)"}},{"before":null,"after":"5fc130dc61b1c28f8485e911fcaa5d461bb8c120","ref":"refs/heads/renovate/gradle-8.x","pushedAt":"2024-05-31T22:23:10.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"renovate[bot]","name":null,"path":"/apps/renovate","primaryAvatarUrl":"https://avatars.githubusercontent.com/in/2740?s=80&v=4"},"commit":{"message":"Update dependency gradle to v8.8","shortMessageHtmlLink":"Update dependency gradle to v8.8"}},{"before":"d58f1bd9cc34ef023384b5044f0b5907d70e90c0","after":"5756fc731004c80324ef6c112ae3ef52886c6390","ref":"refs/heads/renovate/major-material.drawer","pushedAt":"2024-05-31T12:50:04.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"renovate[bot]","name":null,"path":"/apps/renovate","primaryAvatarUrl":"https://avatars.githubusercontent.com/in/2740?s=80&v=4"},"commit":{"message":"Update material.drawer to v9","shortMessageHtmlLink":"Update material.drawer to v9"}},{"before":"be21b40410f9e5e3b0f03a71665e844420db63ee","after":null,"ref":"refs/heads/fix-ktlint","pushedAt":"2024-05-31T12:49:21.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"connyduck","name":"Konrad Pozniak","path":"/connyduck","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/10157047?s=80&v=4"}},{"before":"16fbbc6bf6fbf7589dd487d5ec5daa98d6f49421","after":"b262b6cb9b2da3fa204ac9b837e42e4fd6015c21","ref":"refs/heads/develop","pushedAt":"2024-05-31T12:49:20.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"connyduck","name":"Konrad Pozniak","path":"/connyduck","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/10157047?s=80&v=4"},"commit":{"message":"remove unused import (#4482)\n\nthis slipped in somehow","shortMessageHtmlLink":"remove unused import (#4482)"}},{"before":null,"after":"be21b40410f9e5e3b0f03a71665e844420db63ee","ref":"refs/heads/fix-ktlint","pushedAt":"2024-05-31T12:31:40.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"connyduck","name":"Konrad Pozniak","path":"/connyduck","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/10157047?s=80&v=4"},"commit":{"message":"remove unused import","shortMessageHtmlLink":"remove unused import"}},{"before":"c62d91a14f2cc5f9c7f373a5b0e2a56a1c745a33","after":null,"ref":"refs/heads/duplicate-notification-filter-option","pushedAt":"2024-05-31T11:44:26.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"connyduck","name":"Konrad Pozniak","path":"/connyduck","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/10157047?s=80&v=4"}},{"before":"f10ad7482c70c0e20db29ddb605ed612061b03f5","after":"16fbbc6bf6fbf7589dd487d5ec5daa98d6f49421","ref":"refs/heads/develop","pushedAt":"2024-05-31T11:44:25.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"connyduck","name":"Konrad Pozniak","path":"/connyduck","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/10157047?s=80&v=4"},"commit":{"message":"remove duplicate SHOW_NOTIFICATIONS_FILTER option (#4481)\n\nThe option was removed in https://github.com/tuskyapp/Tusky/pull/3877,\r\nthen forgotten to be added again in\r\nhttps://github.com/tuskyapp/Tusky/pull/4015.\r\nhttps://github.com/tuskyapp/Tusky/pull/4026 added it again, but took to\r\nlong to merge, so we made https://github.com/tuskyapp/Tusky/pull/4225 as\r\nwell and that is how we ended up with the option twice.","shortMessageHtmlLink":"remove duplicate SHOW_NOTIFICATIONS_FILTER option (#4481)"}},{"before":"df24e461daf3f4f6974aa29aacfd1eb1179c3bfa","after":null,"ref":"refs/heads/renovate/material.typeface","pushedAt":"2024-05-31T11:44:14.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"connyduck","name":"Konrad Pozniak","path":"/connyduck","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/10157047?s=80&v=4"}},{"before":"494f5d9a8b781d725b5e0e338a1087fe7400c90e","after":"f10ad7482c70c0e20db29ddb605ed612061b03f5","ref":"refs/heads/develop","pushedAt":"2024-05-31T11:44:13.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"connyduck","name":"Konrad Pozniak","path":"/connyduck","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/10157047?s=80&v=4"},"commit":{"message":"Update dependency com.mikepenz:google-material-typeface to v4.0.0.3-kotlin (#4479)\n\n[![Mend\r\nRenovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)\r\n\r\nThis PR contains the following updates:\r\n\r\n| Package | Change | Age | Adoption | Passing | Confidence |\r\n|---|---|---|---|---|---|\r\n|\r\n[com.mikepenz:google-material-typeface](https://togithub.com/mikepenz/Android-Iconics)\r\n| `4.0.0.2-kotlin` -> `4.0.0.3-kotlin` |\r\n[![age](https://developer.mend.io/api/mc/badges/age/maven/com.mikepenz:google-material-typeface/4.0.0.3-kotlin?slim=true)](https://docs.renovatebot.com/merge-confidence/)\r\n|\r\n[![adoption](https://developer.mend.io/api/mc/badges/adoption/maven/com.mikepenz:google-material-typeface/4.0.0.3-kotlin?slim=true)](https://docs.renovatebot.com/merge-confidence/)\r\n|\r\n[![passing](https://developer.mend.io/api/mc/badges/compatibility/maven/com.mikepenz:google-material-typeface/4.0.0.2-kotlin/4.0.0.3-kotlin?slim=true)](https://docs.renovatebot.com/merge-confidence/)\r\n|\r\n[![confidence](https://developer.mend.io/api/mc/badges/confidence/maven/com.mikepenz:google-material-typeface/4.0.0.2-kotlin/4.0.0.3-kotlin?slim=true)](https://docs.renovatebot.com/merge-confidence/)\r\n|\r\n\r\n---\r\n\r\n### Configuration\r\n\r\n📅 **Schedule**: Branch creation - At any time (no schedule defined),\r\nAutomerge - At any time (no schedule defined).\r\n\r\n🚦 **Automerge**: Disabled by config. Please merge this manually once you\r\nare satisfied.\r\n\r\n♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the\r\nrebase/retry checkbox.\r\n\r\n🔕 **Ignore**: Close this PR and you won't be reminded about this update\r\nagain.\r\n\r\n---\r\n\r\n- [ ] If you want to rebase/retry this PR, check\r\nthis box\r\n\r\n---\r\n\r\nThis PR has been generated by [Mend\r\nRenovate](https://www.mend.io/free-developer-tools/renovate/). View\r\nrepository job log\r\n[here](https://developer.mend.io/github/tuskyapp/Tusky).\r\n\r\n\r\n\r\nCo-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>","shortMessageHtmlLink":"Update dependency com.mikepenz:google-material-typeface to v4.0.0.3-k…"}},{"before":"c9a6e50ace8d4df54b8222238fff588687e8fe57","after":"494f5d9a8b781d725b5e0e338a1087fe7400c90e","ref":"refs/heads/develop","pushedAt":"2024-05-31T11:44:03.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"connyduck","name":"Konrad Pozniak","path":"/connyduck","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/10157047?s=80&v=4"},"commit":{"message":"Update dependency androidx.appcompat:appcompat to v1.7.0 (#4478)\n\n[![Mend\r\nRenovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)\r\n\r\nThis PR contains the following updates:\r\n\r\n| Package | Change | Age | Adoption | Passing | Confidence |\r\n|---|---|---|---|---|---|\r\n|\r\n[androidx.appcompat:appcompat](https://developer.android.com/jetpack/androidx/releases/appcompat#1.7.0)\r\n([source](https://cs.android.com/androidx/platform/frameworks/support))\r\n| `1.6.1` -> `1.7.0` |\r\n[![age](https://developer.mend.io/api/mc/badges/age/maven/androidx.appcompat:appcompat/1.7.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)\r\n|\r\n[![adoption](https://developer.mend.io/api/mc/badges/adoption/maven/androidx.appcompat:appcompat/1.7.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)\r\n|\r\n[![passing](https://developer.mend.io/api/mc/badges/compatibility/maven/androidx.appcompat:appcompat/1.6.1/1.7.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)\r\n|\r\n[![confidence](https://developer.mend.io/api/mc/badges/confidence/maven/androidx.appcompat:appcompat/1.6.1/1.7.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)\r\n|\r\n\r\n---\r\n\r\n### Configuration\r\n\r\n📅 **Schedule**: Branch creation - At any time (no schedule defined),\r\nAutomerge - At any time (no schedule defined).\r\n\r\n🚦 **Automerge**: Disabled by config. Please merge this manually once you\r\nare satisfied.\r\n\r\n♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the\r\nrebase/retry checkbox.\r\n\r\n🔕 **Ignore**: Close this PR and you won't be reminded about this update\r\nagain.\r\n\r\n---\r\n\r\n- [ ] If you want to rebase/retry this PR, check\r\nthis box\r\n\r\n---\r\n\r\nThis PR has been generated by [Mend\r\nRenovate](https://www.mend.io/free-developer-tools/renovate/). View\r\nrepository job log\r\n[here](https://developer.mend.io/github/tuskyapp/Tusky).\r\n\r\n\r\n\r\nCo-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>","shortMessageHtmlLink":"Update dependency androidx.appcompat:appcompat to v1.7.0 (#4478)"}},{"before":"602c396b083817c2729f7347ab792194673ef265","after":null,"ref":"refs/heads/renovate/androidx.appcompat","pushedAt":"2024-05-31T11:44:03.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"connyduck","name":"Konrad Pozniak","path":"/connyduck","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/10157047?s=80&v=4"}},{"before":"f14a82325db602378302c07f79cf651fc6ca3796","after":"c9a6e50ace8d4df54b8222238fff588687e8fe57","ref":"refs/heads/develop","pushedAt":"2024-05-31T11:43:54.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"connyduck","name":"Konrad Pozniak","path":"/connyduck","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/10157047?s=80&v=4"},"commit":{"message":"Update dependency androidx.lifecycle:lifecycle-viewmodel-ktx to v2.8.1 (#4477)\n\n[![Mend\r\nRenovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)\r\n\r\nThis PR contains the following updates:\r\n\r\n| Package | Change | Age | Adoption | Passing | Confidence |\r\n|---|---|---|---|---|---|\r\n|\r\n[androidx.lifecycle:lifecycle-viewmodel-ktx](https://developer.android.com/jetpack/androidx/releases/lifecycle#2.8.1)\r\n([source](https://cs.android.com/androidx/platform/frameworks/support))\r\n| `2.8.0` -> `2.8.1` |\r\n[![age](https://developer.mend.io/api/mc/badges/age/maven/androidx.lifecycle:lifecycle-viewmodel-ktx/2.8.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)\r\n|\r\n[![adoption](https://developer.mend.io/api/mc/badges/adoption/maven/androidx.lifecycle:lifecycle-viewmodel-ktx/2.8.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)\r\n|\r\n[![passing](https://developer.mend.io/api/mc/badges/compatibility/maven/androidx.lifecycle:lifecycle-viewmodel-ktx/2.8.0/2.8.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)\r\n|\r\n[![confidence](https://developer.mend.io/api/mc/badges/confidence/maven/androidx.lifecycle:lifecycle-viewmodel-ktx/2.8.0/2.8.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)\r\n|\r\n\r\n---\r\n\r\n### Configuration\r\n\r\n📅 **Schedule**: Branch creation - At any time (no schedule defined),\r\nAutomerge - At any time (no schedule defined).\r\n\r\n🚦 **Automerge**: Disabled by config. Please merge this manually once you\r\nare satisfied.\r\n\r\n♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the\r\nrebase/retry checkbox.\r\n\r\n🔕 **Ignore**: Close this PR and you won't be reminded about this update\r\nagain.\r\n\r\n---\r\n\r\n- [ ] If you want to rebase/retry this PR, check\r\nthis box\r\n\r\n---\r\n\r\nThis PR has been generated by [Mend\r\nRenovate](https://www.mend.io/free-developer-tools/renovate/). View\r\nrepository job log\r\n[here](https://developer.mend.io/github/tuskyapp/Tusky).\r\n\r\n\r\n\r\nCo-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>","shortMessageHtmlLink":"Update dependency androidx.lifecycle:lifecycle-viewmodel-ktx to v2.8.1 ("}},{"before":"e95590a041cf4e27b99c8d8357dc4648d3820e66","after":null,"ref":"refs/heads/renovate/androidx.lifecycle","pushedAt":"2024-05-31T11:43:54.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"connyduck","name":"Konrad Pozniak","path":"/connyduck","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/10157047?s=80&v=4"}},{"before":"7e1e59a25fd32038df6e01e0753b68614fd750e3","after":null,"ref":"refs/heads/followed-hashtags-view-improvements","pushedAt":"2024-05-31T11:43:42.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"connyduck","name":"Konrad Pozniak","path":"/connyduck","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/10157047?s=80&v=4"}},{"before":"b2d4092124bf132b47b4ad1d8cf777ce7ee5132b","after":"f14a82325db602378302c07f79cf651fc6ca3796","ref":"refs/heads/develop","pushedAt":"2024-05-31T11:43:42.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"connyduck","name":"Konrad Pozniak","path":"/connyduck","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/10157047?s=80&v=4"},"commit":{"message":"Followed hashtags view improvements (#4475)\n\nAdd click and longpress handler to the followed hashtags view\r\n\r\n#4459","shortMessageHtmlLink":"Followed hashtags view improvements (#4475)"}},{"before":"c003ec55c2feaabc3b3e7212ad0677eb2d9da749","after":null,"ref":"refs/heads/fix-bot-badge-on-accounts-in-list-fragment","pushedAt":"2024-05-31T11:42:38.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"connyduck","name":"Konrad Pozniak","path":"/connyduck","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/10157047?s=80&v=4"}},{"before":"d200d1e15e6ca27e4567c21f56becdc5b08dd670","after":"b2d4092124bf132b47b4ad1d8cf777ce7ee5132b","ref":"refs/heads/develop","pushedAt":"2024-05-31T11:42:37.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"connyduck","name":"Konrad Pozniak","path":"/connyduck","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/10157047?s=80&v=4"},"commit":{"message":"Fix bot badge in accounts in list fragment (#4474)\n\nFixes #4455","shortMessageHtmlLink":"Fix bot badge in accounts in list fragment (#4474)"}},{"before":"0483440381383672998ec495c39b7564b7761383","after":"d200d1e15e6ca27e4567c21f56becdc5b08dd670","ref":"refs/heads/develop","pushedAt":"2024-05-31T11:42:21.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"connyduck","name":"Konrad Pozniak","path":"/connyduck","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/10157047?s=80&v=4"},"commit":{"message":"Prevent parallel loading and fix duplicate ViewModel state collection in FiltersActivity (#4472)\n\nThis pull request fixes the following issues:\r\n\r\n- `FiltersActivity` launches a new coroutine to collect the ViewModel\r\nstate every time the Activity is resumed, without cancelling the\r\nprevious coroutine.\r\n- `FiltersActivity` reloads the filters in `onResume()`, even if loading\r\nis already in progress (without cancelling the current loading). This\r\ncan lead to inconsistent state.\r\n\r\nList of improvements:\r\n- Implement `launchAndRepeatOnLifecycle()` to combine\r\n`coroutineScope.launch()` with `repeatOnLifecycle()` for the same\r\n`Lifecycle`. Use it in `FiltersActivity` to update the view only when\r\nthe Activity is visible.\r\n- Optimize the filters loading: load them when `FiltersViewModel` is\r\ncreated and when returning from `EditFilterActivity` (when receiving the\r\nActivity result). Cancel the load already in progress, if any.\r\n- use `MutableStateFlow.update()` to update the state in a thread-safe\r\nway.\r\n- Turn `FiltersViewModel.deleteFilter()` into a suspending function in\r\norder to perform the update in the coroutinescope of the Activity\r\nlifecycle, so the View passed as argument doesn't leak.\r\n- Wait for an ongoing load operation to complete before performing a\r\ndelete filter operation, so the state stays consistent.\r\n- Add `Intent.withSlideInAnimation()` as a simpler and more flexible\r\nalternative to `Activity.startActivityWithSlideInAnimation(Intent)`.","shortMessageHtmlLink":"Prevent parallel loading and fix duplicate ViewModel state collection…"}},{"before":"83403ebb581a6386c1a98a1c9a14a78ed301b062","after":"0483440381383672998ec495c39b7564b7761383","ref":"refs/heads/develop","pushedAt":"2024-05-31T11:41:22.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"connyduck","name":"Konrad Pozniak","path":"/connyduck","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/10157047?s=80&v=4"},"commit":{"message":"fix timeline jumping (#4471)\n\nTwo things changed here:\r\n\r\nThe check for `positionStart`only in `onItemRangeInserted` is not always\r\ncorrect - we only want to jump up when something is inserted at the top,\r\nif we already are at the top.\r\n\r\n`enablePlaceholders = false` has unintended side effects - the\r\nrecyclerview adapter sometimes receives an \"onItemRangeRemoved\" followed\r\nby an \"onItemRangeInserted\", instead of just \"onItemRangeChanged\".\r\n\r\nTogether they should make sure the timelines stay were they are.","shortMessageHtmlLink":"fix timeline jumping (#4471)"}},{"before":"6b852ffba0549a9ad6fab9a60137684068fe531c","after":null,"ref":"refs/heads/fix-timeline-jumping-bug","pushedAt":"2024-05-31T11:41:22.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"connyduck","name":"Konrad Pozniak","path":"/connyduck","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/10157047?s=80&v=4"}},{"before":"59184f1717ca7e6521f1a86934a152de15f86608","after":"83403ebb581a6386c1a98a1c9a14a78ed301b062","ref":"refs/heads/develop","pushedAt":"2024-05-31T11:28:01.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"connyduck","name":"Konrad Pozniak","path":"/connyduck","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/10157047?s=80&v=4"},"commit":{"message":"Clear View-related references in Fragments and use viewLifecycleOwner when applicable (#4470)\n\nThis pull request has main 2 goals related to improving the handling of\r\nView lifecycles in Fragments:\r\n\r\n- **Use viewLifecycleOwner when applicable**: every coroutine touching\r\nViews in Fragments must be launched in the `coroutinescope` of\r\n`viewLifecycleOwner` to avoid the following issues:\r\n1. The code will crash if it references a View binding that is no more\r\navailable and keeps running after the Fragment view hierarchy has been\r\ndestroyed.\r\n2. The code will leak Views if it references Views from its parent scope\r\nafter the Fragment view hierarchy has been destroyed.\r\n3. Multiple instances of the same coroutine will run at the same time,\r\nif the coroutine is launched in `onViewCreated()` from the wrong scope\r\nand the view hierarchy is destroyed then re-created in the same Fragment\r\ninstance.\r\n- **Clear View-related references in Fragments**: it is an error to keep\r\na reference to Views or any other class containing View references in\r\nFragments after `onDestroyView()`. It creates a memory leak when the\r\nFragment is added to the back stack or is temporarily detached. A\r\ntypical object that leaks Views is a RecyclerView's Adapter: when the\r\nadapter is set on the RecyclerView, the RecyclerView registers itself as\r\na listener to the Adapter and the Adapter now contains a reference to\r\nthe RecyclerView that is not automatically cleared. It is thus\r\nrecommended to clear all these view references one way or another, even\r\nif the Fragment is currently not part of a scenario where it is detached\r\nor added to a back stack.\r\n\r\nIn general, having a `lateinit var` not related to Dagger dependency\r\ninjection in a Fragment is a code smell and should be avoided:\r\n- If that `lateinit var` is related to storing something View-related,\r\nit must be removed if possible or made nullable and set to `null` in\r\n`onDestroyView()`.\r\n- If that `lateinit var` is meant to store fragment arguments, it can be\r\nturned into a `val by lazy{}`.\r\n- If that `lateinit var` is related to fetching some information from\r\nthe Activity, it can be turned into a `val` with no backing field that\r\nwill simply call the activity when accessed. There is no need to store\r\nthe value in the Fragment.\r\n\r\nWhen possible, View-related values must not be stored as Fragment\r\nfields: all views should be accessed only in `onViewCreated()` and\r\npassed as arguments to various listeners down the chain.\r\n\r\nHowever, it's still required to use nullable fields **when the Fragment\r\nexposes public methods that are called directly by an external entity**,\r\nand these methods use the View-related value. Since the Fragment has no\r\ncontrol over when the external entity will call these public methods,\r\nthe field must never assumed to be non-null and null checks must be\r\nadded for every call. Note that exposing public methods on a Fragment to\r\nbe called directly is an antipattern, but switching to a different\r\narchitecture is out of scope of this pull request.\r\n\r\n- Use `viewLifecycleOwner` in Fragments where applicable.\r\n- Remove view-related fields and instead declare them in\r\n`onViewCreated()` when possible.\r\n- When not possible, declare view-related fields as nullable and set\r\nthem to `null` in `onDestroyView()`.\r\n- Pass non-null View-related fields as arguments when possible, to not\r\nrely on the nullable Fragment field.\r\n- Replace `lateinit var` containing an Activity-related value with `val`\r\naccessing the Activity directly on demand.\r\n- Remove some unused fragment fields.\r\n- Replace `onCreateView()` with passing the layout id as Fragment\r\nconstructor argument when possible.\r\n- Replace `isAdded` checks with `view != null`. A Fragment being added\r\nto an Activity doesn't mean it has a View hierarchy (it may be detached\r\nand invisible).\r\n- Remove `mediaPlayerListener` field in `ViewVideoFragment` and turn it\r\ninto a local variable. It is then passed into a\r\n`DefaultLifecycleObserver` that replaces the `onStart()`/`onStop()`\r\noverrides and is unregistered automatically when the view hierarchy is\r\ndestroyed.","shortMessageHtmlLink":"Clear View-related references in Fragments and use viewLifecycleOwner…"}},{"before":"c668cdc633f4d515df19e496565e1385c2bd43b3","after":"59184f1717ca7e6521f1a86934a152de15f86608","ref":"refs/heads/develop","pushedAt":"2024-05-31T11:23:06.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"connyduck","name":"Konrad Pozniak","path":"/connyduck","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/10157047?s=80&v=4"},"commit":{"message":"Fix incorrect theme override outside of MainActivity (#4469)\n\nThe pull request to integrate the SplashScreen library (#4413) required\r\noverriding the theme before setting the layout in\r\n`MainActivity.onCreate()`, in order to switch from `SplashTheme` to\r\n`TuskyTheme`. Since the parent `BaseActivity` already contained code to\r\noverride the theme in case the user selects the \"black\" theme, that\r\nlogic was added at the same spot in `BaseActivity`.\r\n\r\nHowever, since other Activities inherit from `BaseActivity` and\r\nsometimes declare a different default theme than `TuskyTheme` in the\r\nManifest, the wrong theme was set for those Activities when not in Black\r\ntheme mode.\r\n\r\nThis pull request ensures that the theme will only be overridden to\r\n`TuskyTheme` in `MainActivity`, the only Activity that uses a splash\r\nscreen.","shortMessageHtmlLink":"Fix incorrect theme override outside of MainActivity (#4469)"}}],"hasNextPage":true,"hasPreviousPage":false,"activityType":"all","actor":null,"timePeriod":"all","sort":"DESC","perPage":30,"cursor":"djE6ks8AAAAEWkUa0gA","startCursor":null,"endCursor":null}},"title":"Activity · tuskyapp/Tusky"}