Use AndroidX and framework per-app locale APIs, migrate the existing language preference, and expose the generated locale config to Android 13+ settings.
Resolve resources through the selected app locale in application, ViewModel, tile, and service contexts. Replace the framework OK and Cancel labels directly implicated in the wrong-language report, and refresh retained localized UI state after locale changes.
- Remove `appIcon: Drawable` from `AppInfo` to significantly reduce memory footprint and prevent OOM.
- Replace synchronous icon loading in `AppManagerUtil` with on-demand asynchronous loading.
- Implement custom `AppIconFetcher` using `appicon:` URI scheme for system icon retrieval.
- Use localized `fetcherFactory` in `AppListItem` to keep loading logic isolated and minimize global side effects.
- Improve app list scanning speed by skipping icon extraction during initial load.
* add composeui dependencies and component
* remove multidex
* BaseComponentActivity and HelperBaseComponentActivity
* migrate AppPicker/PerAppProxy Activity and use Snackbar
* migrate AboutActivity to composeui
* migrate BackupActivity to composeui
* migrate CheckUpdateActivity to composeui
* migrate Logcat to composeui
* migrate Scanner to composeui and camerax
* migrate sc start/stop/switch to compose
* migrate TaskerActivity to composeui
* migrate UrlSchemeActivity to composeui
* migrate UserAsset to composeui
* migrate ServerActivity to composeui
* migrate ServerCustomConfigActivity to composeui
* migrate ServerGroupActivity to composeui
* migrate ServerProxyChainActivity to composeui
* migrate SettingsActivity to composeui
* migrate SubEdit/SubSetting Activity to composeui
* migrate routingEdit/routingSetting Activity to composeui
* migrate MainActivity to composeui
* clode clean and chore change
* Fix
* add scrollbar
* fix imePadding
* fix FormDropdownField scrollbar and ime conflict
* update servercostomconfigactivity with linenum and scrollbar
* fix AppPickerActivity filter wrong toogle
* fix App theme xml
* fix scrollbar not work in SettingsActivity
* final inset
* fix servercustomconfigactivity when open not begin line
* try optimize mainactivity performance
* use launch intent and fix not refresh when second edit use equals
* fix a ghost error
* update string
* update miss string
* optimize mainactivity and mainviewmodel
---------
Co-authored-by: 2dust <31833384+2dust@users.noreply.github.com>
Bump AGP to 9.2.0 in gradle/libs.versions.toml and update Gradle wrapper distribution to gradle-9.4.1 in gradle/wrapper/gradle-wrapper.properties. Keeps the build tooling up to date to take advantage of Gradle/AGP fixes and improvements.
Co-Authored-By: Copilot <198982749+Copilot@users.noreply.github.com>
Upgraded Android Gradle Plugin version from 8.13.2 to 9.0.0 in libs.versions.toml. Added and updated several Android and Kotlin build properties in gradle.properties to refine build behavior and feature flags.
* Add unit tests for ShadowsocksFmt protocol formatter
- Add comprehensive test coverage for Shadowsocks URL parsing
- Test SIP002 format (modern) with base64 encoded userinfo
- Test legacy format with full base64 encoding
- Test URI generation and round-trip consistency
- Cover edge cases: IPv6 addresses, empty remarks, various encryption methods
- Mock Android Base64 and Log classes for unit test execution
* Adding URL decoding before Base64 decoding. The flow is now: extract → URL decode → Base64 decode.
* Fix test naming convention to match project standards
Change test method names from backtick-delimited descriptive names
to underscore-separated format with test_ prefix to align with
existing project conventions (e.g., test_parseInt in UtilsTest).
Before: `parseSip002 valid URL with base64 encoded userinfo`()
After: test_parseSip002_validUrlWithBase64EncodedUserinfo()
* Fix Base64 mock to properly handle encoding flags
The mock now inspects the flags parameter and applies URL-safe
encoding and padding removal conditionally based on actual flag
values (URL_SAFE, NO_PADDING) instead of unconditionally using
withoutPadding().
* Fix Base64 decode mock to propagate exceptions
The mock now properly handles the URL_SAFE flag and propagates
exceptions on invalid input instead of silently returning an
empty ByteArray. This matches Android's actual Base64 behavior
where IllegalArgumentException is thrown on invalid input.
* Extract helper functions to reduce code duplication
Add createSip002Url() and createLegacyUrl() helper functions to
centralize URL construction logic. Add SS_SCHEME constant to
avoid magic strings. This improves maintainability by reducing
repeated Base64 encoding and URL construction patterns.
* Add URI format verification before extracting base64
Verify that toUri() returns a URI string without the scheme
prefix before extracting the base64 content. This ensures the
test correctly validates the URI format and prevents incorrect
data extraction if the implementation changes.
* Add scheme verification in round-trip test
Explicitly verify that toUri() returns a URI string without the
scheme prefix before prepending it. This documents the expected
behavior and ensures the test fails gracefully if the
implementation changes.
* mockito-inline version 6.1.0 does not exist
- The latest available version is 5.2.0 (released March 2023)
- The mockito-inline artifact was effectively deprecated after 5.2.0; mocking final classes is now built into mockito-core since Mockito 5.x
Replaces the group tab and server list RecyclerView in MainActivity with a ViewPager2-based implementation using fragments. Adds GroupPagerAdapter and GroupServerFragment for per-group server lists, introduces BaseFragment for fragment view binding, and updates related logic in MainViewModel and SettingsChangeManager. Updates dependencies to include ViewPager2 and Fragment KTX, and modifies layouts to support the new structure.
Introduces a new BackupActivity for configuration backup and restore, supporting both local storage and WebDAV servers. Adds WebDavManager and WebDavConfig for handling WebDAV operations, updates the navigation drawer and menu, and refactors AboutActivity to remove backup/restore logic. Includes new layouts and string resources for backup options and WebDAV settings.
v1.3.14 / 2025-05-13
This is a Long Term Support (LTS) release.
This is a hot-fix release for Android/iOS/macOS users. So it is only available on Maven Central and CocoaPods.
Android
Support 16K pagesize.
Fix a potential log callback OOM crash.
Upgrade to NDK r28.1 to have full support of 16K pagesize.
iOS
Retain the callback handler to prevent a potential short-lived callback handler from crashing.
* Update kotlin version to 2.1.20
Update kotlin version to 2.1.20
* Update kotlin version to 2.1.20
Update kotlin version to 2.1.20
* Update gradle-wrapper.properties