Commit Graph

41 Commits

Author SHA1 Message Date
Nik Clayton 8257ded395
refactor: Remove `TabData` type (#576)
`TabData` recorded the type of the timeline the user had added to a tab.
`TimelineKind` is another type that records general information about
configured timelines, with identical properties.

There's no need for both, so remove `TabData` and use `TimelineKind` in
its place.

`TimelineKind` is itself mis-named; it's not just the timeline's kind
but also holds data necessary to display that timeline (e.g., the list
ID if it's a `.UserList`, or the hashtags if it's a `.Hashtags`) so
rename to `Timeline` to better reflect its usage. Move it to a new
`core.model` module.
2024-03-30 23:27:25 +01:00
Nik Clayton 6c970a9742
fix: Keep TabDataJsonAdapter so Moshi can deserialize in release builds (#535) 2024-03-14 20:10:34 +01:00
Nik Clayton dc23ea23d1
refactor: Remove last vestiges of rxJava (#492) 2024-03-03 17:38:32 +01:00
Nik Clayton a3d45ca9ec
refactor: Convert from Gson to Moshi (#428)
Moshi is faster to decode JSON at runtime, is actively maintained, has a
smaller memory and method footprint, and a slightly smaller APK size.
Moshi also correctly creates default constructor arguments instead of
leaving them null, which was a source of `NullPointerExceptions` when
using Gson.

The conversion broadly consisted of:

- Adding `@JsonClass(generateAdapter = true)` to data classes that
marshall to/from JSON.

- Replacing `@SerializedName(value = ...)` with `@Json(name = ...)`.

- Replacing Gson instances with Moshi in Retrofit, Hilt, and tests.

- Using Moshi adapters to marshall to/from JSON instead of Gson `toJson`
/ `fromJson`.

- Deleting `Rfc3339DateJsonAdapter` and related code, and using the
equivalent adapter bundled with Moshi.

- Rewriting `GuardedBooleanAdapter` as a more generic `GuardedAdapter`.

- Deleting unused ProGuard rules; Moshi generates adapters using code
generation, not runtime reflection.

The conversion surfaced some bugs which have been fixed.

- Not all audio attachments have attachment size metadata. Don't show
the attachment preview if the metadata is missing.

- Some `throwable` were not being logged correctly.

- The wrong type was being used when parsing the response when sending a
scheduled status.

- Exceptions other than `HttpException` or `IoException` would also
cause a status to be resent. If there's a JSON error parsing a response
the status would be repeatedly sent.

- In tests strings containing error responses were not valid JSON.

- Workaround Mastodon a bug and ensure `filter.keywords` is populated,
https://github.com/mastodon/mastodon/issues/29142
2024-02-09 12:41:13 +01:00
Nik Clayton 54d7888316
feat: Include extra logs in error reports from orange release builds (#414)
Release builds normally strip out all logging to reduce the number of
disk writes and reduce UI jank.

These logs would still be useful in user error reports from orange
builds. To preseve them:

- Implement a simple `RingBuffer`.

- Create `TreeRing`, a `Timber` `Tree` logger that logs to a
`RingBuffer` instance in orange release builds.

- Create `TreeRingCollector`, called when ACRA reports are generated,
which includes the contents of the ring buffer in the report.

- Enable desugaring to allow the use of java.time libraries on older
Android versions.

- Disable ProGuard obfuscation of class names as the obfuscation adds
additional de-obfuscation steps when handling error reports from users.
2024-02-04 15:17:46 +01:00
Nik Clayton a588c702fb
fix: Prevent crash by keeping network.model.** classes (#369)
Previous rule didn't consider a deeper package hierarchy, so the new
NodeInfo classes were being removed by ProGuard.
2024-01-19 09:39:44 +01:00
Nik Clayton e749b362ca
refactor: Start creating core modules (#286)
The existing code base is a single monolithic module. This is relatively
simple to configure, but many of the tasks to compile the module and
produce the final app have to run in series.

This is unnecessarily slow.

This change starts to split the code in to multiple modules, which are:

- :core:account - AccountManager, to break a dependency cycle
- :core:common - low level types or utilities used in many other modules
- :core:database - database types, DAOs, and DI infrastructure
- :core:network - network types, API definitions, and DI infrastructure
- :core:preferences - shared preferences definitions and DI
infrastructure
- :core:testing - fakes and rules used across different modules

Benchmarking with gradle-profiler shows a ~ 17% reduction in incremental
build times after an ABI change. That will improve further as more code
is moved to modules.

The rough mechanics of the changes are:

- Create the modules, and move existing files in to them. This causes a
  lot of churn in import arguments.

- Convert build.gradle files to build.gradle.kts

- Separate out the data required to display a tab (`TabViewData`) from
  the data required to configure a tab (`TabData`) to avoid circular
  dependencies.

- Abstract the repeated build logic shared between the modules in to
  a set of plugins under `build-logic/`, to simplify configuration of
  the application and library builds.

- Be explicit that some nullable types are non-null at time of use.
  Nullable properties in types imported from modules generally can't be
  smart cast to non-null. There's a detailed discussion of why this
restriction exists at
https://discuss.kotlinlang.org/t/what-is-the-reason-behind-smart-cast-being-impossible-to-perform-when-referenced-class-is-in-another-module/2201.

The changes highlight design problems with the current code, including:

- The main application code is too tightly coupled to the network types
- Too many values are declared unnecessarily nullable
- Dependency cycles between code that make modularisation difficult

Future changes will add more modules.

See #291.
2023-12-04 16:58:36 +01:00
Nik Clayton 1c6c8a7455
fix: Keep network model classes, preventing crash on startup (#251)
Without this the model classes are not retained, which causes a
`ClassCastException` when parsing the new models for the instance v1 and
instance v2 API calls.

Fixes #250
2023-11-13 13:31:31 +01:00
Nik Clayton 1bf13b10f8
refactor: Transition from Tusky to Pachli
- Rename packages to app.pachli.*
- Switch to Pachli icons (blue / orange)
- Reset database schema version to 1
- Reset versionCode to 1 and versionName to "1.0"
- Update colour scheme, use colorPrimary etc through the app
- Use Material UI components for toolbars
- Use "Pachli" in strings (UI, constants, etc)
- Update copyright on code I contributed
- Update README
- Update fastlane metadata
2023-09-05 13:33:37 +02:00
Konrad Pozniak af2727b633
Remove shrinker rules for okhttp (#3560)
Now included automatically in OkHttp.
2023-04-24 12:08:03 +02:00
Goooler 000681c702
Add extra proguard rules for OkHttp (#3350)
* Add extra proguard rules for OkHttp

339732e3a1/okhttp/src/jvmMain/resources/META-INF/proguard/okhttp3.pro (L11-L14)

* Update proguard-rules.pro
2023-02-25 21:40:13 +01:00
Nik Clayton f28252bfd5
Keep all subclasses of PreferenceFragmentCompat (#3162)
* Mark *PreferencesFragment as @Keep

PreferenceFragment references them by string name, which doesn't work after
ProGuard has obfuscated the code in release mode. The name is no longer
valid and the app crashes.

Fixes https://github.com/tuskyapp/Tusky/issues/3161

* Prefer to keep Preference classes with a Proguard rule

Ensures that all PreferenceFragmentCompat are kept, to prevent the risk
that this could break in a new fragment where `@Keep` is accidentally
omitted.
2023-01-13 19:51:42 +01:00
Konrad Pozniak b2f2ca6c22
add shrinker rules to keep bouncycastle EC classes (#2542) 2022-05-19 07:19:16 +02:00
Konrad Pozniak 97fe4f88c5
fix crash in drafts caused by minification of DraftAttachment (#2337)
* fix crash in drafts caused by minification of DraftAttachment

* fix formatting
2022-02-14 19:20:15 +01:00
Konrad Pozniak b145e8163d
add additional R8 rules so conversations work again (#2322) 2022-02-09 20:46:13 +01:00
Konrad Pozniak 0b70f52ad2
add proguard rules to make Jsondadapter annotation work (#2299) 2022-01-21 18:26:57 +01:00
Konrad Pozniak 1586817c3d
Update gradle, kotlin and other dependencies (#2291)
* update gradle, kotlin and other dependencies

* fix new warnings

* remove unused import

* update Proguard rules

* add explicit dependency on Gson to get the newest version

* remove debug flag from proguard rules again

* fix typo
2022-01-20 21:10:32 +01:00
Konrad Pozniak 6281e37aec
improve kotlin related proguard rules (#2190) 2021-06-11 20:50:42 +02:00
Konrad Pozniak 968c4ed3e0
add proguard rule to keep DraftAttachment.Type (#2054) 2021-01-25 16:23:43 +01:00
Konrad Pozniak 1d309850b0
convert EmojiPreference and EmojiCompatFont to Kotlin (#1922)
* convert EmojiPreference and EmojiCompatFont to Kotlin

* move preference related to to dedicated preference package

* update proguard-rules.pro

* reformat & add comment

* maintain disposable information in EmojiPreference instead of EmojiCompatFont
2020-09-02 12:27:51 +02:00
Konrad Pozniak ce779bcdba
cleanup proguard rules (#1819) 2020-06-04 20:17:07 +02:00
Frieder Bluemle 9bc000569d
Update espresso-core to 3.2.0 2020-02-01 11:14:31 -08:00
Konrad Pozniak d8f7845be5
fix r8 rules to avoid crash when downloading Emoji Font (#1312) 2019-06-09 16:56:34 +02:00
pandasoft0 76ce28980c Migrate to Glide (#1175)
* Replace Picasso library with Glide library tuskyapp#1082

* Replace Picasso library with Glide library tuskyapp#1082

* Update load emoji with glide

* Update context used for Glide

* Removed unused import

* Replace deprecated SimpleTarget with CustomTarget

* Fix crash at the view image fragment, remove override image size

* Replace Single.create with Single.fromCallable

* View image fragment refactor

* Fix after merge

* Try to load cached image first and show progress view on failure

* Try to load cached image first and show progress view on failure
2019-04-16 21:39:12 +02:00
Conny Duck 71fb4db915 fix proguard issue 2019-01-15 20:53:38 +01:00
Conny Duck e054edc69d remove more Kotlin null check methods from release bytecode 2018-12-17 23:36:59 +01:00
Conny Duck dd8d2131f7 update proguard rules for okhttp 2018-12-17 16:01:35 +01:00
Konrad Pozniak 418c76d677
add more aggressive proguard config (#741)
* add more aggressive proguard config

* even more optimizations
2018-08-15 20:46:37 +02:00
Ivan Kupalov a5cffe0fea Add Dagger (#554)
* Add Dagger DI

* Preemptively fix tests

* Add missing licenses

* DI fixes

* ci fixes
2018-03-27 19:47:00 +02:00
Conny Duck d4d764ab2d fix production build after upgrading okhttp 2018-03-08 23:04:04 +01:00
Conny Duck c2c607270a improve proguard configuration 2018-03-01 19:01:44 +01:00
Ivan Kupalov df4dfa7766 Stop adding link info when composing toot (#418) 2017-10-27 13:19:12 +02:00
Conny Duck 3729cd9c19 fix proguard config for new libraries 2017-08-11 19:19:35 +02:00
Vavassor bb0ea876fa Okay, toss BouncyCastleProvider so we can release a beta. 2017-07-18 00:30:24 -04:00
Vavassor 857f39b480 Widens proguard to just keep everything under org.bouncycastle when minifying. Also fixes a bug where the composer's content warning is hidden after changing orientation. 2017-07-17 00:06:48 -04:00
Vavassor f4d627e815 Release 1.1.4-beta.6 2017-07-16 18:26:56 -04:00
Vavassor 6e67db7631 Release 1.1.4-beta.5 2017-07-15 03:56:22 -04:00
torrentcome ea649dc851 (proguard) add forgoten rule for jsoup in release 2017-06-08 14:39:48 +02:00
Conny Duck 1a39e58d3c remove unnecessary Log utility class, replace Exception.printStackTrace with logging 2017-05-23 21:34:31 +02:00
Konrad Pozniak d23d12aa9c added proguard config 2017-04-08 00:08:51 +02:00
Vavassor bba1b37fd8 initial commit 2017-01-02 18:30:27 -05:00